从常规移动走向 Vim (<left> <right> <up> <down> <backspace>)

Toward Vim moves from conventional moves (<left> <right> <up> <down> <backspace>)

我不想和我的编辑一起打高尔夫球。我只是想通过 vim 提高我的编辑技巧。

让我们考虑一下我想转换为 C 的程序集。为了有条不紊地进行,我想逐行迭代地进行小的更改。

    dm(__abcd_bar_id + axis) = f4;
    f1 = dm(_abcd_foo_id + axis);
    f5 = f4 - f1;

这个例子的作业是:

  1. 将第一行简化为abcd_bar_id[axis] = f4
  2. 将第二行简化为f1 = abcd_foo_id[axis]
  3. 将第三行的f1替换为第二行
  4. 删除第二行

这些步骤是没有商量余地的。我知道我可以使用如下所示的正则表达式轻松摆脱所有 dm(__variable + index),但这是题外话。

:%s/dm\s*(\s*_\+\(\w\+\)\s\++\s\+\(\w\+\)\s*)/[]/g

因此,为了实现这些更改,我通常会这样做:

DelDelDelDelDel[DelDelDel] 删除删除删除[ ]删除 主页DelDelDel删除 Shift+End Shift+ Ctrl+c 结束退格退格 Ctrl+v

结果应该是这样的:

abcd_bar_id[axis] = f4;        
f5 = f4 - abcd_foo_id[axis];

拯救我的是我多次快速击中同一个键。但是我相信如果我使用 vi 功能我可以更有效率

vfahd
wh3lx i[wr] j:%s/ dm(_//输入 f+hv2 lxi[Escwr] $hvF2 ay jf1hh plxxx

好吧,在我看来,这对我的大脑来说要复杂得多,因为在每次击键之前都需要预处理 bain-time。

例如,如果我想移动到f1,如果在去f1的路上没有其他1,我需要用眼睛解析。

我真的觉得我需要多年的训练才能 'fluent' 和 vim。

所以问题是:

我绝对不认为自己是 vim 大师,尽管我每天都在使用它。先回答你的第二个问题,可能有人可以被当成大师,vim中的选择和可能性实在是太多了,每个人都可以有自己的做事方式。此外,由于您可以根据需要定制 vim,因此可以轻松简化常规任务,并且这些配置可能会有很大差异。还有一些被我视为大师的人(例如,Derek Wyatt)声称在 vim 方面还有很多东西要学习,所以要成为大师肯定需要数年时间。

但是不要气馁,只需要一些练习就可以开始思考 vim 方式,您的编辑任务会变得容易得多:)

回到你的例子。首先,我会用更少的击键来编辑第一行:

dta

f)r]

bdTd

i[

就击键次数而言,差异并不大,但它说明了不同的方法。在我看来,它允许更少的预处理,这是你强调的问题。我将这些击键分成几个部分来向您展示我的思考过程:

  • delete till a

  • find ) and r将其替换为]

  • back 一个词并且 delete Till (向后) d

  • insert [

当我应用这些更改时,我不必考虑太多。你可能认为这是违反直觉的,我先跳到 ) 个字符,但我发现右括号比数单词或 多次点击 hl。当然,您可能知道击键,但是当您编辑某些内容时,您并不总是记得所有的击键。这需要练习并强迫自己使用其中的一些(比如 t/T) 把它们牢牢地放在你的手指下。另外,打印一个 cheat-sheet 尝试使用每一个键,直到你能记住它。不会花很长时间 ;)

正如 William 已经在评论中建议的那样,我也会在这里考虑宏。它是一个功能强大且易于使用的工具,可以真正使您的更改自动化。 我已经知道如何编辑第一行。在你的例子中,我知道在第二步我会做同样的事情,但位置略有不同,所以我没有编辑第一行,而是立即录制了一个宏,但我必须让它通用 为了更容易的应用。所以我考虑先将光标放在适当的位置,然后再进行任何更改。我的宏看起来像这样:

qq

0fd dta f)r]bdTd i[

q

注意,我在开头添加了3次击键(不包括qq,它开始录制宏到q寄存器)。这在第一行中可能看起来多余,但它确保在进行任何更改之前光标的正确位置。 这样我就可以很容易地在第二行应用这个宏 @q

现在,您必须替换第三行中的 f1。你的光标还在第二行,所以你只需猛拉一下: 0fay$

然后粘贴到第三行: j$bPl D

当您只编辑 3 行时,使用宏似乎是一件多余的事情,但是当您习惯以 vim 方式进行更改时,您会真正感觉到您正在利用它的强大功能.

要记住录制的宏并不难,你必须有正确的态度。首先,您将宏记录到寄存器中,因此键入 :registers 也会显示您的宏。其次,你可以编辑它们, 通过粘贴特定的寄存器,改变它然后保存到同一个寄存器。然后你就可以用@[register_letter]来玩了。最后,不要依附于特定的宏。保存一两个,使用它们在 一次忘记他们。然后在同一个字母下记录另一个。例如,如果您意识到必须对整个文件进行一些重复更改,请使用 qq,因为它既快速又直观。做出改变后你很少 需要再次播放同一个宏,因为整个缓冲区已经处于正确状态。但是,如果您知道您将需要它,请在另一个字母下记录下一个宏。如果您习惯以 vim 的方式直观地进行更改,那么 它们很容易被重复,你会发现录制另一个宏比试图记住你在哪个字母下录制前一个宏要容易得多。

我希望这个答案能让你相信,你不需要多年的训练就能流利,但当然这不会在一夜之间发生;)