假設我有以下輸入,如下所示。我想做的是在視覺上選擇第 2 到 4 行(shift v),然后洗掉單詞 dog。
我怎樣才能做到這一點?我知道我可以在我的選擇中使用類似的東西:s/dog//,但我想知道是否有更直接的方法。
1 The quick brown dog
2 dog jumps
3 over the
4 lazy dog,
5 but it should be just a fox.
最終輸出應該是(僅受第 2 到 4 行的視覺選擇影響):
1 The quick brown dog
2 jumps
3 over the
4 lazy ,
5 but it should be just a fox.
uj5u.com熱心網友回復:
這不可能。
為什么?
tl;博士
我認為,您正在設想視覺模式中的正常模式(這樣您可以在視覺模式下“像在 Vim 中一樣移動和洗掉”)。這樣的事情是不存在的。
想一想:如果您在視覺上選擇了一些線條,那么這些線條,而不是其他,是您接下來執行的任何操作的物件(d、s、c或其他)。
但是您不想對那些視覺選擇的行執行操作,而是對其中的單詞執行操作。但是你怎么能告訴 Vim 對dog而不是其他詞采取行動呢?您可以通過移動來做到這一點,但只要您處于視覺模式,這是不可能的,因為任何移動都只會改變視覺選擇,并且不允許您以某種方式在其中移動。
這意味著您需要放棄視覺選擇,以便您可以移動到這些單詞并將它們用作動作的文本物件。
如果你真的想從視覺選擇開始,那么給出你想要對dog采取行動的資訊的唯一方法是在你處于視覺模式時輸入它們。這正是該:s方法的作用。
uj5u.com熱心網友回復:
您可以利用標記'<和'>:它們存盤視覺選擇的開始/結束位置,并在您退出視覺模式后保持其值。
在命令列模式下,Ctrl-RCtrl-W插入游標下的單詞。
通過結合它,您可以創建這樣的映射:
noremap <c-d> :'<,'>s/<c-r><c-w>//<cr>
然后使用它:
V首先用;選擇想要的區域- 點擊Esc退出視覺模式;
- 將游標移到要洗掉的單詞下方;
- 然后觸發映射,在這個例子Ctrl-D中。
uj5u.com熱心網友回復:
我認為沒有辦法只用視覺選擇替換特定行中的特定單詞。您也可以使用sed它(查看#5)。
無論如何:這里有 4 種洗掉檔案中單詞 dog 的方法和一種方法sed:
1(帶視覺模式):
- 鍵入
v以進入視覺字符模式 - 強調
dog - 按 d 洗掉
2(有替代和確認):
:%s/dog//gc
g代表全球
c代表確認
您將被詢問每個條目,如何處理。
3(有替代品):
:2,4s/dog//
4(帶搜索模式):
/dog
型別:n下一場比賽
型別:d用于洗掉匹配
欲了解更多資訊:搜索和替換
5(帶
sed):
sed 2,4\s/dog// filename
uj5u.com熱心網友回復:
當您處于可視模式時,按下會:自動在命令列中插入可視范圍,因此您之后使用的任何 Ex 命令都將在可視選擇的行上作業:
:變為:'<,'>,其中'<,'>是從視覺選擇的第一行開始到視覺選擇的最后一行結束的范圍。- 之后,您可以
s/dog<CR>(不需要)在每個選定的行上用任何內容//替換第一個。dog這實際上等同于做:2,4s/dog<CR>.
從語意的角度來看,:s/dog<CR>與內置功能“dog在當前視覺選擇中洗掉”一樣接近,因此,除非制作一個只會節省幾次擊鍵的假設自定義映射,否則您不太可能找到更“直截了當”的方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493733.html
上一篇:基于bash中特定列的排序錯誤
