我想强迫自己不要按
jjjjj
,而是使用5j
。我正在寻找一种禁止/禁用此类后续运动使用的解决方案。
最初练习
h/j/k/l
而不是我使用的箭头
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>
我尝试做类似的事情
nnoremap jj :echoe "Use xj"<CR>
nnoremap ll :echoe "Use xl"<CR>
nnoremap kk :echoe "Use xk"<CR>
nnoremap hh :echoe "Use xh"<CR>
但是这样就导致即使用
5j
跳转也需要等待vim超时。
我已经检查过
vim-hardtime
,但它也阻止我在超时内做类似2j9j的事情,我很难称之为坏习惯,而是突然改变主意导航时。
以下内容可能是一个起点(放入您的
.vimrc
文件中),您可以从中开发自己的插件:
nno <silent> j :<C-U>execute "call Restrictedj(" . v:count . ")"<CR>
let g:moved1 = v:false
fu! Restrictedj(count)
if a:count > 1
exe line('.') + a:count
let g:moved1 = v:false
else
if !g:moved1
exe line('.') + 1
else
echoe 'Use xj'
end
let g:moved1 = v:true
end
endf
这样的代码在第二次使用时会产生j(无计数)错误。
主要的错误是,您只能通过按 2j、3j 或更多键来重新激活它,而不能按任何其他键(这是可取的)。
原则上,可以通过按四个 hjkl 中的每一个来重新激活其余三个来修改该功能。然而,我认为理想的是每个 hjkl 都应该通过除了再次按下该键之外的任何操作来重新激活。
根据定义,
timeout
是不可避免的,但您至少可以通过设置timeoutlen
来减少超时。它默认为1000
,相当长。您可能可以将其降低到 500
,特别是考虑到您计划仅暂时将其用作训练辅助工具。
说实话,我最终像最初学习 Vim 的方式一样戒掉了这个习惯:我强迫自己花一两个小时在数字前面加上 j/k 来回走动。
以下是一种更独立的解决方案:一个函数和 h、j、k、l 的四个映射。
没有计时器,但“重新激活”四个键中的每一个的唯一方法是使用它进行显式计数或使用其他三个键之一。
fu! NoRepHJKL(count, key, selfCall)
if !exists('g:can_use')
let g:can_use = { 'h': v:true, 'j': v:true, 'k': v:true, 'l': v:true }
endif
if a:count > 0
execute "normal! " . a:key
call NoRepHJKL(a:count - 1, a:key, v:true)
else
if a:selfCall || g:can_use[a:key]
let g:can_use.h = v:true
let g:can_use.j = v:true
let g:can_use.k = v:true
let g:can_use.l = v:true
endif
if !a:selfCall && g:can_use[a:key]
execute "normal! " . a:key
let g:can_use[a:key] = v:false
endif
endif
endf
nn <silent> h :<C-U>call NoRepHJKL(v:count, 'h', v:false)<CR>
nn <silent> j :<C-U>call NoRepHJKL(v:count, 'j', v:false)<CR>
nn <silent> k :<C-U>call NoRepHJKL(v:count, 'k', v:false)<CR>
nn <silent> l :<C-U>call NoRepHJKL(v:count, 'l', v:false)<CR>
功能
a:count
是正数(这包括 1
),它会在 a:key
模式下使用密钥(通过参数 normal
给出)并递归地调用自身,并减少 a:count
参数,并且有信息表明它正在a:selfCall
ing。a:count
为零
a:key
没有被过度使用时,它才会使所有四个键可供下次使用;a:key
没有被过度使用,则以normal
模式使用它,并使其无法下次使用。