Pertanyaan Apa perbedaan antara remap, noremap, nnoremap dan perintah pemetaan vnoremap di vim?


Apa perbedaan antara remap, noremap, nnoremap dan perintah pemetaan vnoremap di vim?


901
2017-09-23 07:13


asal


Jawaban:


remap adalah pilihan yang membuat pemetaan bekerja secara rekursif. Secara default sudah aktif dan saya sarankan Anda membiarkannya seperti itu. Sisanya perintah pemetaan, dijelaskan di bawah ini:

:map dan :noremap adalah rekursif dan tidak rekursif versi berbagai perintah pemetaan. Apa itu artinya jika Anda melakukannya:

:map j gg
:map Q j
:noremap W j

j akan dipetakan gg. Q akan juga dipetakan ke gg, karena j akan diperluas untuk pemetaan rekursif. W akan dipetakan j (dan tidak gg) karena j tidak akan diperluas untuk pemetaan non-rekursif.

Sekarang ingat bahwa Vim adalah a editor modal. Ia memiliki a normal mode, visual mode dan mode lainnya.

Untuk masing-masing set pemetaan ini, ada a pemetaan yang bekerja dalam mode normal, visual, pilih dan operator (:map dan :noremap), yang berfungsi dalam mode normal (:nmap dan :nnoremap), satu dalam mode visual (:vmap dan :vnoremap) dan seterusnya.

Untuk panduan lebih lanjut tentang ini, lihat:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

1324
2017-09-23 07:24



Saya pikir dokumentasi vim seharusnya menjelaskan arti di balik penamaan perintah-perintah ini. Memberi tahu Anda apa yang mereka lakukan tidak membantu Anda mengingat nama-nama itu.

map adalah "root" dari semua perintah pemetaan rekursif. Bentuk root berlaku untuk mode "normal", "visual + pilih", dan "operator-pending". (Saya menggunakan istilah "root" seperti pada ilmu bahasa.)

noremap adalah "root" dari semua perintah pemetaan non-rekursif. Bentuk akar berlaku untuk mode yang sama dengan map. (Pikirkan tentang nore awalan yang berarti "non-rekursif".)

(Perhatikan bahwa ada juga yang ! mode seperti map! yang berlaku untuk menyisipkan & baris perintah.)

Lihat di bawah untuk apa artinya "rekursif" dalam konteks ini.

Membuka kembali surat mode seperti n ubah mode yang digunakan pemetaan. Ini dapat memilih subkumpulan daftar mode yang berlaku (misalnya hanya "visual"), atau memilih mode lain yang map tidak akan berlaku (mis. "sisipkan").

Menggunakan help map-modes akan menunjukkan beberapa tabel yang menjelaskan cara mengontrol mode mana yang berlaku untuk pemetaan.

Huruf mode:

  • n: hanya normal
  • v: visual dan pilih
  • o: operator tertunda
  • x: hanya visual
  • s: pilih saja
  • i: memasukkan
  • c: garis komando
  • l: insert, command-line, regexp-search (dan lainnya. Secara kolektif disebut "Lang-Arg" pseudo-mode)

"Rekursif"Berarti pemetaan diperluas ke hasil, lalu hasilnya diperluas ke hasil lain, dan seterusnya.

Perluasan berhenti ketika salah satu dari ini benar:

  1. hasilnya tidak lagi dipetakan ke hal lain.
  2. pemetaan non-rekursif telah diterapkan (yaitu "noremap" [atau salah satu dari sejenisnya] adalah perluasan akhir).

Pada titik itu, "makna" default vim dari hasil akhir diterapkan / dijalankan.

"Tidak rekursif"Berarti pemetaan hanya diperluas satu kali, dan hasil itu diterapkan / dijalankan.

Contoh:

 nmap K H
 nnoremap H G
 nnoremap G gg

Penyebab di atas K untuk memperluas ke H, kemudian H untuk memperluas ke G dan berhenti. Itu berhenti karena nnoremap, yang meluas dan berhenti dengan segera. Arti dari G akan dieksekusi (yaitu "lompat ke baris terakhir"). Paling tidak satu pemetaan non-rekursif akan pernah diterapkan dalam rantai ekspansi (ini akan menjadi ekspansi terakhir yang terjadi).

Pemetaan G untuk gg hanya berlaku jika Anda menekan G, tetapi tidak jika Anda menekan K. Pemetaan ini tidak memengaruhi penekanan K terlepas dari apa pun G dipetakan secara rekursif atau tidak, karena itu baris 2 yang menyebabkan perluasan K untuk berhenti, jadi jalur 3 tidak akan digunakan.


210
2017-07-26 19:00



Peringatan, vnoremap dan vmap bekerja dalam mode Visual DAN Pilih. Untuk memiliki pemetaan hanya dalam mode Visual, gunakan xmap dan xnoremap.


69
2017-09-24 13:58



Satu perbedaannya adalah:

  • :map  tidak nvo == normal + (visual + pilih) + operator menunggu
  • :map! tidak ic  == sisipkan + mode baris perintah

sebagaimana dinyatakan pada help map-modes tabel.

Begitu: map tidak memetakan ke semua mode.

Untuk memetakan ke semua mode yang Anda butuhkan keduanya :map dan :map!.


17
2018-01-22 12:03