Bisakah saya memetakan tombol Alt di Vim?

90

Saya mencoba memetakan sebagai menambahkan baris di bawah ini ke .vimrc, tetapi tidak berhasil. Saya memeriksa .vimrc dimuat oleh Vim.

map <Alt-D> <C-D>

apakah ada kesalahan dalam pemetaan ini?

Thomson
sumber
Apakah Anda menggunakan vim di terminal, atau versi gui (gvim, macvim)?
Nick Knowlson
Perhatikan juga bahwa jika encodingperubahan Anda setelah pemetaan berjalan, apa yang Anda dapatkan dari tombol Alt mungkin tidak cocok dengan apa yang Anda tetapkan pada awalnya.
dash-tom-bang

Jawaban:

136

Untuk pengguna Mac di luar sana: untuk memetakan ALT + hjkl, gunakan karakter asli yang dihasilkan (cari tahu karakter mana yang menggunakan kombinasi saat dalam mode INSERT), misalnya dengan keyboard saya, saya mendapatkan:

<ALT+j> ==> ª
<ALT+k> ==> º

dan seterusnya. Solusi ditemukan di sini di StackOverflow.

Saya menggunakan ini untuk memindahkan baris ke atas dan ke bawah dengan ALT + k \ j, menggunakan ini di .vimrc saya:

nnoremap ª :m .+1<CR>==
nnoremap º :m .-2<CR>==

inoremap ª <Esc>:m .+1<CR>==gi
inoremap º <Esc>:m .-2<CR>==gi

vnoremap ª :m '>+1<CR>gv=gv
vnoremap º :m '<-2<CR>gv=gv

seperti yang dijelaskan di sini .

Semoga bermanfaat, selamat menikmati Vim :)

LAMPIRAN OLEH Dylan_Larkin (2019): Untuk ini bekerja pada Mac, " Gunakan Option sebagai Meta Key " harus diaktifkan OFF di Terminal-> Preferences> Keyboard

