在 vim 中撤銷貼上

在 vim 中撤銷貼上

我了解撤消和重做u以及Ctrl-r撤消和重做。但u帶我回到上次儲存的狀態。我想知道如何撤銷貼上cmd-v

例如,

I am typing here bla bla bla, [link to website](here I paste a wrong http link 
with cmd-v)

然後我想回到,

I am typing here bla bla bla, [link to website](

有什麼辦法可以在vim中做到這一點嗎?

提前致謝。

答案1

免責聲明:我完全不知道蘋果鍵盤如何使用 cmd 而不是 ctrl 與 vim 交互,因此您可能需要更改或微調其中的一些內容。

在vim中貼上的正確方法是使用命令p。要從系統剪貼簿貼上,您可以使用"*p.因此,標準的處理方式是離開插入模式"*paa當然,重新進入插入模式)。

如果您想在插入模式下使用鍵盤快捷鍵,那麼執行以下操作似乎很自然:

inoremap <c-v> <esc>"*pa

(也就是說:實際輸入其中的內容,而不是按 ctrl+v 並轉義)。

乍看之下似乎是這樣的應該提供您想要的行為——它只是自動執行我上面描述的標準貼上過程。但事實並非如此。 Vim 將指令的所有部分視為相同撤銷區塊的一部分,而 vim 插入模式本身就是一種指令。

但是,您可以在插入模式下使用 ctrl+g 手動啟動一個新的撤消塊u(是的,我知道,這個鍵和弦看起來不太像 vim,但就是這樣)。因此,您可以像這樣修改鍵重新映射:

inoremap <c-v> <c-g>u<esc>"*pa

所有這些都可以與 ctrl+v 一起使用(我剛剛在 Windows 上測試過它,並且至少在那裡可以工作),您可能需要<c-v>在 vim 中使用不同的東西(除了 )基於 cmd 的快捷方式。如果您使用的是 Apple 鍵盤,則表示 OSX——如果 cmd+v 是系統快捷方式,我不確定什麼會優先。一些膚淺的谷歌搜尋表明您可能需要擺弄一些操作系統級別的配置才能使 cmd 與 vim 一起正常工作。

答案2

在 MacVim 中,您需要取消Edit > Paste映射選單項目才能覆蓋快捷方式,然後您可以D-v在每種模式下將 Cmd-V (以 MacVim 的說法)重新映射到適當的命令。我將其添加到我的中~/.gvimrc,現在一切正常:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

僅在插入模式下才需要<C-g>u修正撤銷歷史記錄;和noremap只是cnoremap恢復正常模式和命令模式下的預設貼上行為。

感謝vilsoup 在這裡為我指明了正確的方向。

相關內容