Mengapa saya mendapatkan kesalahan kutipan yang hilang saat menggunakan yang berikut ini dalam pemetaan menggunakan execute dan normal?

8

Perintahnya adalah

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

Jika Anda menekan <leader>;, Anda akan E114: Missing quote: "normal! mqA;\diikuti oleh E15: Invalid expression: "normal! mqA;\. Kenapa ini? Perintah berfungsi dengan baik jika input langsung ke baris perintah.

Perintah menambahkan a ;di akhir baris saat ini, tanpa mengubah posisi kursor.

Saya menyadari bahwa saya bisa melakukan nnoremap <leader>; mqA;<esc>`qyang berhasil, pertanyaannya adalah mengapa hal di atas tidak berhasil, dan apa yang dapat dilakukan untuk membuatnya bekerja dalam bentuk eksekusi-normal.

Dugaan saya adalah bahwa diperlukan beberapa tingkat pelarian bersarang, tetapi saya tidak dapat menemukan yang berfungsi.

Alice Ryhl
sumber

Jawaban:

9

Anda harus melarikan diri <melalui <lt>:

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

Catatan: ditambahkan <cr>untuk menjalankan perintah juga.

Namun ini dapat disederhanakan sedikit:

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

Menggunakan pemetaan ekspresi Anda dapat membuat pemetaan Anda bersyarat berdasarkan ;karakter trailing :

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

Untuk bantuan lebih lanjut lihat:

:h <lt>
:h map-<expr>
Peter Rincker
sumber
1
Dalam dokumentasi vim. lihat :h <>. Bagian yang relevan adalah: Notasi <> menggunakan <lt> untuk menghindari makna khusus dari nama-nama kunci. Menggunakan backslash juga berfungsi, tetapi hanya ketika 'cpoptions' tidak menyertakan flag 'B'. Jadi, jika Bflag tidak ada cpotions, Anda dapat menggunakan \<Esc>untuk mewakili <Esc>kunci.
jdhao
5

Anda harus keluar dari <ESC>mode perintah dalam. Ini dilakukan dengan awalan dengan <C-v>. Anda juga memerlukan trailing <CR>untuk benar-benar menjalankannya. Seperti ini:

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

Saya menemukan bahwa ada 3 cara untuk melarikan diri dari kunci:

  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>

Mirip dengan tombol Enter ( <cr>):

<c-v><cr>atau \<lt>cr>atau \r.

Jason
sumber
Selamat datang di Vi dan Vim !
D. Ben Knoble