首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止在vim中重复使用hjkl移动键

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

Stack Overflow用户
提问于 2012-02-02 08:34:16
回答 3查看 7.5K关注 0票数 19

由于我经常不使用vim提供的优秀的运动和文本对象(而且由于"Holding down 'j' is a vim anti-pattern,"),我希望vim能帮助我训练使用这些东西,而不是连续使用hjkl几次以上。

当我开始使用vim时,我很恼火,因为我没有使用hjkl移动,而是使用箭头键。为了提醒自己不要这么做,我重新映射了箭头键,以防止自己使用它们-我知道使用主键导航会是一个更好的长期计划,所以我去掉了使用有效的箭头键将获得的积极强化。

代码语言:javascript
运行
复制
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

我不再需要在我的.vimrc中使用这些映射,因为它工作得很好,我很快就切换了,而不必刻意去做。以类似的方式,我现在也想停止重复使用基本的移动键hjkl。我的设想是这样的:

代码语言:javascript
运行
复制
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

但这在视觉模式下会被打破,我想象在很多其他情况下,在不应该改变状态的情况下,在某些东西中间使用vim命令行会改变状态。我如何约束自己必须使用更复杂的动作?

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

EN

Stack Overflow用户

发布于 2015-03-03 23:58:40

我想提出一个更符合OP思维方式的解决方案。

正如here所讨论的那样,我也决定,如果没有计数,那么阻止某些动议是一个好主意。我也尝试了简单的直接重新映射,但这在许多上下文中都不起作用,正如OP所描述的那样。

但我最终还是想出了一种使用key maps that returned an expression的方法

代码语言:javascript
运行
复制
function! DisableIfNonCounted(move) range
    if v:count
        return a:move
    else
        " You can make this do something annoying like:
        " echoerr "Count required!"
        " sleep 2
        return ""
    endif
endfunction

function! SetDisablingOfBasicMotionsIfNonCounted(on)
    let keys_to_disable = get(g:, "keys_to_disable_if_not_preceded_by_count", ["j", "k", "l", "h", "gj", "gk"])
    if a:on
        for key in keys_to_disable
            execute "noremap <expr> <silent> " . key . " DisableIfNonCounted('" . key . "')"
        endfor
        let g:keys_to_disable_if_not_preceded_by_count = keys_to_disable
        let g:is_non_counted_basic_motions_disabled = 1
    else
        for key in keys_to_disable
            try
                execute "unmap " . key
            catch /E31:/
            endtry
        endfor
        let g:is_non_counted_basic_motions_disabled = 0
    endif
endfunction

function! ToggleDisablingOfBasicMotionsIfNonCounted()
    let is_disabled = get(g:, "is_non_counted_basic_motions_disabled", 0)
    if is_disabled
        call SetDisablingOfBasicMotionsIfNonCounted(0)
    else
        call SetDisablingOfBasicMotionsIfNonCounted(1)
    endif
endfunction

command! ToggleDisablingOfNonCountedBasicMotions :call ToggleDisablingOfBasicMotionsIfNonCounted()
command! DisableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(1)
command! EnableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(0)

DisableNonCountedBasicMotions

请注意,为了方便起见,这里包含了代码,但我也要检查一下gist,看看是否有更新/修复。

通过在~/.vimrc中设置受影响的关键帧/命令列表g:keys_to_disable_if_not_preceded_by_count,可以松弛水平运动的约束,或添加/移除其他运动。例如,下面的代码仅对"j“和”k“执行带有计数前缀的运动:

代码语言:javascript
运行
复制
let g:keys_to_disable_if_not_preceded_by_count = ["j", "k"]

此外,正如在gist中指出的,您可能会发现在~/.vimrc中添加类似以下内容以及上面的代码非常有用:

代码语言:javascript
运行
复制
set number
if has('autocmd')
augroup vimrc_linenumbering
    autocmd!
    autocmd WinLeave *
                \ if &number |
                \   set norelativenumber |
                \ endif
    autocmd BufWinEnter *
                \ if &number |
                \   set relativenumber |
                \ endif
    autocmd VimEnter *
                \ if &number |
                \   set relativenumber |
                \ endif
augroup END

或者安装一个插件行vim-numbers

尽管这个问题已经(很长时间)通过另一种方法得到了令OP满意的答案,但我在这里添加了我的解决方案,以防有人在寻找不同的东西。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9105540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档