web-dev-qa-db-ja.com

vimに貼り付けたテキストのみを元に戻すにはどうすればよいですか?

TL; DR;バージョン-挿入モードに入ってから入力された他のテキストを元に戻さずに、OSコピーバッファーから貼り付けられたテキストを元に戻すにはどうすればよいですか?

より長い説明:

  1. OSコピーバッファに何かを入れます(たとえば、テキストを強調表示してCommand-c Macの場合)
  2. Vimで挿入モードに入る(i
  3. 何かを入力します(例:asdf
  4. 挿入モードを終了せずに、コピーバッファーからvimに貼り付けます(Command-v Macの場合)
  5. ヒットescape
  6. 貼り付けを元に戻してみてください(u

最後に挿入モードに入ったときからすべてを元に戻します。つまり、asdfに加えて貼り付けたすべてのテキストが消去されます。

どうすればちょうど貼り付けたテキストを元に戻すことができますか?貼り付けたテキストを元に戻すためだけに、テキストを貼り付ける前に、常に挿入モードを終了してから戻る必要がありますか?

10
Javid Jamae

1つの方法は、貼り付ける前に明示的にドロップアウトして挿入モードに戻すことです。貼り付けコマンドを拡張すると、貼り付けの前に元に戻すポイントを自動的に設定することもできます。

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

上記は組み込みのi_CTRL-Rコマンド。どうしたらいいのかわからないCommand-vはMacVimに実装されていますが、先頭に<C-G>uから:imapコマンドは同じ効果を達成するはずです。

4
Ingo Karkat

MacVimでは、ショートカットを上書きするためにEdit > Pasteメニュー項目のマップを解除する必要があります。その後、Cmd-V(MacVimの用語ではD-v)を各モードの適切なコマンドに再マップできます。これを~/.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は、元に戻す履歴を修正するために挿入モードでのみ必要です。 noremapcnoremapは、通常モードとコマンドモードでデフォルトの貼り付け動作を復元するためのものです。

ここで私を正しい方向に向けてくれたIngoKarkatに感謝します。

2
Sophie Alpert

実際の解決策は、コマンドモードに移動する必要があることです(例: Esc)最初に挿入モードに戻りますが、手動で入力した場合にのみ機能しますが、~/.vimrcでテストすると、「ランダムに」機能しなくなるようです。 Googleはまったく役に立ちません。

私はこの問題を修正するために多くの時間を費やしていますが、私の場合は理由を理解しています。

端末の既存の貼り付けキーと同じ貼り付けキーをマップしないでください

例えば Ctrl+Shift+V Konsoleターミナルに貼り付けますが、このキー<C-S-v>~/.vimrcに割り当てると、「複数の貼り付けではなく、単一の貼り付けのみを元に戻す」が機能しません。

私の場合、<C-v>の代わりに<C-S-v>を使用する必要があります。

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

ケースは異なる場合がありますが、要点は同じです。既存のターミナルエミュレータキーと競合する同じ貼り付けキーを割り当てないでください。

ターミナルペーストキーをに設定することで、この結論を100%証明しました Ctrl+V そして今、<C-v>は動作を停止しますが、<C-S-v>は動作します。

また、vimは感度が高すぎて奇妙であることに注意してください。正しいカーソル位置で機能させるには、iと2つの右キーを手動で使用する必要があることがわかりました。つまり、iと2つの右キーも~/.vimrcに配置する必要があります。ケースは異なる場合がありますが、要点は同じです。〜/.vimrcのキーと順序が手動で入力したものと100%一致していることを確認してください。

1
林果皞