executeとnormalを使用したマッピングで以下を使用すると、引用符の欠落エラーが発生するのはなぜですか?


8

コマンドは

nnoremap <leader>; :execute "normal! mqA;\<esc>`q"

次にを押すと<leader>;、がE114: Missing quote: "normal! mqA;\続きますE15: Invalid expression: "normal! mqA;\。どうしてこれなの?コマンドラインに直接入力すると、コマンドは正常に機能します。

このコマンドは;、カーソル位置を変更せずに、現在の行の終わりにa を追加します。

私は私がnnoremap <leader>; mqA;<esc>`qどれが機能するかをただ実行できることを理解しています、問題は上記が機能しない理由、そしてそれを実行正規形で機能させるために何ができるかです。

私の推測では、ネストされたエスケープのある程度のレベルが必要ですが、うまくいくものを見つけることができませんでした。

回答:


9

<ビアをエスケープする必要があります<lt>

nnoremap <leader>; :execute "normal! mqA;\<lt>esc>`q"<cr>

注:<cr>コマンドも実行するために追加されました。

ただし、これはかなり簡略化できます。

nnoremap <leader>; mqA;<esc>`q

式マッピングを使用すると、末尾の;文字に基づいてマッピングを条件付きにすることができます。

nnoremap <expr> <leader>; getline('.') =~ ';$' ? '' : "mqA;\<esc>`q"

詳細については、以下を参照してください。

:h <lt>
:h map-<expr>

1
vimのドキュメント。参照してください:h <>。関連する部分は次のとおりです。<>表記は<lt>を使用して、キー名の特別な意味をエスケープします。バックスラッシュの使用も機能しますが、「cpoptions」に「B」フラグが含まれていない場合のみです。したがって、Bフラグがにない場合はcpotions、を使用\<Esc>して<Esc>キーを表すことができます。
jdhao

5

<ESC>コマンドモードでエスケープする必要があります。これは、接頭辞として<C-v><CR>実際に実行するには、トレーリングも必要です。このような:

nnoremap <silent> <leader>; :execute "normal! mqA;<C-v><ESC>`q"<CR>

0

キーをエスケープするには3つの方法があることがわかりました。

  1. nnoremap <silent> <leader>; :execute "normal! mqA;<C-v><esc>`q"<CR>
  2. nnoremap <silent> <leader>; :execute "normal! mqA;\<lt>esc>`q"<CR>
  3. nnoremap <silent> <leader>; :execute "normal! mqA;\e`q"<CR>

Enterキー(<cr>)も同様です。

<c-v><cr>または\<lt>cr>または\r


ViとVimへようこそ!
D.ベンノブル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.