不允许随后的h / j / k / l

时间:2015-09-01 06:42:31

标签: vim

我想强迫自己不要按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超时。

2 个答案:

答案 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模式使用它,并使其无法再使用。