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.

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>

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>

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.


Selamat datang di Vi dan Vim !
D. Ben Knoble
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.