禁止后续 h/j/k/l

问题描述 投票:0回答:3

我想强迫自己不要按

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
3个回答
2
投票

我已经检查过

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(无计数)错误。

主要的错误是,您只能通过按 2j3j 或更多键来重新激活它,而不能按任何其他键(这是可取的)。

原则上,可以通过按四个 hjkl 中的每一个来重新激活其余三个来修改该功能。然而,我认为理想的是每个 hjkl 都应该通过除了再次按下该键之外的任何操作来重新激活。


1
投票

根据定义,

timeout
是不可避免的,但您至少可以通过设置
timeoutlen
来减少超时。它默认为
1000
,相当长。您可能可以将其降低到
500
,特别是考虑到您计划仅暂时将其用作训练辅助工具。


0
投票

说实话,我最终像最初学习 Vim 的方式一样戒掉了这个习惯:我强迫自己花一两个小时在数字前面加上 j/k 来回走动。


以下是一种更独立的解决方案:一个函数和 hjkl 的四个映射。

没有计时器,但“重新激活”四个键中的每一个的唯一方法是使用它进行显式计数或使用其他三个键之一。

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
      模式使用它,并使其无法下次使用。
© www.soinside.com 2019 - 2024. All rights reserved.