2010-05-24 61 views
14

我發現Vim的撤消過於粗糙。例如。如果我輸入這樣的內容:如何在Vim中獲得細粒度的撤消

a // to go into edit mode 
to be or not to ve 
<esc> // to exit insert mode 

糟糕!我犯了一個錯字。我想開始撤消,所以我按u,但它然後清除整條線。 有沒有一種方法可以逐字或逐字刪除?

回答

9

因此,當你從其他人看到你所要求的東西在Vi(AFAIK)中不存在。

撤消撤銷你最後一次操作的內容。如果您最後的操作是進入插入模式,然後添加一行,然後退出插入模式。這將被撤消,但是如果從默認模式下按下「x​​」鍵,則您將刪除1個字符,或者如果在選擇文本的可視模式下文本將被刪除。如果您點擊撤消,那麼您將恢復該字符或所選文字。

...你應該把它當作一個動作,如果你想刪除前一個單詞,那麼你應該能夠命中操作可以撤消原子或恢復

如前所述Ctrl + W和在保持插入模式時刪除前一個單詞。

如果您退出插入模式,您可以導航(運動)返回帶有「b」的單詞,帶有「w」的單詞轉到帶有「e」的單詞的末尾,並且可以剪切(使您處於插入模式)用「c」或用「d」刪除。這兩個動作剪切和刪除可以接受他們後面的動作,所以你可以用「dw」刪除當前單詞/到下一個單詞或用「cb」刪除前一個單詞

當你記得使用 」。」命令(在正常模式下)。該命令將重複最後一個操作。我已經多次用它來查找和替換一個文件中的一小部分文字(如果你對改變太多太偏執了,這特別有用)。該方案將是如下:

文件:

這是我的職位

實際上它是一個測試

這中間

這到底

如果我想用「was」替換「is」 「我可以這樣寫: %S/\ <是\ >/WAS/g的

但是如果我想改變的第一行和第三行‘是’‘是’(我不知道他們的行號,我想看看是否有其他地方我想改變是我可以鍵入 「/是」

命中「n」,直到我到達我想替換的地方,然後點擊「 cw「並輸入」was「 現在我可以點擊」n「,直到我到達另一個我想要替換的地方並點擊」。「,並且將用」was「替換」is「(注意:我的搜索字符串沒有限制到「是」這個詞,只是兩個字符「是」,所以「這個」&「這個」會匹配這個cas e)

+1

我喜歡將'c'命令看作_change_而不是_cut_。這更好地解釋了爲什麼它刪除受影響的文本後切換到編輯模式... – siegi 2014-07-06 09:35:45

10

不,這是不可能的,實際上也不是必需的。 Vim有一百萬種處理方式。例如,嘗試cb。或者bC。或brb。或Tspace跳回來代替b。或者ciw

可以,當然可以用最插入模式這些解決方案(按CTRLØ第一),或者綁定一個您最喜愛的組合鍵(:help map:help imap)。

+5

被撤消不是一個真正的解決方案這麼多告訴我,我的問題是錯誤的。 – MDCore 2010-05-24 08:59:12

+2

我寧願將此視爲解決您的問題的一種解決方案,即要刪除輸入的最後一個字。如果你的問題是關於使用撤消和撤消操作的話,你的答案是:不,不可能,這根本就沒有幫助。 – soulmerge 2010-05-24 09:23:43

+0

好的,我應該嘗試使用移動命令而不是鈍器撤消是有道理的。 – MDCore 2010-05-24 09:36:44

7

在Linux上,使用control-w而在輸入模式下刪除最後一個「單詞」。

+0

在OSX上很好用。問題:如何重做? – user456584 2013-05-23 22:52:30

+1

再次輸入。所以,不要輸入control-W,除非你的意思是... – 2013-05-23 23:15:35

+0

如果你想撤消這個,就像上面的2條評論提到那樣,然後退出插入模式並使用u來撤消。 – 2014-12-22 00:27:28

22

您可以通過:help i_ctrl-g_u打破undos。如果你想要每個角色都可以映射,但這可能有點複雜。將此映射到空間按鈕是一種方法。

:inoremap <Space> <Space><C-g>u 

之後的每一句話可以通過ü

+0

恕我直言,這個答案應該被接受;儘管這可能不是因爲演出遲到了,真可惜。我把它映射到'Space','Return'和'Tab',我對此非常滿意。 – mark 2011-06-19 10:21:19

+0

也可以考慮將它映射爲CTRL-U,它將刪除直到行首。 – idbrii 2013-03-09 20:46:00

+0

漂亮!我以大刪除操作爲目標:':inoremap u ',':inoremap u '。 – Andrew 2013-08-26 19:25:07