2012-02-02 27 views
17

Vì tôi thường xuyên không sử dụng các chuyển động và đối tượng văn bản tuyệt vời mà vim cung cấp, (và kể từ "Holding down 'j' is a vim anti-pattern,"), tôi muốn vim giúp tôi sử dụng chúng thay vì sử dụng hjkl nhiều hơn một vài lần liên tiếp.Ngăn chặn việc sử dụng lặp lại các phím di chuyển hjkl trong vim

Khi tôi bắt đầu sử dụng vim, tôi đã bực mình rằng tôi không sử dụng hjkl để di chuyển nhưng thay vào đó sẽ sử dụng các phím mũi tên. Để nhắc nhở tôi không làm điều này, tôi đã sử dụng lại các phím mũi tên để tránh sử dụng chúng - tôi biết sử dụng hàng chủ để điều hướng sẽ là một kế hoạch dài hạn tốt hơn, vì vậy tôi cắt bỏ cốt thép tích cực mà tôi có được phím.

map <left> <nop> 
map <right> <nop> 
# I quickly removed nop's for up and down because using 
# the mouse wheel to scroll is sometimes useful 

Tôi không còn cần các ánh xạ này trong .vimrc vì nó hoạt động rất tốt và tôi đã nhanh chóng chuyển đổi mà không phải nỗ lực có ý thức. Theo cách tương tự, bây giờ tôi muốn cắt bỏ việc sử dụng lặp lại các phím di chuyển cơ bản hjkl. Tôi đã hình dung một cái gì đó như thế này:

let g:last_mov_key = 'none' 
let g:times_mov_key_repeated = 0 
function! MovementKey(key) 
    if (g:last_mov_key == a:key) 
     let g:times_mov_key_repeated = g:times_mov_key_repeated + 1 
    else 
     let g:last_mov_key = a:key 
     let g:times_mov_key_repeated = 0 
    endif 
    if g:times_mov_key_repeated > 3 
     echo "Negative Reinforcement!"        
    endif 
endfunction 

noremap j :call MovementKey('j')<CR>gj 
noremap k :call MovementKey('k')<CR>gk 
noremap h :call MovementKey('h')<CR>h 
noremap l :call MovementKey('l')<CR>l 

Nhưng điều này phá vỡ trong chế độ trực quan, và tôi tưởng tượng trong tấn các trường hợp khác, nơi sử dụng dòng lệnh vim ở giữa một cái gì đó thay đổi trạng thái khi nó không nên. Làm thế nào tôi có thể hạn chế bản thân mình phải sử dụng các chuyển động phức tạp hơn?

Chỉnh sửa: Câu hỏi được chỉnh sửa sau hai câu trả lời đầu tiên cho rõ ràng, các đoạn được sắp xếp lại. Tôi muốn một số hỗ trợ từ vim di chuyển vượt ra ngoài "level 0" của romainl. Cho đến nay câu trả lời khuyên tôi không nên lãng phí thời gian của tôi, nhưng nếu chúng ta giả định rằng tôi là một fan hâm mộ của kỹ thuật học tập, nơi tôi thay đổi thói quen của tôi bằng cách thay đổi môi trường của tôi để thay đổi ưu đãi? Trong mô hình này, tôi muốn hoàn thành một nhiệm vụ, ví dụ, di chuyển xuống một trang, và tôi sẽ cố gắng kết hợp khóa một cách ngẫu nhiên cho đến khi tôi đạt được nhiệm vụ đó. Dopamine tín hiệu vv trong não của tôi sẽ củng cố hành động mà cuối cùng đạt được kết quả này. Tôi có thể tập trung vào việc nhớ không sử dụng hjkl hoặc tôi có thể tập trung vào tác vụ mà ban đầu tôi đang cố gắng thực hiện, chỉnh sửa văn bản và không thực sự nghĩ đến việc sử dụng kỹ thuật chỉnh sửa hiệu quả hơn.

+0

Đối với cài đặt bản ghi 'mouse = a' cho phép bạn ánh xạ lên/xuống đến và vẫn có một bánh xe cuộn đang hoạt động (cũng cho phép chọn chuột nếu đó là điều bạn cần). – Holloway

Trả lời

2

Tôi muốn đề xuất giải pháp phù hợp hơn với cách suy nghĩ của OP.

