5

Vimは素晴らしいですが、多くの人と同じように、コピー、削除、貼り付けを行うと、本当にイライラします。ヤンクバッファは削除アクションによって上書きされます。

これで、101の回避策とマッピングがあり、そのうちのいくつかは次のような投稿に列挙されていることがわかりました。最後のヤンクを上書きせずにvimで削除する方法はありますか?

しかし、これらのソリューションにはすべて欠点があります。私でさえ、バッファーの第一人者でした(私はそうではありません)。たとえば、過剰なキーストローク-私は通常xxxxで4文字をすばやく削除しますが(キーストロークを1回押したままにして自動リピートを待つだけです)、x、x、x、x、またはマッピングが何であれ、別のバッファーを使用する必要があります。

本当に理想的なのは、単にモードの切り替えです。これにより、D、d、X、およびxキーの副作用の動作のオンとオフを切り替えて、テキストをバッファーに交互に書き込むかどうかを切り替えることができます。そうすれば、「副作用なし」モードに入り、心ゆくまで削除して、準備ができたら貼り付けることができます。また、必要に応じて副作用を再度有効にします。

誰かがこれを行う方法を知っていますか?

[更新:解決策]わかりました:「副作用なし」モードを切り替える関数を作成しました...完全に機能します!以下の私の受け入れられた正解を参照してください

[更新#2]私のソリューションはまだうまく機能しており、多くの削除と貼り付けを行うときに常に使用しています。しかし、その間に、削除するテキストが連続している単純なケースのコピー、貼り付け、削除の特定のユースケースを満たすためのより軽い方法も見つけました。

通常どおりテキストをヤンクした後、vコマンドを使用して削除するテキストを視覚的に強調表示し、pコマンドを使用してテキストを貼り付けるだけです。これにより、特別なマッピングなしで目的の効果が得られます。

このワークフローの唯一の問題は、もう一度貼り付けたい場合、元の貼り付けバッファが強調表示されたテキストを貼り付ける動作によって上書きされることですが、この動作は.vimrcの次のマッピングで簡単に変更できます。

vnoremap p "_dp
vnoremap P "_dP
4

2 に答える 2

9

OK、わかりました。.vimrcのこのスクリプトを使用すると、「バッファの副作用なし」モードを効果的に切り替えることができます。これにより、「バッファの副作用なし」モードがアクティブになったときに、dキーとxキーがバッファを上書きしなくなります。

これを.vimrcに追加します

function! ToggleSideEffects()
    if mapcheck("dd", "n") == ""
        noremap dd "_dd
        noremap D "_D
        noremap d "_d
        noremap X "_X
        noremap x "_x
        echo 'side effects off'
    else
        unmap dd
        unmap D
        unmap d
        unmap X
        unmap x
        echo 'side effects on'
    endif
endfunction
nnoremap ,, :call ToggleSideEffects()<CR>

次に、このモードのオンとオフを切り替えるには、キーの組み合わせ、、(2つのコンマ)を使用します

于 2012-09-29T02:56:49.567 に答える
5

すべての削除/変更コマンドの副作用を「オフ」にしようとすることは、不可能ではないにしても、非常に難しいと思います。この状況を処理する基本的な方法:

  • 削除または変更コマンドでブラックホール("_)レジスタを使用します。例えば"_dd
  • "0貼り付けコマンドでは、最新のヤンクを含むレジスタを使用します。例えば"0p
  • 名前付きレジスタにテキストをヤンクします。例:"ayy後で"ap

"0pこれは私の心の働きに合っているので、私は個人的にアプローチに傾いています。

今、あなたがそのような回避策を求めていないのを見て、私は貼り付けコマンドを変更して私のいわゆるモードpaste_copynopaste_copyモードを切り替えるいくつかの機能を提供しました。nopaste_copyVimのデフォルトの動作です。あなたの中に以下を入れてください~/.vimrc

function! PasteCopy(cmd, mode)
  let reg = ""
  if exists('g:paste_copy') && g:paste_copy == 1 && v:register == '"'
    let reg = '"0'
  elseif v:register != '"'
    let reg = '"' . v:register
  endif
  let mode = ''
  if a:mode == 'v'
    let mode = 'gv'
  endif
  exe "norm! " . mode . reg . a:cmd
endfunction

command! -bar -nargs=0 TogglePasteCopy let g:paste_copy = exists('g:paste_copy') && g:paste_copy == 1 ? 0 : 1<bar>echo g:paste_copy ? '  paste_copy' : 'nopaste_copy'

nnoremap <silent> p :call PasteCopy('p', 'n')<cr>
nnoremap <silent> P :call PasteCopy('P', 'n')<cr>
nnoremap <silent> ]p :call PasteCopy(']p', 'n')<cr>
nnoremap <silent> [p :call PasteCopy('[p', 'n')<cr>
nnoremap <silent> ]P :call PasteCopy(']P', 'n')<cr>
nnoremap <silent> [P :call PasteCopy('[P', 'n')<cr>
vnoremap <silent> p :<c-u>call PasteCopy('p', 'v')<cr>
vnoremap <silent> P :<c-u>call PasteCopy('P', 'v')<cr>

を介してpaste_copyモードを切り替えることができます:TogglePasteCopy。あなたはそのようなマッピングを好むかもしれません

nnoremap <leader>tp :TogglePasteCopy<cr>

"0p最後のアドバイスとして、名前付きレジスターはvimにネイティブであり、心配する「モード」が1つ少ないため、このアプローチでは名前付きレジスターを使用または使用することを強くお勧めします。

于 2012-09-27T17:57:36.417 に答える