Vim HardMode细颗粒运动


11

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

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

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

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


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

我真的同意romainl的观点:学习如何在文件中有效导航是一件好事,但是对自己强加这种插件并不是不必要的痛苦。不过,你可以在我的答案有兴趣在这里(更精确地对部分/?
statox

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

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

1
@Alex确实,我的评论只是我的个人观点,我永远不会认为我拥有唯一且通用的解决方案,这就是为什么我的最后一句话是That being said it is only my opinion: one has right to disagree。现在,争论可能是无止境的:当然,有些人会从这种插件中受益,而它只会挫败其他插件并损害他们的学习。如果您想谈论它,我会很乐意在聊天中与您讨论,但是我们不应该通过这种辩论来垃圾评论这个问题:-)
statox

Answers:


17

这些只是vim可以执行的动作中的一部分,这些应该让您暂时入手。

TL; DR

  1. 使用Vim内置的帮助功能navigation或更有效usr_03.txt
  2. 搜索谷歌 vim advanced movements
  3. 导航至/至单词
  4. 去这里正确的举动

机芯

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

以下是一些允许在一行内导航的内容。

  • 0 –转到当前行的开头。
  • ^ –转到该行的第一个非空白字符。
  • $ –转到当前行的末尾。
  • g_ –转到该行的最后一个非空白字符。

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

  • e –转到当前单词的末尾。
  • E –转到当前WORD的末尾。
  • b –转到上一个(之前)的单词。
  • B –转到上一个(之前)的单词。
  • w –转到下一个单词。
  • W –转到下一个单词。

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

示例显示WORD和Word之间的区别

192.168.1.1 是单字。

192.168.1.1 是七个字。

搜索动作也可能非常有用。

  • /pattern –搜索模式,将您带到下一次出现的模式 pattern
    • n将带您到pattern光标下方的下一个匹配项。
  • ?pattern–搜索一个模式,将您带到上一个出现的位置pattern
    • N将带您到pattern光标上方的下一个匹配项。
  • * –转到光标下当前单词的下一个出现位置。
  • # –转到光标下当前单词的上一个出现位置。
  • % –转到代码中匹配的花括号或括号。

您甚至可以在打开vim之前执行以下操作,从命令行打开 Vim +N filename文件后,可以转到文件的第N行。

vim +10 /etc/passwd

Vim +/pattern filename出现时,将文件打开到第一行pattern。在以下示例中,vim将打开README文件并跳转到单词“ install”的第一个出现。

vim +/install README

Vim +?patten filename将文件打开到最后一次出现pattern。在下面的示例中,它将打开自述文件并跳转到单词“ bug”的最后一次出现。

vim +?bug README


8

作为替代hardmode,下面的代码片段将允许您使用hjk,和l正常的,但产生的蜂鸣声,提醒你,当他们在连续快速使用。

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

或者,使用中等模式,该模式仍会尝试学习“正确的举动”,但这样做的严格程度较低:

中型模式是一个Vim插件,它可以限制角色的动作,但不能完全禁用它们。默认情况下,中等模式仅允许两个连续的按字符移动。


1

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

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

顺便说一句,我是发现该插件非常有帮助的vim初学者之一,因为它确实使我远离了鼠标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.