防止在vim中重复使用hjkl移动键

Tho*_*mas 19 vim

因为我经常不使用优秀的运动和文本对象是Vim中,(既然"按住'J’是一个Vim反模式"),我想vim的帮助我在训练中使用这些替代hjkl连续使用几次.

当我开始使用vim时,我很生气,我没有使用hjkl移动,而是使用箭头键.在此提醒不能做到这一点,我重新映射箭头键来让自己从使用它们-我知道使用家用行导航将是一个更好的长期计划,所以我切出的积极强化我想先有工作箭得到键.

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
Run Code Online (Sandbox Code Playgroud)

我不再需要在我的.vimrc中使用这些映射,因为这非常有效,而且我很快就切换了,而不必有意识地这样做.以类似的方式,我现在也想切断我对基本运动键的重复使用hjkl.我想象的是这样的:

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
Run Code Online (Sandbox Code Playgroud)

但是这在视觉模式下中​​断了,我想在很多其他情况下,在某些东西中使用vim命令行会在不应该的时候改变状态.我如何限制自己必须使用更复杂的动作?

编辑:问题在前两个答案后编辑,为清晰起见,段落重新排序.我想从vim超越romainl的"0级"获得一些帮助.到目前为止,答案建议我不要浪费我的时间,但如果我们假设我是学习技术的粉丝,我通过改变我的环境来改变我的习惯以改变激励措施呢?在这个模型中,我想完成一项任务,比如向下滚动页面,我会或多或少地随机尝试组合键,直到我完成任务.我脑中的多巴胺信号传导等将加强最终实现这一结果的作用.我可以专注于记住不使用hjkl,或者我可以专注于我最初尝试做的任务,编辑文本,而没有真正考虑它发现自己使用更有效的编辑技术.

Roo*_*ook 9

你听别人说太多了.只需使用您最喜欢的任何键移动,并留下其他键.重新映射hjkl密钥有点麻烦,最好不要做,因为由于历史原因它们在vim中被硬编码.


rom*_*inl 6

编辑

阅读完你的编辑后,你的评论就是我提出的根本解决方案:重新映射hjkl做出令人讨厌的事情:

nnoremap h $
nnoremap l 0
nnoremap j gg
nnoremap k G
" and so on for other modes
Run Code Online (Sandbox Code Playgroud)

hjkl被映射到与其原始行为极端相反的情况,基本上使它们完全无法使用.你应该做同样为它们的同义词(:h h,:h j,:h k,:h l)也出于完整性,但有些时候字符一个字符/行由行运动是有益的.在这种情况下,你会很高兴有+-<Space>.

不过,我真的不喜欢那种帕夫洛伊式的方法.我发现它太残酷了,你实际习惯这些奇怪的映射的风险似乎很高.

结束编辑

精简版:

箭头键也没有hjkl值得使用,所以你的重映射最终是无用的.过了一会儿,你会习惯Vim的动作和文本对象.在此期间使用对您来说更自然的感觉.不要急于求成.它会来.自然.

长版:

你是一个打字员吗?或者你打算学习触摸打字?

我不是一个触摸打字员,我不打算成为一个:我hjkl只使用hjklINSERT模式实际输入.

当我需要在没有特定"目标"的情况下在上方或下方移动1或2行时,我使用箭头键,当我需要向左或向右移动几个字母时,我使用箭头键.这样做并不可耻.

但是,当您键入jjjjjjjjjj或按下向下箭头键10次向下移动10 行时会出现问题:jjjjjjjjjjj显然与

这个愚蠢的"不使用箭头键"的咒语只是隐藏森林的树:它经常重复,它会让你专注于无用的模式/反模式,而不是实际学习更强大的方法.

我不想解释美丽你和Vim的问题在于你不会理解vi.但你可以把它看作是"启蒙的水平":

  • 等级0将是

    jjjjjjjjjjj或者然后所有必要的水平移动来达到你的目标.

    阅读上面的hjkl一句话,Vs 辩论绝对是愚蠢的并不是很明显吗?

    无论您使用一种方法还是另一种方法,最终都会使键盘垂直和水平移动,以达到您想要编辑的值.多么浪费.浪费时间和精力迫使自己使用一种方法而不是另一种方法,因为两者都同样糟糕.

  • 等级1将是

    10j22l向下走10行并向右移动目标22个字符.虽然输入的次数要少得多,但你现在必须计算线条和字符并不是特别好.

  • 等级2将是

    10jwww向下移动10行并向右移动目标3个单词或10jf#向下移动10行并跳转到目标的第一个字母(十六进制颜色值).

    嗯,那好多了.

  • 等级3将是

    /#<CR>直接跳到目标(十六进制颜色值,如前所述).如果它高于你当前的位置,你会这样做?#<CR>.

如果你是一个触摸打字员,或者正在接受培训,那么辩论就会得到解决:( hjkl或者jkl;有些人喜欢重新映射它们)是快速而自然的,你根本不需要箭头键,如果你不是,那么好处使用hjkl过度充其量是最小的.

专注于eEbBwWfFtT/?}和公司.一次一点.不要"强迫"自己.


Hov*_*uch 6

我发现有效的一件事是:noremap jj <nop>. Vim 会延迟这个j动作,因为它认为你可能会扩展它,这会减慢你的速度以尝试其他的东西。您也不能再按住j键,因为它只会触发 nop。您仍然可以在紧急情况下使用该按钮,但它令人沮丧到足以让您在日常编辑中避免使用它。