Tôi có thể ánh xạ phím Alt trong Vim không?


90

Tôi đã cố gắng ánh xạ để thêm dòng bên dưới vào .vimrc, nhưng nó không hoạt động. Tôi đã kiểm tra .vimrc được tải bởi Vim.

map <Alt-D> <C-D>

có lỗi nào trong ánh xạ này không?


Bạn đang sử dụng vim trong thiết bị đầu cuối hay phiên bản gui (gvim, macvim)?
Nick Knowlson

Cũng lưu ý rằng nếu các encodingthay đổi của bạn sau khi ánh xạ chạy, những gì bạn nhận được từ các phím Alt có thể không khớp với những gì bạn đã đặt ban đầu.
dash-tom-bang

Câu trả lời:


136

Đối với người dùng Mac ngoài kia: để ánh xạ ALT + hjkl, thay vào đó hãy sử dụng ký tự thực được tạo (tìm ký tự nào bằng cách sử dụng tổ hợp khi ở chế độ CHÈN), ví dụ với bàn phím của tôi, tôi nhận được:

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

và như thế. Giải pháp được tìm thấy ở đây trên StackOverflow.

Tôi đã sử dụng điều này để di chuyển các dòng lên và xuống với ALT + k \ j, sử dụng điều này trên .vimrc của tôi:

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

như đã giải thích ở đây .

Hy vọng nó hữu ích, hãy tận hưởng Vim :)

ADDENDUM BY Dylan_Larkin (2019): Để tính năng này hoạt động trên máy Mac, bạn phải TẮT " Use Option as Meta Key " trong Terminal-> Preferences-> Keyboard


10
Đây chỉ là những gì tôi đến đây để làm (Alt + HJKL để di chuyển các phần tách)! Cảm ơn!
Jamie Schembri

6
Một cách dễ dàng để tìm ra ký tự đó là bằng cách sử dụng cat. Đơn giản chỉ cần gõ catvà bên trong cửa sổ mèo tổ hợp phím bạn muốn. Phát hiện ra rằng dấu ngoặc kép alt là 'và' trên máy mac của tôi.
dvcrn

4
điều này hoạt động tuyệt vời khi Alt + HJKL để di chuyển giữa các phần, ngón tay của tôi thích nó !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales

3
Các ánh xạ chính xác này có thể không hoạt động như mong đợi trong các phiên bản OSX trong tương lai. Sử dụng sed -n lđể xem đầu ra của <Ak> và <Aj> trước khi bạn định cấu hình ánh xạ. Trong trường hợp của tôi <Aj> là và <Ak> là˚
luk3thomas

