Buat mode baris perintah ketikkan <Esc> dan perintah Ctrl

11

Bayangkan Anda ingin mengutip kata di bawah ini. Jika |posisi kursor Anda dapat dengan mudah mengutip kata cw""<Esc>Pdari dari mode Normal.

|below

Saya ingin mencapai perilaku yang sama dalam mode Command-line. Pertanyaan saya adalah bagaimana saya bisa mengatakan ke mode Command-line bahwa saya ingin mengetikkan <Esc>. Saya mencoba :norm cw""<Esc>Pdan beberapa variasi lain tetapi saya hanya mendapatkan ""<Esc>Pbukan "below".

Masih terkait dengan ini, saya ingin tahu bagaimana saya bisa membuat jenis perintah Command-line mode Ctrl. Sebagai contoh, saya dapat mengutip kata tersebut di atas cw"<C-r>""<Esc>sebagai gantinya. Tapi kemudian saya akan perlu baris perintah untuk mengetik <C-r>untuk saya. Bagaimana saya bisa melakukan ini?

Gonçalo Ribeiro
sumber
1
Sama seperti ada <C-x><C-e>di readline untuk mengedit baris perintah di $EDITOR, Anda harus <C-f>di Vim untuk membuka jendela baris perintah. Lihat :help cmdline-window.
romainl

Jawaban:

11

<C-v>adalah apa yang kamu cari. Ini memungkinkan Anda untuk memasukkan karakter literal (mis., Literal Escalih-alih string "Esc") tanpa mengharuskan Anda melarikan diri dari apa pun.

:norm cw""<C-v><Esc>P

ditampilkan sebagai:

:norm cw""^[P

dan akan melakukan apa yang Anda inginkan (yaitu, kutip kata). Anda juga dapat menggunakan ini dengan <C-?>pemetaan lainnya . Misalnya, permintaan kedua Anda:

:norm cw"<C-v><C-r>""

ditampilkan sebagai:

:norm cw"^R""

Dan akan menghasilkan sama seperti di atas. Tidak perlu memasukkan ekstra Escdi akhir.

Zach Ingbretsen
sumber
10

Ini karena kunci khusus seperti <Esc>tidak diterjemahkan dalam normalperintah, dan diperlakukan seperti Anda menekan <Esc>. Untuk memperbaiki ini, Anda dapat menggunakan execperintah. Seperti itu:

:exec "norm cw\"\"\<Esc>P"

Perhatikan bahwa Anda harus meletakkan garis miring terbalik sebelum tanda kutip dan <Esc>, dan menggunakan tanda kutip tunggal sebagai ganti tanda kutip ganda tidak akan berfungsi.

Pohon cemara
sumber
Apakah ini berfungsi untuk perintah Ctrl juga? Bagaimana saya harus menuliskannya dalam perintah?
Gonçalo Ribeiro
Ya, itu seharusnya berhasil. Anda dapat menulisnya seperti ini:"\<C-{insert key}>"
EvergreenTree
2

Mode baris perintah berbeda; Anda tidak dapat menggunakan perintah pengeditan (mode normal) yang sama di sana. Anda dapat menemukan daftar perintah di :help c_CTRL-V.

Sekarang, ada jendela baris perintah ( :help command-line-window), yang dapat dimasukkan melalui q:dari mode normal dan <C-F>dari baris perintah. Dalam bahwa jendela, Anda dapat menggunakan semua perintah normal dan pemetaan, sehingga akan menjadi pilihan 1.

Opsi 2 adalah pemetaan khusus untuk mode baris perintah. Seperti yang saya katakan, Anda tidak dapat menggunakan pendekatan via :normalet al. Kunci untuk mendefinisikannya adalah :help c_CTRL-\_epemetaan, yang "mengevaluasi [s] {expr} dan mengganti [s] seluruh baris perintah dengan hasilnya." Berikut adalah contoh sederhana yang hanya berfungsi dengan benar di akhir baris perintah:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>
Ingo Karkat
sumber
1
Saya tidak berpikir OP dimaksudkan untuk membuat pemetaan untuk baris perintah, tetapi untuk melakukan pemetaan dari baris perintah.
EvergreenTree