Ánh xạ của bạn không làm những gì nó nên làm hoặc hành xử khác với dự kiến, một số bước cần tuân theo để khắc phục sự cố đó:
Kiểm tra xem khóa có được ánh xạ hiệu quả với những gì cần làm không
Vim cung cấp một lệnh :map
. Theo mặc định (khi không có đối số nào được đưa ra), lệnh sẽ hiển thị tất cả các ánh xạ hiện được tạo. Dưới đây là một ví dụ về kết quả của lệnh:
Như mọi khi tài liệu là bạn của bạn: :h map-listing
Bạn có thể thấy trong cột đầu tiên chế độ ánh xạ ( n
đối với chế độ bình thường,
v
đối với chế độ trực quan, v.v.), cột thứ hai hiển thị các phím được ánh xạ và cột cuối cùng mà các phím được ánh xạ tới. Lưu ý rằng trước khi các hành động được ánh xạ, một số ký tự bổ sung có thể xuất hiện, điều quan trọng là phải hiểu chúng:
*
chỉ ra rằng nó không thể sửa chữa được (tức là nó không phải là ánh xạ đệ quy, xem know when to use nore
sau trong câu trả lời này)
&
chỉ ra rằng chỉ ánh xạ tập lệnh cục bộ là có thể sửa chữa
@
chỉ ra ánh xạ cục bộ đệm
Khi yêu cầu trợ giúp về ánh xạ, bạn nên thêm thông tin này vì nó có thể giúp người khác hiểu hành vi của ánh xạ của bạn.
Có thể hạn chế nhắc đến một chế độ đặc biệt với chị lệnh của :map
, như :vmap
, :nmap
, :omap
vv
Bây giờ để hạn chế tìm kiếm của bạn đối với ánh xạ có vấn đề, bạn có thể chuyển chuỗi khóa bạn đang gỡ lỗi làm tham số của các lệnh, như sau:
:map j
:map <Leader>m
:map <F5>
Lưu ý rằng <Leader>
khóa sẽ được thay thế bằng giá trị thực của nó trong danh sách.
Nếu kết quả của lệnh cho thấy các khóa của bạn được ánh xạ chính xác, điều đó có thể có nghĩa là sự cố không đến từ Vim mà từ thiết bị đầu cuối hoặc môi trường máy tính để bàn của bạn. Xem phần Kiểm tra xem bản đồ của bạn có thực sự bị chặn bởi Vim không
Nếu kết quả của lệnh cho thấy các khóa của bạn không được ánh xạ chính xác, hãy xem phần sau.
Kiểm tra những gì vượt qua bản đồ của bạn
Một cách sử dụng thuận tiện khác của :map
lệnh là kết hợp nó với verbose
: Điều này sẽ nhắc tập tin cuối cùng đã sửa đổi ánh xạ của bạn.
Ví dụ: xem hai ảnh chụp màn hình này là kết quả của :verbose map
: ảnh đầu tiên là ánh xạ được sửa đổi bởi tôi .vimrc
và lần thứ hai ánh xạ được tạo bởi plugin:
Bây giờ nếu bạn thấy rằng một tập lệnh khác đã sửa đổi ánh xạ của bạn, bạn sẽ phải xem liệu bạn có thể xóa nó hay sửa đổi hành vi của nó không. (Lưu ý rằng một số plugin cung cấp biến để bật / tắt ánh xạ của chúng, tiếc là không phải tất cả các plugin đều làm như vậy)
Nếu tệp cuối cùng thay đổi ánh xạ của bạn là của bạn .vimrc
, hãy đảm bảo không có dòng nào khác xác định ánh xạ cho cùng một khóa. Các .vimrc
tập tin sẽ hạnh phúc ghi đè lên bất kỳ ánh xạ với người cuối cùng của loại hình này trong file.
Kiểm tra xem bản đồ của bạn có thực sự bị chặn bởi Vim không
Một số tình huống có thể cho thấy Vim không chặn khóa của bạn:
- Lệnh
:map
cho thấy khóa của bạn được ánh xạ chính xác nhưng nhấn nó không làm gì cả.
- Ánh xạ của bạn hoạt động trên gVim (GUI) nhưng không có gì trong terminal Vim
- Ánh xạ của bạn hoạt động trên một trình giả lập thiết bị đầu cuối được xác định nhưng không phải trên một trình giả lập khác
- Ánh xạ của bạn hoạt động trên một hệ điều hành được xác định nhưng không phải là một hệ điều hành khác.
Nó có thể được gây ra bởi một trong hai điều sau đây:
Một cái gì đó chặn khóa trước Vim : Nó có thể là các ứng dụng khác nhau: HĐH, môi trường máy tính để bàn, trình giả lập thiết bị đầu cuối của bạn, Tmux (nếu bạn sử dụng nó) ...
Để khắc phục sự cố đó, bạn nên:
- Cố gắng tạm thời loại bỏ
.tmux.conf
nếu bạn sử dụng tmux
- Tham khảo tài liệu của thiết bị đầu cuối hoặc môi trường máy tính để bàn của bạn.
Bạn cũng có thể tham khảo các trang web chị em như siêu người dùng ,
Unix và Linux , AskUbfox , v.v ...
Nếu đây là vấn đề, thì bạn có hai giải pháp: hoặc bạn dành (rất nhiều) thời gian để thay đổi hành vi của ứng dụng gây ra sự cố hoặc bạn tìm một tổ hợp phím khác để ánh xạ không bị ứng dụng khác chặn.
Trình giả lập thiết bị đầu cuối của bạn không thể xử lý tổ hợp phím mà bạn đang cố gắng lập bản đồ : Trình giả lập thiết bị đầu cuối được triển khai khác nhau và một số trong số chúng không thể xử lý một số tổ hợp phím cụ thể. (Lý do tại sao họ không thể nằm ngoài phạm vi của câu hỏi này, hãy xem tài liệu của họ hoặc các trang web chị em được đề cập trước đó để biết thêm chi tiết).
Trong trường hợp này, bạn không có nhiều giải pháp: hoặc bạn thay đổi khóa của mình cho một giải pháp khác được xử lý đúng bởi thiết bị đầu cuối của bạn hoặc bạn thay đổi trình giả lập thiết bị đầu cuối.
Kiểm tra các cạm bẫy phổ biến
Một số vấn đề trong ánh xạ khá thường xuyên và chủ yếu liên quan đến cú pháp vimscript. Nếu ánh xạ của bạn có hành vi không mong muốn, hãy nhớ kiểm tra các điểm sau:
Không đặt nhận xét trên cùng một dòng với ánh xạ của bạn , thay vào đó hãy đặt nhận xét trên dòng trên. Thí dụ:
Đừng làm vậy:
inoremap ii <esc> " ii to go back into normal mode
Vim sẽ coi các khoảng trắng, "
và nhận xét là một phần của ánh xạ sẽ dẫn đến một hành vi không mong muốn.
Thay vào đó hãy làm điều đó:
" ii to go back into normal mode
inoremap ii <esc>
Điều này dễ đọc hơn và sẽ không làm rối bản đồ của bạn.
Đừng đặt lệnh của bạn với|
. Thí dụ:
Đừng làm vậy:
nnoremap <Leader>x :w | !% python -m json.tools
Vim sẽ coi đường ống |
là một lệnh chấm dứt: Khi bạn nguồn .vimrc
, ánh xạ của bạn nnoremap <Leader>x :w
sẽ được tạo thì lệnh bên ngoài !% python -m json.tools
sẽ được thực thi.
Thay vào đó hãy làm điều đó:
nnoremap <Leader>x :w <bar> !% python -m json.tools
Xem một lời giải thích về<bar>
.
Biết khi nào nên sử dụng nore
: luôn luôn .
LearnVimscriptTheHardWay giải thích nó khá rõ ràng: không bao giờ sử dụng map
, nmap
, vmap
, vv ... Luôn thích các phiên bản nore: noremap
, nnoremap
, vnoremap
, vv ... Tại sao? nore
là viết tắt của non-recursive
ánh xạ, điều đó có nghĩa là phía bên phải của ánh xạ sẽ được coi là tính năng tích hợp ngay cả khi bạn ghi lại nó. Thí dụ:
Giả sử bạn muốn ánh xạ >
để xóa một dòng và -
tăng độ thụt của dòng. Nếu bạn không sử dụng ánh xạ không đệ quy, bạn sẽ làm điều đó:
( Đừng làm điều đó là ví dụ )
nmap > dd
nmap - >
Khi bạn nhấn >dòng của bạn sẽ bị xóa, điều đó tốt. Nhưng khi bạn nhấn -dòng của bạn cũng sẽ bị xóa thay vì bị thụt vào. Tại sao? Bởi vì Vim hiểu "Tôi đã nhận được một bản hit -
mà tôi nên dịch theo >
đó, đến lượt tôi nên dịch sang dd
".
Thay vào đó hãy làm điều đó
nnoremap > dd
nnoremap - >
Bằng cách này, Vim sẽ dịch -
là >
và sẽ không cố gắng thực hiện bất kỳ bản dịch nào khác vì nore
.
Chỉnh sửa ghi chú "Luôn luôn" có thể là một câu trả lời phóng đại trong một số trường hợp bạn sẽ cần sử dụng biểu mẫu ánh xạ đệ quy nhưng nó không thực sự phổ biến. Để làm rõ, tôi sẽ trích dẫn @romainl từ câu trả lời này :
Chỉ sử dụng ánh xạ đệ quy nếu bạn có ý định sử dụng bất kỳ ánh xạ nào khác trong ánh xạ của mình. Sử dụng ánh xạ không đệ quy nếu bạn không.
Hãy nhớ rằng một số tổ hợp khóa là tương đương : Do các mã thập lục phân được tạo ra, một số tổ hợp khóa sẽ được Vim hiểu là một khóa khác. Ví dụ
<C-h>
tương đương với <backspace>
<C-j>
như <enter>
- Trên bàn phím tiếng Pháp
<M-a>
giống á
và tương tự với tất cả các
<m-
ánh xạ. Như @LucHermitte đã chỉ ra trong nhận xét đó là một vấn đề với các plugin sử dụng loại ánh xạ này như vim-latex.
<C-S-a>
tương đương với
<C-a>
. Ánh xạ Ctrl + chữ in hoa riêng biệt với Ctrl + chữ thường không thể là nguyên nhân của cách các thiết bị đầu cuối gửi mã ASCII.
Khi ánh xạ của bạn dường như ảnh hưởng đến một khóa khác, hãy thử sử dụng kết hợp lhs khác, nếu điều đó giải quyết được vấn đề kiểm tra mã thập lục phân nào được gửi đến Vim.
Kiểm tra xem nhà lãnh đạo của bạn có được xác định chính xác không : Nếu ánh xạ của bạn liên quan đến<leader>
việc không hoạt động và bạn đã thay đổi nhà lãnh đạo của mình bằng lệnhmapleader
, hãy kiểm tra xem định nghĩa của nhà lãnh đạo của bạn đã được thực hiện trước khi định nghĩa về ánh xạ. Nếu không, Vim sẽ cố gắng tạo ánh xạ bằng một khóa không phải là thứ bạn nghĩ. Ngoài ra nếu bạn muốn sử dụng thanh không gian làm người lãnh đạo của mình (khá hiện tại), hãy đảm bảo rằng bạn đã sử dụng ký hiệu chính xác:let mapleader = "\<Space>"
Bản đồ của bạn vẫn không hoạt động?
Nếu bạn đã trải qua tất cả các bước của câu trả lời này và bản đồ của bạn vẫn không hoạt động như bạn muốn, có lẽ bạn sẽ muốn yêu cầu trợ giúp trên trang web này.
Để giúp mọi người giúp bạn nhớ cung cấp một số thông tin quan trọng như:
- Lệnh bạn đã sử dụng để xác định ánh xạ của bạn.
- Những gì bạn đang mong đợi bản đồ của bạn để làm.
Một mô tả chính xác của vấn đề:
"Nó không hoạt động" sẽ không thực sự hữu ích cho những người sẽ cố gắng giúp bạn. Bạn nên chính xác nếu ánh xạ không làm gì hoặc nó hoạt động khác với những gì bạn đang mong đợi.
- Cũng cho biết rằng bạn thực sự đã làm theo các bước được mô tả ở đây và kết quả bạn nhận được với
:map
và:verbose map
Tất cả điều này sẽ giúp bạn và người dùng trang web tiết kiệm rất nhiều thời gian.
Một lệnh hữu ích: :unmap
Đôi khi nó có thể hữu ích để thiết lập lại ánh xạ mà không cần thoát Vim để giúp gỡ lỗi hành vi của nó.
Để làm như vậy, bạn có thể sử dụng lệnh :unmap <key>
sẽ loại bỏ ánh xạ được gán <key>
cho các chế độ Bình thường, Trực quan và Hoạt động đang chờ xử lý. :iunmap
sẽ loại bỏ ánh xạ cho chế độ Chèn. Đối với các chế độ khác xem :help :unmap
.
Người giới thiệu
Giới thiệu tuyệt vời về lập bản đồ: learnvimscriptthehardway (Và rất nhiều khía cạnh khác của Vim)
Doc: :h mapping
,
:h :map
Phần 20 trong Câu hỏi thường gặp của Vim là về lập bản đồ và chứa các câu hỏi thú vị:
Và một phần thưởng: Một câu hỏi về thực tiễn tốt nhất để tìm khóa nào được sử dụng trong ánh xạ của bạn
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
như tôi đã nói trong dòng đầu tiên của câu hỏi của tôi, vì vậy việc thu thập những lý do này sẽ cho phép giảm số lượng câu hỏi trùng lặp về ánh xạ.