我最近发现了Vim硬模式,因此决定尝试使用它。但是,我遇到了一些细微的运动问题。

例如,假设我真的只想向上或向下移动一行。由于禁用了jk,因此我不确定有更好的替代方法。

我想将一个或两个字符左右移动时遇到相同的问题。有谁知道如何取代这些类型的机芯?

这是我正在使用的插件:https://github.com/wikitopian/hardmode。

评论

多么愚蠢的插件!使用任何有效的方法。

我非常同意romainl的观点:学习如何在文件中进行有效导航是一件好事,但对自己强加这种插件并不是不必要的痛苦。仍然您可能会对我在这里的回答感兴趣(更确切地说是关于/和?的部分。

在此,我谨不同意statox和romainl。直接导航到要更改的目标可以极大地提高整体效率。是的,虽然这样一开始可能会使您放慢速度,但从长远来看,您将使用更好的导航来弥补失去的时间。

实际上,@ Archangel33我认为对于hjkl以外的其他方法进行更精确的导航是一件好事,我们对此持有相同的看法。我不赞成的是插件本身:在我看来,最好一次学习一次导航的新方法(您不能同时学习所有方法),而在学习过程中使用令您沮丧的插件不是必要。话虽如此,这只是我的意见:有人有权不同意:-)

@Alex的确,我的评论只是我的个人观点,我永远不会认为我拥有唯一且通用的解决方案,这就是为什么我的最后一句话是那句话。那只是我的观点:有人有权不同意。现在,争论可能是无止境的:当然有些人会从这种插件中受益,而它只会使其他插件受挫并损害他们的学习。如果您想谈论它,我很乐意在聊天中与您讨论,但是我们不应该在这种辩论中对问题的评论进行垃圾评论:-)

#1 楼

这些只是vim可以执行的动作中的一部分,这些应该让您立即行动。




使用Vim的内置帮助navigation或更高版本上的功能

在Google中搜索usr_03.txt

用/导航到单词
转到此处所有正确的动作


运动

有很多绕过vim的方法,我列出了通过搜索vim advanced movements找到的一些方法,还有一些我一直使用的方法。我确定您知道其中大多数,但我认为您也需要特别注意的是导航一词。

这里有一些允许在行内导航。



vim advanced movements –转到当前行的开头。

0 –转到该行的第一个非空白字符。

^ –转到当前行的末尾。

$ –转到该行的最后一个非空白字符。

用单词导航会很有帮助。为了更详细,您应该使用以下单词来导航单词:



g_ –转到当前单词的末尾。

e –移至当前WORD的末尾。

E –移至上一个(before)字。 br />
b –转到下一个单词。

B –转到下一个单词。

一个单词由字母,数字和
下划线。
单词由一系列由空格分隔的非空白字符组成。
words | WORDS也可能会根据您的vim设置而变化。

显示示例单词和单词之间的区别

w是单个单词。

W是七个单词。

搜索动作也非常有用。



192.168.1.1 –搜索一个模式,它将带您进入下一次出现的192.168.1.1



/pattern将带您进入光标下方的pattern的下一个匹配项。




n –搜索将要匹配的模式您将带您到上一个出现的pattern



?pattern将带您到光标上方的pattern的下一个匹配项。



N –转到光标下当前单词的下一个出现。
pattern –转到光标下当前单词的上一个出现。

* –转到匹配的花括号或代码内的括号。

您甚至可以在从命令行打开vim之前执行以下操作
#允许您转到打开文件后,将其移至文件的第N行。

%

Vim +N filename在出现vim +10 /etc/passwd的情况下将文件打开到第一行。在下面的示例中,vim将打开README文件并跳至单词“ install”的第一个匹配项。

Vim +/pattern filename

pattern打开文件至最后一个匹配项vim +/install README。在下面的示例中,它将打开README文件并跳转到单词“ bug”的最后一次出现。

Vim +?patten filename

#2 楼

作为硬模式的替代方法,下面的代码片段将允许您正常使用hjkl,但是当它们快速连续使用时,会发出蜂鸣声警告您。

function! s:BeepOnRepeat(key)
    let count1 = v:count1

    if !exists('s:last_time')
        let s:last_time    = reltime()
        let s:repeat_count = 1
    else
        " increment the repeat count if `h`, `j`, `k`, or `l` was pressed
        " within the last second, otherwise reset it
        let now = reltime()
        if str2float(reltimestr(reltime(s:last_time, now))) < 1
            let s:repeat_count += 1
        else
            let s:repeat_count = 1
        endif
        let s:last_time = now

        " produce an audible beep if a sequence of `h`, `j`, `k`, and/or `l`,
        " greater than three, was pressed (within the repeat count time limit)
        if s:repeat_count > 3
            let savebelloff    = &belloff
            let savevisualbell = &visualbell
            let &belloff    = ''
            let &visualbell = 0
            execute "normal! \<Esc>"
            let &belloff    = savebelloff
            let &visualbell = savevisualbell
        endif
    endif

    execute 'normal! ' . count1 . a:key
endfunction

nnoremap <silent> h :<C-u>call <SID>BeepOnRepeat('h')<CR>
nnoremap <silent> j :<C-u>call <SID>BeepOnRepeat('j')<CR>
nnoremap <silent> k :<C-u>call <SID>BeepOnRepeat('k')<CR>
nnoremap <silent> l :<C-u>call <SID>BeepOnRepeat('l')<CR>


有关限制hjkl使用的另一种方法,请参见vim-molasses。

#3 楼

另一种方法是使用中等模式,该模式仍会尝试学习“正确的动作”,但这样做的严格程度较低: br />不能完全禁用它们。默认情况下,中等模式将仅
允许连续两个字符方向的动作。


#4 楼

我遇到了同样的问题,然后输入了:help hardmode Lo,然后发现我发现了

'g:HardMode_level' If set to 'wannabe' 
arrow keys disabled, but not   hjkl etc.                                                                                              


我是vim初学者之一,发现此插件非常有用,因为它确实把我从老鼠身上推开。