4
Trên macOS, khi thiết lập Use Option as Meta Keyhoặc trên hồ sơ iTerm ⌥ key to Esc+sẽ hoạt động theo cách truyền thống (như trên Linux / Unix). Vì vậy, bạn không cần phải đặt bản đồ trên Vim <^[j>, chỉ cần ánh xạ nó đến <A+j>hoặc <M+j>và nó hoạt động.
goetzc

40

:help key-notationmô tả định dạng cần được sử dụng để ánh xạ các khóa khác nhau. Trong trường hợp alt, bạn có thể sử dụng <A-hoặc <M-. Vì vậy, ánh xạ của bạn sẽ là

map <M-d> <C-d>

Tôi cũng khuyên bạn nên sử dụng norebiến thể của :map(ví dụ noremap:) trừ khi bạn muốn cho phép đánh giá lại phía bên phải một cách rõ ràng cho các ánh xạ.


1
Điều này vẫn không có bất kỳ tác dụng. Đầu vào Alt + D vẫn nhập một số ký tự lạ vào Vim.
Thomson

9
Đó là một vấn đề riêng biệt. Thiết bị đầu cuối của bạn đang gửi một ký tự nhiều byte tới Vim và Vim không biết phải diễn giải điều đó là <A-d>. Bạn có thể cần thay đổi cài đặt của thiết bị đầu cuối để nó gửi <A-d>như vậy <Esc>d.
jamessan

1
@jamessan làm thế nào để làm điều đó trên iterm2?
Finn

33

Tôi không chắc là "có thể" nữa. Vui lòng đọc bản cập nhật bên dưới.

Có, bạn thậm chí có thể trong thiết bị đầu cuối vim, nhưng không có câu trả lời thực sự bắt tất cả . Về cơ bản bạn phải làm theo hai bước:

  1. Đảm bảo rằng <M-d>ký hiệu tồn tại và ánh xạ chính xác những gì đầu vào đầu cuối của bạn ( ^[là ký tự thoát):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Ánh xạ một cái gì đó với kết hợp "được tạo" mới của bạn:

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

Hiểu được cách hoạt động của nó, bạn có thể mở rộng "thủ thuật" này sang các cách kết hợp "lạ" khác, ví dụ: tôi đang sử dụng mối, và vim không nhận ra <S-F1>, tôi sử dụng mèo ^[[1;2P. Sau đó, trong vimrc của tôi, tôi thực hiện:, execute "set <S-F1>=\e[1;2P"và sau đó tôi có thể ánh xạ nó với bất kỳ thứ gì.

Lưu ý: Tôi không biết tại sao, nhưng đối với một số người sử dụng \<Esc>các tác phẩm thay vì \e.


Cập nhật (tháng 2 năm 2016)

Tùy thuộc vào điểm cuối mà thiết bị đầu cuối của bạn chạy, có thể bạn có thể ... trong hầu hết các thiết bị đầu cuối, ví dụ: "alt + h" được ánh xạ tới ^[h, đó là: "Escape + h". Vì vậy, nó có thể ghi đè các khóa. Tôi vừa thử (một lần nữa) và nó có vẻ hoạt động, nhưng tôi tin rằng đó là một triển khai rất lỗi và dễ xảy ra lỗi.

Tuy nhiên, đối với những người đủ can đảm, đây là một plugin thử nghiệm:


Thay vì những execute "set...thứ này, bạn có thể trực tiếp sử dụng set <M-d>=^[d. Thực ^[sự là một ký tự thoát được nhập với C-v-Esc. Điều này là cần thiết trong rxvt / urxvt, nhưng xterm không cần điều trị đặc biệt. Thông tin thêm về chủ đề này trong vim wiki .
Micah Elliott

Có một cách tiếp cận tương tự cho điều này sẽ hoạt động với tmux để tức là, Md có thể được liên kết?
George

2
Đối với tôi, <Esc>sau đó dtại làm điều tương tự như <Alt>+ d. Ngoài ra, bạn chỉ có thể làm điều này trong một dòng với Ctrl-v, <Esc>như ở đây .
Sparhawk

24

Lập bản đồ phím Alt trong Vim trên Mac OSx:

Bắt đầu bằng cách xem mã khóa mà thiết bị đầu cuối của bạn đang gửi tới vim:

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

Trong ví dụ trên, tôi đã chạy lệnh và nhấn Alt + Left.

Đây ^[[1;9Dlà trình tự thoát đang được gửi tới vim, vì vậy chúng tôi có thể sử dụng trình tự đó để lập bản đồ.

map <Esc>[1;9D 

3
Nếu bạn đang sử dụng ứng dụng iTerm2, bạn nên kiểm tra cách các phím được ánh xạ trong Hồ sơ> Phím.
fikovnik

1
Với trái Optionchủ chốt ( ) cấu hình như Esc+trong iTerm2, tôi có thể lập bản đồ alt+qbỏ vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus

Bạn cũng có thể thiết lập iTerm2 để hoạt động với bản sửa lại đó nếu bạn đi tới Tùy chọn> Hồ sơ, chọn hồ sơ hiện tại của mình, chuyển đến tab "phím" cho hồ sơ đó và thay đổi tùy chọn có nội dung "Phím trái" thành "Esc +" (khả dụng các tùy chọn là "Bình thường", "Meta" và "Esc +").
Giovanni Benussi

12

Sử dụng:

map <A-D> <C-D>

Thấy chưa :help key-notation.


1
Có vẻ như điều này vẫn không hoạt động. Alt + d sẽ nhập một ký tự lạ vào Vim, ký tự này giống với trường hợp unmap.
Thomson

Làm việc cho tôi (tôi đang sử dụng gvimtrên Windows)
Deqing

8

Thiết bị đầu cuối của bạn có thể không truyền "đúng cách" Alt-D. Bạn có thể sử dụng CV để thực sự gửi chuỗi thoát thực tế đến Vim và sử dụng nó để tạo ánh xạ của bạn. Tức là, chỉnh sửa .vimrc của bạn và thay thế thực bằng cách nhập chuỗi sau "CV Alt-D" để bạn có chuỗi thoát chính xác trong vimrc của mình. Điều đó sẽ không hoạt động nếu thiết bị đầu cuối của bạn không gửi bất kỳ thứ gì đến vim.


8

Terminal của tôi sẽ tạo ra ^[xcác lệnh (ví dụ cho alt-x). Điều khiến nó hoạt động bên trong Vim là tập lệnh nhỏ này từ 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

Thêm vào .vimrc để sửa tất cả các ánh xạ khóa alt.


1

như một phần tiếp theo câu trả lời của Bruno dành cho người dùng Mac, hãy thử đảm bảo rằng khóa tùy chọn của bạn được ánh xạ tới Esc+.

Điều này sẽ cung cấp cho bạn hành vi "bình thường" của khóa tùy chọn ( A) trong Vim.

Ví dụ, trong iterm2, tùy chọn này có thể được tìm thấy dưới Preferences > Profiles > Keys:

ảnh chụp màn hình tùy chọn iterm2


Tôi cũng đã phải thay đổi cấu hình thành nnoremap <Esc>j :m .+1<CR>==và tương tự ...
mihaipopescu

0

Xin chào sau nhiều năm thử nghiệm tất cả những điều trên trên mac không có giải pháp tốt nào, tôi vẫn tiếp tục tìm kiếm.

Đây là giải pháp của tôi:

Để tạo tổ hợp phím bao gồm Alt, bạn phải khai báo tổ hợp trong tùy chọn> bàn phím và sử dụng tổ hợp đó trong tệp thiết lập vim (chọn tùy chọn sử dụng làm phím meta).

Đầu ra phải là một ký tự bất thường ( aví dụ: không) để bạn không ghi đè một ký tự thông thường.

Trong ví dụ dưới đây, bạn sẽ có thể khá sôi động với ALT-Up.

cài đặt vim: cài đặt vim

cài đặt mac: cài đặt mac

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.