Làm thế nào để vô hiệu hóa các phím mũi tên trong vim?


24

Tôi muốn dạy bản thân mình bằng cách sử dụng hjkl nhiều hơn là sử dụng các phím mũi tên để ở trên hàng nhà. Và vâng, tôi rất ý thức rằng người ta không nên sử dụng hjkl làm các phím điều hướng chính. Tuy nhiên, thói quen của tôi khá mạnh mẽ và tôi thậm chí không nhận ra điều đó đã khiến bàn tay đó di chuyển đến các phím mũi tên và tôi muốn học nó.

Để bỏ thói quen đó: Làm cách nào tôi có thể vô hiệu hóa các phím mũi tên để tôi buộc phải sử dụng hjkl hoặc một số phương pháp điều hướng khác?

Như một phần thưởng, sẽ rất hữu ích nếu có một thông báo được hiển thị Dont't use this!rằng nó không bắt buộc. Nếu họ không làm việc, nó sẽ đủ khó hiểu để tôi suy nghĩ lại về thói quen của mình.


4
Hoàn toàn không có điểm nào làm điều đó; HJKL hút nhiều như mũi tên.
romainl

6
Tôi nghĩ rằng @romainl có thể chỉ ra rằng điều quan trọng hơn là tập trung vào việc sử dụng các chuyển động mạnh mẽ của vim (như wcho từ tiếp theo, }cho đoạn tiếp theo, ncho kết quả tìm kiếm tiếp theo, fzcho lần xuất hiện tiếp theo của zdòng hiện tại, v.v.) hơn là di chuyển nhiều hơn chi tiết bởi các ký tự đơn. Tôi hoàn toàn đồng ý với điều này. Tuy nhiên, HJKL chắc chắn tốt hơn các phím mũi tên ở chỗ bạn không phải di chuyển tay từ hàng nhà. Tôi sẽ thường xuyên gõ một cái gì đó như jA, nhanh hơn rất nhiều <Down>A, và không thực sự bị đánh bại bởi bất kỳ chuyển động.
wchargein

4
@romainl: Tôi nghĩ rằng tôi đã có cuộc thảo luận này với bạn trước đây. Người không vimmer được sử dụng để mũi tên, và không được sử dụng để HJKL. Lý tưởng nhất là bạn không muốn sử dụng một trong hai; nhưng việc chặn mũi tên (chứ không phải HJKL) sẽ khiến mọi người tạm dừng và suy nghĩ về những gì họ đang làm (trong khi vẫn để HJKL mở như một lựa chọn thay thế trong trường hợp đó thực sự là lựa chọn tốt nhất hoặc trong trường hợp người dùng không biết cách thực hiện chuyển động mạnh mẽ hơn.). Tức là nó không phải là về việc học HJKL, mà là về việc ngăn chặn chủ nghĩa tự động học được trong các biên tập viên khác.
Amadan

1
@Carpetsmoker Điều chắc chắn là một mặt trái của các phím hjkl là không phải rời khỏi hàng nhà. Đối với các phím mũi tên, bàn tay phải di chuyển trên bàn phím.
k0pernikus

1
@Carpetsmoker Chắc chắn tôi cảm thấy tốt hơn. ;)
k0pernikus

Câu trả lời:


24

Bạn có thể cài đặt plugin hardmode.vimrcđưa vào

let g:HardMode_level = 'wannabe'
let g:HardMode_hardmodeMsg = 'Don''t use this!'
autocmd VimEnter,BufNewFile,BufReadPost * silent! call HardMode()

Nếu bạn không muốn sử dụng một plugin, sử dụng (có thể là một lựa chọn tốt hơn, như bạn có thể tùy chỉnh tất cả mọi thứ cho mình!) nnoremap, vnoremapinoremaptrên <Left>, <Right>, <Up>, <Down>, <PageUp><PageDown>, ví dụ:

nnoremap <Left> :echo "No left for you!"<CR>
vnoremap <Left> :<C-u>echo "No left for you!"<CR>
inoremap <Left> <C-o>:echo "No left for you!"<CR>

1
Cũng có <nop>nếu bạn muốn vô hiệu hóa sơ đồ bàn phím : nnoremap h <nop>.
akshay

25

Trong trường hợp bạn hoặc ai đó đang đọc chủ đề này, chỉ muốn tắt các chuyển động chính mà không có cảnh báo văn bản, hãy nhập các dòng sau vào .vimrc

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

Các lệnh sẽ chỉ vô hiệu hóa chuyển động phím trong chế độ bình thường. Họ vẫn làm việc trong chế độ chèn. Nếu bạn sử dụng inoremap, chuyển động mũi tên cũng sẽ bị xóa khỏi chế độ chèn.

Chủ đề phổ biến rộng rãi này liên quan đến sự khác biệt giữa noremap, nnoremap, inoremap, v.v .: Remaps in Vim

Ý tưởng chung với ánh xạ lại như sau:

Choice-of-mode-to-remap <remap this command> <to this action/command instead>

Vì vậy, trong các ví dụ khác được cung cấp, bạn sắp xếp lại lệnh trái của bạn vào một dấu nhắc văn bản sẽ loại bỏ hành động thực sự di chuyển con trỏ. Ví dụ tôi đưa ra ở trên chỉ đơn giản là ánh xạ lại các hành động không làm gì, hơn là một cái gì đó khác. Xem xét nó loại bỏ, thay vì thay thế, chức năng vim.


2

Bạn có thể thêm phần này vào .vimrcđể tắt các phím mũi tên trong Chế độ Lệnh, Chèn, Bình thường và Trực quan:

" Remove newbie crutches in Command Mode
cnoremap <Down> <Nop>
cnoremap <Left> <Nop>
cnoremap <Right> <Nop>
cnoremap <Up> <Nop>

" Remove newbie crutches in Insert Mode
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>
inoremap <Up> <Nop>

" Remove newbie crutches in Normal Mode
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>
nnoremap <Up> <Nop>

" Remove newbie crutches in Visual Mode
vnoremap <Down> <Nop>
vnoremap <Left> <Nop>
vnoremap <Right> <Nop>
vnoremap <Up> <Nop>

Lưu ý: Thanh toán :help map-overviewđể biết thêm chi tiết về các loại ánh xạ khác nhau


1
Bạn có thể giảm số lượng lệnh cần thiết bằng cách sử dụng noremap ... ...(đối với chế độ thông thường, trực quan, chọn và chờ toán tử) và noremap! ... ...(đối với chế độ chèn và dòng lệnh).
Jürgen Krämer

Thật. Tôi nghĩ rằng rõ ràng hơn noremapssẽ hữu ích cho ai đó muốn tùy chỉnh các chế độ bị ảnh hưởng
Phi tuyến
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.