Bagaimana cara memetakan kunci Alt?

38

Saya mencoba memetakan Altkunci dengan cara berikut:

:map <A-j> j
:map <A-k> k

tetapi tidak bekerja (bel berbunyi Alt + j/ Alt + k).

Apa yang saya lewatkan?

Saya menggunakan Terminal pada OSX, hal yang sama terjadi pada Linux jarak jauh.


Aktif Ctrl + v, Alt + jsaya punya: ?~H~F( kapan encoding=utf-8).

Aktif Ctrl + v, Alt + ksaya punya: ?~Z( ˚kapan encoding=utf-8).

Menjalankan vim tanpa plugin ( -u NONE) tidak ada bedanya.

kenorb
sumber
1
Apakah Alt(tekan, tidak tahan) dan kemudian jberfungsi? Dengan xtermsetidaknya saya perlu mengatur metaSendsEscapeagar true urutan ini berfungsi ... Saya tidak tahu apakah Anda memiliki masalah yang sama, dan saya tidak menggunakan OSX jadi saya tidak dapat menguji ...
Martin Tournoij
@Carpetsmoker Menekan Alt, melepaskan, lalu jatau tombol lainnya berfungsi seperti biasa. Saya telah memeriksa dan menemukan opsi 'Gunakan opsi sebagai kunci meta' , mengaktifkannya dan berfungsi sekarang. Jadi pengaturan metaSendsEscapeberhasil, terima kasih.
kenorb
3
Pertanyaan ini sebelumnya dijawab (dengan respons yang lebih baik) di sini: stackoverflow.com/questions/6778961/…
user3751385

Jawaban:

36

Begitulah cara saya melakukannya di Linux atau Cygwin:

Pertama-tama periksa karakter apa yang dikirim oleh terminal Anda ketika Anda menekan ALT+ J:

Untuk melakukan ini, saya pergi ke konsol dan menjalankan sed -n l(Anda juga dapat menggunakannya catuntuk itu). Kemudian saya menekan ALT+ Jdan melihat bahwa karakter di layar adalah ^[j.

Saya ganti ^[dengan \e(karena itulah yang dikirim oleh terminal saya ketika saya tekan esc) dan string terakhir untuk saya adalah \ej.

Lalu saya menulis ke .vimrc:

execute "set <M-j>=\ej"
nnoremap <M-j> j

Dan pemetaannya berhasil.

Kossak
sumber
4
Saya tidak dapat menemukan dokumentasi untuk :set <M-j>=\ejbagian itu. Apa yang harus saya cari?
Evgeni Sergeev
1
Terima kasih atas jawabannya, ini adalah satu-satunya solusi yang bekerja untuk saya dengan Iterm + vim
newUserNameHere
Nah, ini tidak berhasil. Terkadang ESC-J akan bertindak sebagai ALT-J
user3751385
1
@EvgeniSergeev See:help :set-termcap
Kaya
10

Dengan bantuan Carpetsmoker , tampaknya Terminal tidak dikonfigurasi untuk 'Gunakan Alt / opsi sebagai meta key' (ini sangat umum untuk Terminal GUI).

Untuk Terminal di OSX, ada di Preferensi -> Pengaturan -> tab Keyboard -> 'Gunakan opsi sebagai kunci meta' . Periksa: Bagaimana saya bisa mengubah Terminal untuk menggunakan opsi sebagai kunci meta? ( Mavericks ).

Untuk XTerm, periksa: Mengkonfigurasi XTerm ke Default ke Meta Sends Escape yang mengatakan:

Tambahkan baris ini di mana saja di file .Xdefaults pribadi Anda ( ~/.Xdefaults):

xterm*metaSendsEscape: true

Kemudian muat ulang konfigurasi dengan xrdb. Tanpa langkah ini perubahan .Xdefaultstidak akan berpengaruh hingga X berikutnya dimulai ulang:

xrdb -l ~/.Xdefaults

Kemudian pemetaan standar dengan Altkunci seperti:

:map <A-j> j
:map <A-k> k

bekerja dengan baik.

Untuk bantuan, lihat: :h :map-alt-keys.

kenorb
sumber
4
Mungkin juga ingin melihat :h :map-alt-keyssebagai sumber informasi lain
Peter Rincker
4

Mirip dengan jawaban Kossak tetapi sedikit lebih sederhana, dengan memetakan penekanan tombol literal.

Baik dalam mode normal setelah menekan :, atau dimasukkan ke Anda .vimrc, memetakan input secara langsung dengan memulai pemetaan:

nnoremap 

kemudian menekan Ctrl+ Vlalu menekan tombol untuk merekam, misalnya Alt+ . Ini akan ditampilkan sebagai sesuatu seperti ini:

nnoremap ^[[1;3D

tetapi masing ^[- masing adalah satu, karakter pelarian literal dan penyorotan sintaksis harus menunjukkan ini. Ganti pelarian literal dengan teks <Esc>, dan tambahkan perintah yang ingin Anda gunakan:

nnoremap <Esc>[1;3D <C-w>h

Saya tahu OP memetakan Alt+ huruf, tetapi saya menggunakan panah untuk menunjukkan bagaimana melakukannya untuk sesuatu yang mungkin tidak dipetakan secara default.

Walf
sumber
Bekerja seperti pesona, terima kasih banyak!
aryndin
2

Ini berfungsi untuk saya di terminal xfce Ubuntu 16.04 (dan terminal karat alacritty)

Tetapkan pemicu snipet ultisnip ke Meta-/(seperti halnya snipet emacs)

let g:UltiSnipsExpandTrigger="^[/"

Sekarang saya ketikkan ^[/vim

Dalam mode sisipkan Ctrl-V Alt-/

( Metaadalah Altkunci pada keyboard PC saya)

pengguna178047
sumber
1

Jika Control+Vdiikuti oleh ALT-xpertunjukan ^[x(ketik terminal) Anda dapat memperbaikinya dengan skrip kecil ini dari vim.wikia.com :

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 semua pemetaan tombol alt.

laktak
sumber