Apa perbedaan antara perintah peta, noremap, singkatan dan noreabbrev?

19

Perintah-perintah ini mengubah satu set penekanan tombol ke yang lain dalam beberapa cara, tapi saya agak kabur di mana yang paling tepat untuk beberapa situasi. Selain itu, ada !varian mereka juga. Saat ini, penggunaan saya terhadap mereka cukup serampangan, jadi bisakah saya tahu apa jebakan yang terkait dengan masing-masing? Dalam catatan khusus tentang berbagai versi mode dapat berguna, karena saya belajar dari Peter Rincker dalam komentar yang cmapdapat berkembang cukup banyak di mana saja di baris dan tidak hanya ketika saya menggunakan :perintah. Peringatan apa yang bisa saya ambil terhadap jebakan potensial?

muru
sumber
Bagian selanjutnya adalah sedikit meta: Formulir mana yang harus kita gunakan saat menjawab di situs ini? - haruskah saya menanyakan ini di Meta, atau menambahkannya ke pertanyaan?
muru
Saya akan mengatakan itu tergantung. Saya akan selalu menggunakan versi noremap jika mendemonstrasikan pemetaan. Dengan cara ini, orang terbiasa menggunakan pemetaan non-rekursif atas versi rekursif. Kecuali tentu saja, ada alasan untuk menggunakan peta secara khusus, misalnya, dalam pemetaan <Plug>.
akshay

Jawaban:

21

Pertama, mapdan noremapserupa dalam hal masing-masing membuat pemetaan untuk mode normal, visual, pilih dan operator yang tertunda secara bersamaan . Vim merinci ini di :help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

Sesuai bantuan di atas, jika Anda ingin membatasi pemetaan ke mode tertentu, Anda harus menambahkan:

'n' (untuk normal), 'v' (untuk visual dan pilih), 'c' (untuk perintah), 'x' (untuk mode visual), 's' (untuk pilih), 'o' (untuk operator yang tertunda ).

Contohnya,

nmap n nzz

akan membuat mode normal, pemetaan rekursif n.

Sekarang, noremaphanya versi non-rekursif map.

Jadi apa itu pemetaan non-rekursif? Vim memiliki jawaban untuk itu juga, dengan :help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

Contohnya adalah pemetaan berikut ini:

:imap j k

:imap k j

Sekarang, vim akan mengganti j dengan k dan k dengan j berkali-kali, dan karenanya akan menunjukkan kepada Anda kesalahan bahwa Anda telah membuat pemetaan rekursif.

Inilah sebabnya mengapa umumnya disarankan agar Anda hampir selalu (kecuali ketika Anda memiliki <Plug>pemetaan atau serupa) menggunakan pemetaan non-rekursif. Ini mencegah Vim menggantung ketika Anda secara tidak sengaja membuat pemetaan rekursif. Oleh karena itu pemetaan non-rekursif adalah cara yang lebih aman untuk memetakan perintah di Vim.

Dengan informasi di atas, kita dapat melihat bahwa :noreabbrevitu hanyalah versi :abbrevperintah non-rekursif .

Anda :abbrevhanya dapat menggunakan mode insert, replace, dan command. :abbrevdigunakan untuk membuat singkatan, (alias pintasan yang dapat diperluas Vim). Perluasan singkat adalah menggunakan :map/ :noremapuntuk membuat pemetaan, :abbrev/ :noreabbrevuntuk membuat singkatan, atau setiap kali Anda ingin Vim memperluas pengetikan Anda.

akshay
sumber
1
Menghindari hang bukan satu-satunya alasan untuk menggunakan norebentuk - bentuk perintah peta. Alasan lain (dan menurut saya, yang lebih penting) untuk menggunakannya adalah membuat pemetaan Anda dapat diandalkan / dapat diprediksi. Jika Anda menggunakan formulir biasa dan rhsberisi kunci yang kebetulan dipetakan ke sesuatu yang lain, maka pemetaan Anda bisa memiliki perilaku yang sama sekali berbeda dari yang dimaksudkan.
Kaya