我想强迫自己不要按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超时。
答案 0 :(得分:2)
我已经检查过vim-hardtime
,但是它也阻止了我执行 2 j 9 j之类的操作在超时时间内,我几乎不会说这是一个坏习惯,而是在导航时突然改变主意。
以下内容可能是您可以开发自己的插件的起点(将其放入.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 (无计数)错误。
主要故障是只能通过按 2 j , 3 j 或而不是按其他任何键(这是比较理想的)。
原则上,可以按以下方式修改功能:按下四个 h j k l < / kbd>重新激活其余三个。但是我认为理想的是应该通过除以下以外的任何措施重新激活每个 h j k l 再次按下该键。
答案 1 :(得分:0)
以下是一个更完备的解决方案: 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
处理的信息。a:count
为零
a:key
未被过度使用的情况下,它才会使所有四个密钥可供下次使用; a:key
并未被过度使用,那么它将以normal
模式使用它,并使其无法再使用。