私は比較的正確なタイピストですが、Vimでキャリッジリターンをヒットするときに、アポストロフィ文字を壁にぶつけるのはよくある間違いです。:w<CR>
これは、またはを入力しようとしているときに特に発生しwq<CR>
ます。結局、入力する:w'<CR>
か、さらに悪いことに:wq'<CR>
、意図したことを実行しないことに加えて、いくつかの大きな赤いエラーメッセージが表示されます。これを克服するために使用できるマッピングまたは他の技術はありますか?なぜ私がという名前のファイルを書きたいのか想像できない'
ので、その可能性を完全にブロックすることについては心配していません。
4 に答える
あなたはただすることができますcnoremap '<cr> <cr>
。コマンドモードコマンドがで終わることは何度も想像できません'
。通常、引用符が必要な場合は、二重引用符を使用します。ある場合は、Enterキーを押す前に1秒待ってください''<bs><cr>
。
コマンドマッピング(および略語)の使用には注意する必要があります。たとえば、検索中やコマンド引数の途中など、想定されていないときに起動することがよくあります。私は通常、式の省略形を使用することを好みます。
あなたの中に以下を入れてください~/.vimrc
:
cnoreabbrev <expr> w getcmdtype() == ':' && getcmdline() ==# 'w' ? 'w' . EatChar("'") : 'w'
cnoreabbrev <expr> wq getcmdtype() == ':' && getcmdline() ==# 'wq' ? 'wq' . EatChar("'") : 'wq'
function! EatChar(pat)
let c = nr2char(getchar(0))
return (c =~ a:pat) ? '' : c
endfunction
この省略形はEatChar
、省略形が展開された後に「食べられる」または無視されるパターンをとるという関数を使用します。:helpg Eatchar
その使用法の別の例については、を参照してください。
略語は、次のすべての基準が満たされた場合にのみ拡張され、見積もりを「食べる」ように見えます。
- 通常のexモードです:
getcmdtype() == ':'
- コマンドの開始時:
getcmdline() ==# 'w'
それ以外の場合、略語は{lhs}
iew
またはwq
このアプローチのデメリット:
- 式の省略形にはvim7+が必要です
- なんらかの理由で本当に入力したい
:w'
場合は、引用符を2回入力する必要があります。スペースを使用してコマンドをファイル名から区切るか、Ctrl+を入力してからv続けて入力します。' - 太った運指のシナリオごとに追加の略語を作成する必要があります
詳細については、以下を参照してください。
:h abbreviations
:h :map-<expr>
:h getcmdtype(
:h getcmdline(
:helpg Eatchar
回避策は次のとおりです。
cnoremap w'<CR> w<CR>
cnoremap wq'<CR> wq<CR>
これにより、コマンドモードマッピングが作成され、誤ったコマンドが意図したものに変換されます。ただし、2つの欠点があります。
- これは、アポストロフィを他の文字の直後に入力する必要があることを意味します。一時停止があり、その後キーを探しEnterてアポストロフィキーを押すと、同じ問題が発生します。
- その間、Vimがアポストロフィを入力する時間を与えている間、カーソルは進みません(これはマッピングの一般的な動作です)。あなたが入力しているコマンドを見ている人なら、これは他の方法であなたを混乱させる可能性があります。
私はこれがあなたが求めていた正確な答えではないことを知っていますが、私はあなたのために別の解決策を持っているかもしれません。
あなたの場合、あなたはファイルを保存し、保存して終了することについて質問しています。たぶん、これらのタスクを実行するために他の方法の1つを使用すると、うまくいくでしょう。
ZZ変更された場合はファイルを保存してからウィンドウを終了します。
ファイルを保存するために、押す必要のあるキーの数を減らすリーダーコマンドを作成しました
nnoremap <silent> <leader><leader> :write<cr>
ファイルを保存するには、リーダーキーを2回押すだけです。私のリーダーは,です。ヒット,,するだけでファイルが保存されます。