Tôi cũng đã quyết định chặn một số chuyển động nhất định nếu không được tính trước là một ý tưởng hay, như được thảo luận here. Tôi cũng đã thử một bản remapping trực tiếp đơn giản, nhưng điều này không làm việc trong nhiều ngữ cảnh, như được mô tả bởi OP.

Nhưng tôi đã cuối cùng đưa ra một cách tiếp cận mà làm việc sử dụng key maps that returned an expression:

function! DisableIfNonCounted(move) range 
    if v:count 
     return a:move 
    else 
     " You can make this do something annoying like: 
     " echoerr "Count required!" 
     " sleep 2 
     return "" 
    endif 
endfunction 

function! SetDisablingOfBasicMotionsIfNonCounted(on) 
    let keys_to_disable = get(g:, "keys_to_disable_if_not_preceded_by_count", ["j", "k", "l", "h", "gj", "gk"]) 
    if a:on 
     for key in keys_to_disable 
      execute "noremap <expr> <silent> " . key . " DisableIfNonCounted('" . key . "')" 
     endfor 
     let g:keys_to_disable_if_not_preceded_by_count = keys_to_disable 
     let g:is_non_counted_basic_motions_disabled = 1 
    else 
     for key in keys_to_disable 
      try 
       execute "unmap " . key 
      catch /E31:/ 
      endtry 
     endfor 
     let g:is_non_counted_basic_motions_disabled = 0 
    endif 
endfunction 

function! ToggleDisablingOfBasicMotionsIfNonCounted() 
    let is_disabled = get(g:, "is_non_counted_basic_motions_disabled", 0) 
    if is_disabled 
     call SetDisablingOfBasicMotionsIfNonCounted(0) 
    else 
     call SetDisablingOfBasicMotionsIfNonCounted(1) 
    endif 
endfunction 

command! ToggleDisablingOfNonCountedBasicMotions :call ToggleDisablingOfBasicMotionsIfNonCounted() 
command! DisableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(1) 
command! EnableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(0) 

DisableNonCountedBasicMotions 

Lưu ý rằng mã được đưa vào đây cho thuận tiện, nhưng tôi sẽ kiểm tra với gist cũng để xem nếu có đã được cập nhật/sửa lỗi.

Bạn có thể thư giãn các hạn chế đối với chuyển động ngang, hoặc thêm/gỡ bỏ các chuyển động khác bằng cách thiết lập danh sách các phím/lệnh được thực hiện, g:keys_to_disable_if_not_preceded_by_count, trong ~/.vimrc của bạn. Ví dụ, sau đây chỉ thực thi chuyển động đếm-tiền tố cho "j" và "k":

let g:keys_to_disable_if_not_preceded_by_count = ["j", "k"] 

Ngoài ra, như đã nêu trong gist, bạn có thể tìm thấy nó thực sự hữu ích để thêm một cái gì đó như thế này trong ~/.vimrc của bạn cũng như mã ở trên:

set number 
if has('autocmd') 
augroup vimrc_linenumbering 
    autocmd! 
    autocmd WinLeave * 
       \ if &number | 
       \ set norelativenumber | 
       \ endif 
    autocmd BufWinEnter * 
       \ if &number | 
       \ set relativenumber | 
       \ endif 
    autocmd VimEnter * 
       \ if &number | 
       \ set relativenumber | 
       \ endif 
augroup END 

Hoặc cài đặt dòng plugin vim-numbers.

Mặc dù câu hỏi này đã được trả lời cho sự hài lòng của OP với phương pháp thay thế, tôi thêm giải pháp của tôi ở đây trong trường hợp có ai đó đang tìm kiếm một thứ gì đó khác.

+0

Điều này thật tuyệt vời, tôi vừa thêm nó! Thật tuyệt vời nếu bạn bao gồm mã ở đây, nhưng tôi hài lòng với ý chính. Cảm ơn! – Thomas

+1

Tôi đã thêm mã, nhưng giữ liên kết đến ý chính vì tôi sẽ cập nhật ý chính bằng các cải tiến/sửa lỗi. – Jeet

9

Bạn lắng nghe những người khác waaay quá nhiều. Chỉ cần sử dụng để di chuyển bất kỳ phím nào bạn thích nhất và chỉ để lại các phím khác. Remapping hjkl phím là hơi rắc rối, và tốt nhất không được thực hiện, bởi vì họ đang hardcoded trong vim do lý do lịch sử.

