2013-01-04 24 views
9

當我嘗試在vim中使用塊選擇嘗試刪除行時,出現異常行爲。在vim中使用塊選擇從行尾刪除

所以我們可以說我有一個文本這樣:

delete this char:x 
and this:x 
also this:x 
and then this:x 
lastly this:x 

如果我要追加y到每一行,我可以:

  • 開始塊選擇與了Cv
  • 選擇所有與4j
  • 行與$
  • 開始與A
  • 鍵入所需的文本附加y

爲了得到:

delete this char:xy 
and this:xy 
also this:xy 
and then this:xy 
lastly this:xy 

但如果我嘗試在最後一步刪除x,而不是附加的我會期望得到:

delete this char: 
and this: 
also this: 
and then this: 
lastly this: 

雖然我結束了:

delete this char: 
and this:x: 
also this:x: 
and then this:x: 
lastly this:x: 

據我瞭解它附加在第一線,所有其它線路的最後一個字符(在這種情況下:),而不是刪除缺少的(在這種情況下x) 。

我可以用宏或替代品做到這一點,但我不太明白這種行爲背後的原因。有沒有辦法通過塊選擇來做到這一點?

+0

我不明白你所描述的行爲。第一個'x'被刪除,但沒有添加任何內容。 – romainl

+0

@romainl你是否在使用問題中的相同示例?如果你正在使用'delete this char:x'和刪除'x',它會添加尾部空格,這可能很容易錯過。 – none

+0

不,我可以看到拖尾空格罰款,沒有。在這種情況下,' {移動} $ A',移除字符不會在選擇的每一行上完成。只有添加字符的作品。這有點短視,如果你想要我的意見,但這是它的設計。在一系列行的末尾刪除'x'通常用':'<,'>標準$ x'或':'<,'> s/x $ //'完成。 – romainl

回答

5

$C-v4jx

  1. $
  2. 結束線的切換視覺塊C-v
  3. 下去(你的情況4X)4j
  4. 刪除的東西與x

編輯

,可以用簡單的宏來完成(對任意縮進您的評論反應)。宏不那麼難,你可以認爲:

  1. 開始錄製宏,我們將其命名爲「A」,所以qa
  2. 去行$
  3. 結束刪除一個字符x
  4. 走下來一個符合j
  5. 結束我們的宏觀q

現在應用我們的宏:[email protected] - 將執行您在錄製宏時所做的相同操作,即20x。

+0

這工作,但我需要的東西,可以與任意縮進工作。我已編輯相應的問題。 – none

+0

宏解決方案的問題是我必須計算我需要修改的行。 – Jaakko

4

如果我有一個小的行數我通常做一個backsapceESC。然後重複做j直到完成。不是最快的方式,但容易記住。

對於大量的行我通常在視覺上通過V選擇線然後做一個取代或上的範圍內的通常的命令。

:'<,'>s/.$// 
:'<,'>norm $x 

注意:您不必鍵入'<,'>。當您通過視覺選擇某些文本時,它會自動插入。

替代命令非常簡單,匹配最後一個字符(.$),然後將其替換爲空。

正常的命令就是你將如何在正常模式下通過$X刪除最後一個字符爲單行,除了將其應用到範圍內的每一行。

如需更多幫助,請參見:

:h range 
:h :s 
:h :norm 
+1

+1對於'j.'解決方案 – none

+0

如果你把它變成一個宏,你可以重複它的任意次數,例如。 '10 @'而不是'j.j.j.j.j.j.j.j.j.j.j.'(4個擊鍵而不是20個,加上記錄一個宏所需的3個額外部分('q '...'q'))。 –

2

像你說的你自己,實現自己的目標,還有其他的方式,其實更好的方法去。 :sq(macro):g/.../norm $x:s/.$//g非常簡單。

Ctrl-V不適合這份工作。至於其名稱:Visual BLOCK。你想刪除最後一個x,它們(只有x)不在一個塊中。

但是,如果你真的想堅持使用ctrl-v,你必須做一些額外的工作,才能在塊中創建'x'。如果您插件安裝對齊,您可以:

選擇(V)所有你想要做的伎倆線,

<leader>t: 

那麼你的文字是這樣的:

delete this char : x 
and this   : x 
also this  : x 
and then this : x 
lastly this  : x 

Ctrl-V刪除x,你應該知道如何去做。

然後

:%s/ *:/:/g 

之前去除填充空間「:」

不過,我不認爲這是一個很好的路要走。

+0

這些都很好,但都沒有像我一樣直觀。我想在放棄之前將問題留出一段時間,因爲我仍然覺得沒有理由阻止實現這樣的功能。 – none

8

你試過:{range}normal?這應該工作:

:'<,'>normal $x 

(該'<,'>位爲你填寫,當你鍵入

+0

我想一個解釋它對上述解決方案會很好。我試圖編輯一個,但被拒絕。 – Jaakko

+1

'{range}'在幫助文件中是非常常見的Vim白話。 'normal'是一個輸入以下內容的命令,就像您在普通模式下輸入內容一樣。所以總的來說,這個命令是爲每一行做的:去行尾然後刪除光標下的字符。 –