2012-07-06 40 views
1

這是question about deleting every second line in a file的後續行爲。如何刪除隔行,加上選擇後粘貼刪除的結果?

如何做到這一點的Vim的:

之前(說這是一個文件的VISUAL選擇的一部分):

aaa 
bbb 
ccc 
ddd 
eee 
fff 

AFTER:

aaa 
ccc 
eee 
bbb 
ddd 
fff 

我該怎麼辦這個宏樣式(每隔一行刪除一行,但將已刪除的行存入緩衝區,以便刪除的行按順序粘貼)?另外,如果你可以在一個VISUAL選擇中做到這一點,那真的很方便(解析某個文件)!

回答

3

當線重新排序存在於緩衝器中的唯一的,運行 命令

:g/^/+m$ 

通常,當這些線與其他的文本包圍,一個可以 選擇的目標範圍行重新排序和運行

:exe"'<,'>g/^/+m"line("'>") 

或選擇所有的線重新排序,但他們的第一個和運行

:'<,'>-g/^/+m'<- 

在任何一種情況下,重新排序都可以在一次運行中高效完成。

+0

您擁有的第二個答案實際上是功能最齊全的。 – 2012-07-10 04:30:35

2
  1. 類型:let @e=''<CR>清空e寄存器(假設你不關心它以前的內容)。

  2. 將光標移到aaa

  3. 鍵入qa(或任何其他字母代替a)來記錄您的宏。

  4. 類型j"Edd下降一行並刪除它,而將它附加到e註冊。

  5. 類型q停止錄製

  6. 直觀地選擇了整個事情。

  7. 將宏應用於:'<,'>norm @a<CR>,這會刪除每隔一行。

  8. 類型"ep

+0

您正式滿意它是:一個宏,並使用視覺選擇,所以信用在這裏到期。 – 2012-07-09 03:30:30

+0

@KevinLee:另請參閱我的[答案](http://stackoverflow.com/a/11362919/254635)中提出的Ex命令;他們也爲視覺選擇工作。此外,Ex命令更具通用性,因爲它非易於交互使用(在映射或腳本中)。更不用說我提出的命令不會破壞寄存器的內容。 – 2012-07-09 03:51:34

+0

爲了記錄,我同意@ ib。的評論:我發現他的答案是針對手頭問題比我的更優雅和更智能的解決方案(通常情況下)。 – romainl 2012-07-09 05:58:39

2

你並不真的需要一個宏。

我們需要一個臨時寄存器來放置結果,比如寄存器e(如proposed by romainl)。

  1. 空寄存器(寄存器必須是空的,因爲我們要使用大寫寄存器,這意味着要追加,而不是覆蓋)
    :let @e=''ENTER
  2. 直觀地選擇面積上下工夫(即線aaa通過fff
  3. 刪除每秒線和追加該行註冊e
    :g/^/+d E
    現在,註冊e保存已刪除內容
  4. 貼寄存器e在你需要它使用"ep

討論

  • 我們需要使用它之前清空寄存器,因爲我們使用大寫寄存器,這意味着要追加到寄存器(見命名寄存器:he registers

  • :he :global去了解更多的令人難以置信的強大:g命令(它不是那麼有用的朋友:v

  • 實際答案的99%已經覆蓋that可惜沒接受但很好的回答你引用的問題。你唯一需要的延伸,是被刪除的行積累扔掉,而不是(確切:存儲在默認寄存器中的最後刪除的行)

+0

是的,鏈接命令的直接擴展可以很好地工作。然而,有一個Ex命令(呃,我已經構建了至少[two](http://stackoverflow.com/a/11362919/254635),事實上),在一次運行中完全解決了這個重新排序問題,而無需額外的相互作用。如果感興趣,請查看我的[答](http://stackoverflow.com/a/11362919/254635)。 – 2012-07-07 14:19:32

+0

感謝您的回答,這個變種比訴諸宏觀更「清潔」。 – 2012-07-09 03:31:07

+0

@KevinLee:這個答案只是試圖將我的答案延伸到鏈接的問題。爲了回答這個問題,我[構造](http://stackoverflow.com/a/11362919/254635)從頭開始的一個新的命令比使用這個擴展或宏更「乾淨」。 – 2012-07-09 03:55:56

2

試試這個命令:

:'<,'>g/^/+m$ 

它將將它們移動到文件末尾。然後你可以輕鬆地將它們移回去。

+0

感謝你和@eckes,我剛學過'+'技巧(':h search-offset')。這是一個美好的一天! – romainl 2012-07-06 08:13:02

+0

你正式在這裏贏得vim高爾夫!我不會說謊這是我會用的最多的 - 我把複選標記分配給romainl只是因爲我說我想要它'宏觀風格' – 2012-07-09 03:32:13

+0

@KevinLee:實際上,它沒有:這個命令部分解決了這個問題;您還應該計算將一半文本移回到應該位置所需的其他擊鍵。對於一個乾淨的,單一運行的解決方案,請參閱我的[答案](http://stackoverflow.com/a/11362919/254635)中提出的最後一條命令。 – 2012-07-09 03:44:35