Làm thế nào để gỡ lỗi một ánh xạ?


66

Tôi thấy rất nhiều câu hỏi ở đây, nơi người dùng có một bản đồ không hoạt động và hầu hết các lý do khá giống nhau.

Tôi đề nghị làm cho câu hỏi này trở thành một tài liệu tham khảo cho loại câu hỏi này, để đưa ra một quy trình hoàn chỉnh để gỡ lỗi ánh xạ. Nếu người dùng gặp sự cố với ánh xạ, họ có thể được chuyển hướng ở đây để loại bỏ các vấn đề phổ biến nhất.

Tất nhiên vẫn sẽ có những trường hợp cụ thể sẽ yêu cầu một câu hỏi chuyên dụng và sẽ không được giải quyết ở đây.

Câu trả lời:


89

Á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:

kết quả của <code>: map </ code>

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 noresau 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, :omapvv

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 :maplệ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 .vimrcvà lần thứ hai ánh xạ được tạo bởi plugin:

Ánh xạ được đặt từ vimrc

Ánh xạ được đặt từ một 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 .vimrctậ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 :mapcho 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.confnế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 :wsẽ được tạo thì lệnh bên ngoài !% python -m json.toolssẽ đượ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? norelà 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 ->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: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ý. :iunmapsẽ 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


2
Để chia sẻ kinh nghiệm của tôi với những người dùng khác như người điều hành của chúng tôi đề xuất . Và bởi vì 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 similarnhư 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ạ.
statox

1
Một vấn đề lặp đi lặp lại với bàn phím vim-latex và tiếng Pháp: <m-i>égiống với vim, và nó giống nhau với tất cả các phím meta +: chúng được liên kết với một dấu phụ khác nhau.
Luc Hermitte

1
Điều quan trọng nữa là phải biết cách đọc ánh xạ cục bộ đệm khi chúng tôi yêu cầu định nghĩa của chúng với :map {sequence}-> có một *điểm nổi bật ngược trong những gì vim in trước hành động liên quan.
Luc Hermitte

2
Đôi khi chúng tôi thực sự muốn gỡ lỗi những gì xảy ra. Thông thường khi ánh xạ gọi ánh xạ cắm hoặc một hàm có tên không thể nhớ hoặc với các tham số phức tạp. Trong trường hợp đó chúng ta có thể thực hiện: :debug normal {keysequence}(không có bất kỳ vụ nổ), hoặc :debug i{keysequence}cho ánh xạ chế độ chèn, vv Nếu dãy phím chứa những thứ như các phím đặc biệt ( <cr>, <left>, <c-x>, <m-i>, <leader>...). Sau đó, chúng ta cần chơi với exec + dấu ngoặc kép + dấu gạch chéo ngược -> :debug execute "normal \<leader>\<cr>Z".
Luc Hermitte

2
Về trình tự meta, đây là một điểm cũ của FAQ vì vim-latex đã chọn sử dụng những thứ như thế <m-i>. Hầu hết người dùng không sử dụng khóa meta vì chúng được định hướng mạnh mẽ để chạy Vim trong thiết bị đầu cuối - nơi mà khóa meta không thể được sử dụng đơn giản. Chúng ta cần sử dụng gvim hoặc macvim để thông báo vấn đề.
Luc Hermitte
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.