+0

Tôi đi đến kết luận bản thân mình, và cung cấp một liên kết trong trường hợp ai đó đã quan tâm đến lý do tại sao tôi có thể cảm thấy như thế này. Tôi thường thấy mình đang giữ phím j trong khi chờ đợi ở một phần khác của một tài liệu do bản năng tiềm thức sâu thẳm nào đó, và tôi muốn tiêu tan thói quen này. Nhưng nó rất hữu ích khi nghe rằng các phím hjkl remapping đặc biệt khó khăn, tôi có thể phải học cách khó khăn, thực hành và làm phiền để suy nghĩ về nó. – Thomas

+0

@Thomas - Vâng, hãy remap một số phím bổ trợ bằng các phím hjkl, để đưa bạn xuống toàn bộ màn hình, nếu bạn không muốn chờ đợi. Hoặc một cái gì đó tương tự. Vim thực sự có rất nhiều lựa chọn để di chuyển. – Rook

+0

Vấn đề của tôi (được thừa nhận là nhỏ) là bởi vì tôi chỉ có thể tiếp tục giữ j và chờ đợi, tôi sẽ không đủ động cơ để thử những thứ khác. Tôi nghĩ rằng tôi có thể chỉ cần vô hiệu hóa hjkl cho một vài ngày (không hiệu quả). – Thomas

6

EDIT

Sau khi đọc chỉnh sửa của bạn và nhận xét của bạn ở đây là giải pháp triệt để Tôi đề nghị: remap hjkl để làm những việc siêu khó chịu:

nnoremap h $ 
nnoremap l 0 
nnoremap j gg 
nnoremap k G 
" and so on for other modes 

hjkl được ánh xạ tới điều ngược lại cực đoan của họ hành vi ban đầu, về cơ bản làm cho chúng hoàn toàn không sử dụng được. Bạn cũng nên làm tương tự cho các từ đồng nghĩa của chúng (:h h, :h j, :h k, :h l) để hoàn thành nhưng có những trường hợp khi chuyển động theo từng ký tự/từng dòng hữu ích. Trong những trường hợp như vậy, bạn sẽ rất vui khi có + hoặc - hoặc <Space>.

Tôi không thực sự thích loại phương pháp pavlovian đó. Tôi thấy nó quá tàn bạo và rủi ro mà bạn thực sự quen với những ánh xạ kỳ lạ này có vẻ khá cao.

END EDIT

phiên bản ngắn:

Cả phím mũi tên cũng không hjkl có giá trị sử dụng rất remappings của bạn là cuối cùng vô dụng. Sau một thời gian, bạn sẽ quen với các chuyển động và các đối tượng văn bản của Vim. Sử dụng những gì cảm thấy tự nhiên hơn cho bạn trong khi chờ đợi. Đừng vội vàng. Nó sẽ đến. Một cách tự nhiên.

phiên bản Long:

Bạn có phải là nhân viên đánh máy cảm ứng? Hay bạn có kế hoạch học gõ gõ?

Tôi không phải là người đánh máy liên lạc và tôi không có ý định trở thành một người: Tôi chỉ sử dụng hjkl để thực sự nhập hjkl vào chế độ INSERT.

Khi tôi cần di chuyển 1 hoặc 2 dòng ở trên hoặc dưới mà không có "mục tiêu" cụ thể, tôi sử dụng các phím mũi tên, khi tôi cần di chuyển một vài chữ cái sang trái hoặc phải tôi sử dụng các phím mũi tên. Không có sự xấu hổ khi làm điều đó.

Có một vấn đề, tuy nhiên, khi bạn gõ jjjjjjjjjj hoặc nhấn vào mũi tên xuống chìa khóa 10 lần để di chuyển xuống 10 dòng: jjjjjjjjjjj rõ ràng là chỉ là xấu như

Câu thần chú ngu ngốc này "không sử dụng các phím mũi tên" chỉ là cây che khu rừng: nó được lặp lại thường xuyên đến mức nó tập trung vào các mẫu vô dụng/antipattern thay vì thực sự học những cách mạnh mẽ hơn.

