Perhatian, vnoremapdan vmapbekerja dalam mode Visual DAN Pilih. Untuk memiliki pemetaan hanya dalam mode Visual, gunakan xmapdan xnoremap.
Benoit
Jawaban:
1628
remapadalah opsi yang membuat pemetaan bekerja secara rekursif. Secara default aktif dan saya sarankan Anda membiarkannya seperti itu. Sisanya adalah perintah pemetaan , dijelaskan di bawah ini:
:mapdan :noremapmerupakan versi rekursif dan non-rekursif dari berbagai perintah pemetaan. Apa itu artinya jika Anda melakukannya:
:map j gg
:map Q j
:noremap W j
jakan dipetakan ke gg. Qakan juga dipetakan ke gg, karena jakan diperluas untuk pemetaan rekursif. Wakan dipetakan ke j(dan tidak ke gg) karena jtidak akan diperluas untuk pemetaan non-rekursif.
Sekarang ingat bahwa Vim adalah editor modal . Ini memiliki mode normal , mode visual dan mode lainnya.
Untuk masing-masing set pemetaan ini, ada pemetaan yang berfungsi dalam mode normal, visual, pilih dan operator ( :mapdan :noremap), yang bekerja dalam mode normal ( :nmapdan :nnoremap), satu dalam mode visual ( :vmapdan :vnoremap) dan seterusnya.
Terima kasih atas jawaban anda! Juga, kapan digunakan rekursif, dan kapan digunakan non-rekursif?
Chetan
14
@ Chetan: Tergantung apa yang ingin Anda capai. Saya cenderung menggunakan non-rekursif lebih sering, tetapi jika Anda telah mendefinisikan pemetaan yang relatif rumit menggunakan non-rekursif dan apa pemetaan lain yang melakukan semua yang dilakukan pemetaan pertama dan banyak lagi, akan lebih mudah untuk menggunakan pemetaan rekursif yang mencakup yang asli daripada mengetik ulang seluruh yang non-rekursif lagi (terutama jika Anda kemudian perlu mengubah yang asli).
DrAl
10
Saya berasumsi noremapada yang bertolak belakang map. Maksud saya sesuatu yang menghilangkan pemetaan. Terima kasih atas jawabannya. Itu mengklarifikasi saya
Pavan Manjunath
4
Ini tidak begitu penting untuk sebagian besar kasus penggunaan, tetapi harus dicatat bahwa :map, dll tidak bekerja di semua mode, tepatnya, hanya semua yang umum (khususnya, mode normal, mode visual, mode pilih, dan mode operator-pending). Jika Anda ingin pemetaan berfungsi dalam mode insert, command-line, atau lang-arg, Anda perlu menggunakan :map!, dll. (Sumber: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows
3
@whytheq noremap = pemetaan non-rekursif
Dan Bechard
281
Saya pikir dokumentasi Vim seharusnya menjelaskan arti di balik penamaan perintah ini. Memberitahu Anda apa yang mereka lakukan tidak membantu Anda mengingat namanya.
mapadalah "root" dari semua perintah pemetaan rekursif. Formulir root berlaku untuk mode "normal", "visual + select", dan "menunggu operator". (Saya menggunakan istilah "root" seperti dalam linguistik .)
noremapadalah "root" dari semua perintah pemetaan non-rekursif. Formulir root berlaku untuk mode yang sama dengan map. (Pikirkan noreawalan yang berarti "non-rekursif".)
(Perhatikan bahwa ada juga !mode seperti map!itu yang berlaku untuk menyisipkan & baris perintah.)
Lihat di bawah untuk arti "rekursif" dalam konteks ini.
Mempertahankan huruf mode seperti nmemodifikasi mode pemetaan bekerja. Ini dapat memilih subset dari daftar mode yang berlaku (misalnya hanya "visual"), atau memilih mode lain yang maptidak berlaku (misalnya "masukkan").
Gunakan help map-modesakan menunjukkan kepada Anda beberapa tabel yang menjelaskan bagaimana mengontrol mode pemetaan yang berlaku.
Huruf mode:
n: hanya normal
v: visual dan pilih
o: menunggu operator
x: hanya visual
s: pilih saja
i: memasukkan
c: garis komando
l: masukkan, command-line, regexp-search (dan lainnya. Secara kolektif disebut "Lang-Arg" mode semu)
" Rekursif " berarti pemetaan diperluas ke hasil, kemudian hasilnya diperluas ke hasil lain, dan seterusnya.
Ekspansi berhenti ketika salah satu dari ini benar:
hasilnya tidak lagi dipetakan ke hal lain.
pemetaan non-rekursif telah diterapkan (yaitu "noremap" [atau salah satu dari sejenisnya] adalah ekspansi terakhir).
Pada titik itu, "makna" default Vim dari hasil akhir diterapkan / dieksekusi.
" Non-rekursif " berarti pemetaan hanya diperluas sekali, dan hasilnya diterapkan / dijalankan.
Contoh:
nmap K H
nnoremap H G
nnoremap G gg
Penyebab di atas Kuntuk memperluas ke H, lalu Huntuk memperluas ke Gdan berhenti. Itu berhenti karena nnoremap, yang mengembang dan berhenti segera. Arti dari Gakan dieksekusi (yaitu "melompat ke baris terakhir"). Paling-paling satu pemetaan non-rekursif akan diterapkan dalam rantai ekspansi (itu akan menjadi ekspansi terakhir yang terjadi).
Pemetaan Guntuk gghanya berlaku jika Anda menekan G, tetapi tidak jika Anda menekan K. Pemetaan ini tidak memengaruhi pengepresan Kterlepas dari apakah Gdipetakan secara rekursif atau tidak, karena jalur 2 yang menyebabkan ekspansi Kberhenti, sehingga saluran 3 tidak akan digunakan.
Hati-hati !! command modeadalah nama historis lain untuk normal modeyaitu. bab 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). Singkatan 'c' adalah untuk 'command-line'. Dengan kata lain, secara default: memetakan lhs ke rhs map! lhs rhssecara rekursif untuk mode insert + command-LINE . Itu kecuali remapopsi default dinonaktifkan secara eksplisit dengan set noremap[!]di ~ / .vimrc. Dalam hal ini pemetaan tidak akan bersifat rekursif (tidak disarankan).
vnoremap
danvmap
bekerja dalam mode Visual DAN Pilih. Untuk memiliki pemetaan hanya dalam mode Visual, gunakanxmap
danxnoremap
.Jawaban:
remap
adalah opsi yang membuat pemetaan bekerja secara rekursif. Secara default aktif dan saya sarankan Anda membiarkannya seperti itu. Sisanya adalah perintah pemetaan , dijelaskan di bawah ini::map
dan:noremap
merupakan versi rekursif dan non-rekursif dari berbagai perintah pemetaan. Apa itu artinya jika Anda melakukannya:j
akan dipetakan kegg
.Q
akan juga dipetakan kegg
, karenaj
akan diperluas untuk pemetaan rekursif.W
akan dipetakan kej
(dan tidak kegg
) karenaj
tidak akan diperluas untuk pemetaan non-rekursif.Sekarang ingat bahwa Vim adalah editor modal . Ini memiliki mode normal , mode visual dan mode lainnya.
Untuk masing-masing set pemetaan ini, ada pemetaan yang berfungsi dalam mode normal, visual, pilih dan operator (
:map
dan:noremap
), yang bekerja dalam mode normal (:nmap
dan:nnoremap
), satu dalam mode visual (:vmap
dan:vnoremap
) dan seterusnya.Untuk panduan lebih lanjut tentang ini, lihat:
sumber
noremap
ada yang bertolak belakangmap
. Maksud saya sesuatu yang menghilangkan pemetaan. Terima kasih atas jawabannya. Itu mengklarifikasi saya:map
, dll tidak bekerja di semua mode, tepatnya, hanya semua yang umum (khususnya, mode normal, mode visual, mode pilih, dan mode operator-pending). Jika Anda ingin pemetaan berfungsi dalam mode insert, command-line, atau lang-arg, Anda perlu menggunakan:map!
, dll. (Sumber: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )Saya pikir dokumentasi Vim seharusnya menjelaskan arti di balik penamaan perintah ini. Memberitahu Anda apa yang mereka lakukan tidak membantu Anda mengingat namanya.
map
adalah "root" dari semua perintah pemetaan rekursif. Formulir root berlaku untuk mode "normal", "visual + select", dan "menunggu operator". (Saya menggunakan istilah "root" seperti dalam linguistik .)noremap
adalah "root" dari semua perintah pemetaan non-rekursif. Formulir root berlaku untuk mode yang sama denganmap
. (Pikirkannore
awalan yang berarti "non-rekursif".)(Perhatikan bahwa ada juga
!
mode sepertimap!
itu yang berlaku untuk menyisipkan & baris perintah.)Lihat di bawah untuk arti "rekursif" dalam konteks ini.
Mempertahankan huruf mode seperti
n
memodifikasi mode pemetaan bekerja. Ini dapat memilih subset dari daftar mode yang berlaku (misalnya hanya "visual"), atau memilih mode lain yangmap
tidak berlaku (misalnya "masukkan").Gunakan
help map-modes
akan menunjukkan kepada Anda beberapa tabel yang menjelaskan bagaimana mengontrol mode pemetaan yang berlaku.Huruf mode:
n
: hanya normalv
: visual dan piliho
: menunggu operatorx
: hanya visuals
: pilih sajai
: memasukkanc
: garis komandol
: masukkan, command-line, regexp-search (dan lainnya. Secara kolektif disebut "Lang-Arg" mode semu)" Rekursif " berarti pemetaan diperluas ke hasil, kemudian hasilnya diperluas ke hasil lain, dan seterusnya.
Ekspansi berhenti ketika salah satu dari ini benar:
Pada titik itu, "makna" default Vim dari hasil akhir diterapkan / dieksekusi.
" Non-rekursif " berarti pemetaan hanya diperluas sekali, dan hasilnya diterapkan / dijalankan.
Contoh:
Penyebab di atas
K
untuk memperluas keH
, laluH
untuk memperluas keG
dan berhenti. Itu berhenti karenannoremap
, yang mengembang dan berhenti segera. Arti dariG
akan dieksekusi (yaitu "melompat ke baris terakhir"). Paling-paling satu pemetaan non-rekursif akan diterapkan dalam rantai ekspansi (itu akan menjadi ekspansi terakhir yang terjadi).Pemetaan
G
untukgg
hanya berlaku jika Anda menekanG
, tetapi tidak jika Anda menekanK
. Pemetaan ini tidak memengaruhi pengepresanK
terlepas dari apakahG
dipetakan secara rekursif atau tidak, karena jalur 2 yang menyebabkan ekspansiK
berhenti, sehingga saluran 3 tidak akan digunakan.sumber
map
hanya berlaku untuk mode normal, visual, pilih, dan menunggu operator, tidak untuk semua mode.Salah satu perbedaannya adalah:
:map
tidaknvo
== normal + (visual + pilih) + operator tertunda:map!
tidakic
== masukkan + mode baris perintahseperti yang tertera pada
help map-modes
tabel.Jadi:
map
tidak memetakan ke semua mode .Untuk memetakan ke semua mode, Anda membutuhkan keduanya
:map
dan:map!
.sumber
command mode
adalah nama historis lain untuknormal mode
yaitu. bab 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). Singkatan 'c' adalah untuk 'command-line'. Dengan kata lain, secara default: memetakan lhs ke rhsmap! lhs rhs
secara rekursif untuk mode insert + command-LINE . Itu kecualiremap
opsi default dinonaktifkan secara eksplisit denganset noremap[!]
di ~ / .vimrc. Dalam hal ini pemetaan tidak akan bersifat rekursif (tidak disarankan).