Bruno Belotti
sumber
10
Inilah tujuan saya datang ke sini (Alt + HJKL untuk memindahkan perpecahan)! Terima kasih!
Jamie Schembri
6
Cara mudah untuk mengetahui karakter apa itu, adalah dengan menggunakan cat. Cukup ketik catdan di dalam jendela kucing kombinasi tombol yang Anda inginkan. Menemukan bahwa alt + brackets adalah 'dan “di mac saya.
dvcrn
4
ini berfungsi dengan baik karena Alt + HJKL untuk bergerak di antara perpecahan, jari-jari saya menyukainya !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales
3
Pemetaan yang tepat ini mungkin tidak berfungsi seperti yang diharapkan di versi OSX mendatang. Gunakan sed -n luntuk melihat output <Ak> dan <Aj> sebelum Anda mengonfigurasi pemetaan. Dalam kasus saya <Aj> adalah dan <Ak> adalah˚
luk3thomas
4
Di macOS, saat mengatur Use Option as Meta Keyatau di profil iTerm ⌥ key to Esc+akan berperilaku seperti cara tradisional (seperti di Linux / Unix). Jadi Anda tidak perlu menyetel ke Vim peta <^[j>, cukup petakan ke <A+j>atau <M+j>dan itu berfungsi.
goetzc
40

:help key-notationmenjelaskan format apa yang perlu digunakan untuk memetakan kunci yang berbeda. Dalam kasus alt, Anda dapat menggunakan salah satu <A-atau <M-. Jadi pemetaan Anda akan menjadi

map <M-d> <C-d>

Saya juga merekomendasikan menggunakan norevarian :map(misalnya, noremap) kecuali Anda secara eksplisit ingin mengizinkan sisi kanan dievaluasi ulang untuk pemetaan.

jamessan
sumber
1
Ini masih belum berpengaruh. Input Alt + D masih memasukkan beberapa karakter aneh ke Vim.
Thomson
9
Itu masalah terpisah. Terminal Anda mengirimkan karakter multi-byte ke Vim dan Vim tidak tahu untuk menafsirkannya sebagai <A-d>. Anda mungkin perlu mengubah pengaturan terminal Anda agar mengirim <A-d>sebagai <Esc>d.
jamessan
1
@jamessan bagaimana melakukannya di iterm2?
Finn
33

Saya tidak yakin apakah "mungkin" lagi. Silakan baca pembaruan di bawah ini.

Ya, Anda bahkan bisa di terminal vim, tetapi tidak ada jawaban nyata yang mencakup semua . Pada dasarnya Anda harus mengikuti dua langkah:

  1. Pastikan <M-d>notasi ada, dan petakan dengan tepat apa yang diinput terminal Anda ( ^[adalah karakter escape):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Petakan sesuatu ke kombinasi yang baru Anda "buat":

    noremap <M-d> :echo "m-d works!"<cr>
    

Memahami cara kerjanya, Anda dapat memperluas "trik" ini ke kombinasi "aneh" lainnya, misalnya, saya menggunakan rayap, dan vim tidak mengenali <S-F1>, menggunakan cat I get ^[[1;2P. Kemudian, di vimrc saya, saya lakukan:, execute "set <S-F1>=\e[1;2P"dan kemudian saya bisa memetakannya ke apa saja.

Catatan: Saya tidak tahu mengapa, tetapi untuk beberapa orang menggunakan \<Esc>karya, bukan \e.


Pembaruan (Februari 2016)

Bergantung pada istilah agar terminal Anda berjalan, mungkin Anda bisa ... di sebagian besar terminal, "alt + h", misalnya, dipetakan ke ^[h, yaitu: "escape + h". Sehingga bisa menimpa kunci. Saya baru saja mencoba (lagi) dan tampaknya berhasil, tetapi saya yakin ini adalah implementasi yang sangat buggy dan rawan kesalahan.

Namun demikian, untuk yang cukup berani, inilah plugin eksperimental:

Pablo Olmos de Aguilera C.
sumber
Alih-alih execute "set...barang, Anda bisa langsung menggunakan set <M-d>=^[d. Ini ^[sebenarnya adalah karakter pelarian yang dimasukkan C-v-Esc. Ini diperlukan di rxvt / urxvt, tetapi xterm seharusnya tidak memerlukan perlakuan khusus. Info lebih lanjut tentang topik ini di vim wiki .
Micah Elliott
Apakah ada pendekatan analog untuk hal ini yang akan bekerja dengan tmux sehingga Md dapat diikat?
George
2
Bagi saya, <Esc>maka dsekarang melakukan hal yang sama seperti <Alt>+ d. Juga, Anda bisa melakukan ini dalam satu baris dengan Ctrl-v, <Esc>seperti di sini .
Sparhawk
24

Map Alt Key di Vim di Mac OSx:

Mulailah dengan melihat kode kunci yang dikirim terminal Anda ke vim:

$ sed -n l
^[[1;9D 

Dalam contoh di atas, saya menjalankan perintah dan menekan Alt + Left.

Ini ^[[1;9Dadalah urutan yang lolos dikirim ke vim, sehingga kita dapat menggunakannya untuk pemetaan kita.

map <Esc>[1;9D 
lfender6445.dll
sumber
3
Jika Anda menggunakan aplikasi iTerm2, ada baiknya untuk memeriksa bagaimana kunci dipetakan di Profil> Kunci.
fikovnik
1
Dengan Optiontombol kiri ( ) dikonfigurasi seperti Esc+di iTerm2, saya dapat memetakan alt+quntuk keluar dari vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus
Anda juga dapat mengatur iTerm2 untuk bekerja dengan peta ulang itu jika Anda pergi ke Preferensi> Profil, pilih profil Anda saat ini, buka tab "tombol" untuk profil itu dan ubah opsi yang mengatakan "Kiri ⌥ Kunci" menjadi "Esc +" (tersedia pilihannya adalah "Normal", "Meta", dan "Esc +").
Giovanni Benussi
12

Menggunakan:

map <A-D> <C-D>

Lihat :help key-notation.

Benoit
sumber
1
Sepertinya ini masih tidak berhasil. Alt + d akan memasukkan karakter aneh ke Vim, yang sama dengan kasus unmap.
Thomson
Berfungsi untuk saya (saya menggunakan gvimdi Windows)
Deqing
8

Terminal Anda mungkin tidak mengirimkan Alt-D "dengan benar". Anda dapat menggunakan CV untuk benar-benar mendapatkan escape sequence yang sebenarnya dikirim ke Vim dan menggunakannya untuk membuat pemetaan Anda. Yaitu, edit .vimrc Anda dan ganti yang sebenarnya dengan mengetikkan urutan berikut "CV Alt-D" sehingga Anda akan memiliki urutan escape yang benar di vimrc Anda. Itu tidak akan berfungsi jika terminal Anda tidak mengirim apa pun ke vim.

mb14
sumber
8

Terminal saya akan menghasilkan ^[xperintah (misalnya untuk alt-x). Apa yang membuatnya bekerja di dalam Vim adalah skrip kecil dari vim.wikia.com ini :

for i in range(97,122)
  let c = nr2char(i)
  exec "map \e".c." <M-".c.">"
  exec "map! \e".c." <M-".c.">"
endfor

Tambahkan ke .vimrc untuk memperbaiki semua pemetaan kunci alt.

laktak
sumber
1

sebagai tindak lanjut jawaban Bruno untuk pengguna Mac, coba pastikan kunci opsi Anda dipetakan ke Esc+.

Ini akan memberi Anda perilaku "normal" dari tombol option ( A) di Vim.

Misalnya, di iterm2, opsi ini dapat ditemukan di bawah Preferences > Profiles > Keys:

tangkapan layar preferensi iterm2

axelyung
sumber
Saya juga harus mengubah konfigurasi menjadi nnoremap <Esc>j :m .+1<CR>==dan serupa ...
mihaipopescu
0

Halo, setelah tidak ada solusi yang baik setelah bertahun-tahun menguji semua hal di atas di mac, saya terus mencari.

Inilah solusi saya:

Untuk membuat kombinasi tombol termasuk Alt Anda harus mendeklarasikan kombinasi di preferensi> keyboard dan menggunakan kombinasi itu di file setup vim (centang opsi gunakan sebagai tombol meta).

Keluarannya harus berupa karakter yang tidak biasa (tidak amisalnya) sehingga Anda tidak menimpa karakter biasa.

Dalam contoh di bawah ini, Anda harus bisa cukup vim dengan ALT-Up.

vim pengaturan: vim pengaturan

pengaturan mac: pengaturan mac

MC F
sumber