Tôi không muốn diễn giải đẹp Your problem with Vim is that you don't grok vi. nhưng bạn có thể xem nó như là "mức độ giác ngộ":

  • Cấp 0 sẽ

    jjjjjjjjjjj hoặc↓ ↓ sau đó tất cả các phong trào ngang cần thiết để đạt được mục tiêu của bạn.

    Đọc những dòng trên, phải không khá rõ ràng rằng hjkl Vs cuộc tranh luận là hoàn toàn ngu ngốc?

    Cho dù bạn sử dụng một phương pháp hay phương pháp khác, bạn kết thúc việc nghiền bàn phím di chuyển theo chiều dọc và chiều ngang để đạt được giá trị bạn muốn chỉnh sửa. Thật là một sự lãng phí. Và những gì một sự lãng phí thời gian và năng lượng để buộc bản thân bạn sử dụng một phương pháp khác hơn vì cả hai đều đều xấu.

  • Level 1 sẽ

    10j22l đi xuống 10 dòng và đạt được mục tiêu của bạn 22 ký tự bên phải. Trong khi nó ít hơn rất nhiều đánh máy, bây giờ bạn phải đếm dòng và ký tự mà không phải là đặc biệt tốt hơn.

  • Level 2 sẽ

    10jwww đi xuống 10 dòng và đạt được mục tiêu của bạn 3 từ bên phải hoặc 10jf# đi xuống 10 dòng và nhảy đến chữ cái đầu tiên của mục tiêu của bạn (một hex giá trị màu).

    Hmm, điều đó tốt hơn rất nhiều.

  • Level 3 sẽ

    /#<CR> để nhảy trực tiếp đến mục tiêu của bạn (một hex giá trị màu, như trước đây). Nếu nó ở trên vị trí hiện tại của bạn, bạn sẽ làm ?#<CR>.

Nếu bạn là một nhân viên đánh máy liên lạc, hoặc được đào tạo để trở thành một, cuộc tranh luận được giải quyết: hjkl (hoặc jkl; như một số muốn remap họ) là nhanh chóng và tự nhiên và bạn không cần phải phím mũi tên ở tất cả và nếu bạn không phải là, những lợi ích của việc sử dụng hjkl qua là lúc tốt nhất tối thiểu.

Tập trung vào eEbBwWfFtT/?} và Công ty thay thế. Một chút tại một thời điểm. Đừng "ép buộc" bản thân bạn.

+0

Mục đích của tôi với câu hỏi này là vượt qua mức 0 - Tôi hoàn toàn đồng ý rằng hjkl trên các phím mũi tên không thực sự là điểm - tôi đề cập tắt các phím mũi tên như một ví dụ phổ biến về lời nhắc không sử dụng kỹ thuật, sử dụng nhiều năm trước khi tôi bắt đầu sử dụng vim. Bây giờ tôi muốn một lời nhắc tương tự không nhấn j nhiều lần, nhưng tiếc là nó xuất hiện khó khăn hơn để rebind hjkl hơn các phím mũi tên. – Thomas

+0

OK, tôi thích mô tả của bạn về quy trình của bạn. Bộ não của chúng tôi dường như không hoạt động theo cùng một cách;). Dù sao, tôi đã chỉnh sửa câu trả lời của tôi với một đề xuất. Nhân tiện, tôi không muốn "cấp 0" nghe có vẻ xấu hổ, tôi hy vọng bạn không hiểu sai. – romainl

+0

Rất tốt, cảm ơn. Tôi đã nghĩ rằng tôi sẽ cần phải sử dụng hjkl một số vẫn còn, nhưng nếu tôi bỏ qua thẳng để tìm kiếm để điều hướng tôi cho rằng tôi sẽ không, ít nhất là cho thời gian đào tạo ngắn. Đừng lo lắng, tôi đã không lấy điều "mức 0" tiêu cực - "mức độ giác ngộ" rất hữu ích. – Thomas

2

Một điều tôi đã tìm thấy rằng công trình là :noremap jj <nop>. Vim sẽ trì hoãn chuyển động j vì nó cho rằng bạn có thể đang mở rộng nó, điều này làm bạn chậm lại đủ để thử một thứ khác. Bạn cũng không thể giữ phím j nữa vì nó chỉ kích hoạt nút thay thế. Bạn vẫn có thể sử dụng nút trong trường hợp khẩn cấp, nhưng nó đủ bực bội để khiến bạn tránh nó trong việc chỉnh sửa hàng ngày.

Các vấn đề liên quan