为什么dot(。)命令在VIM中如此有用?

时间:2011-09-06 19:24:30

标签: vim vi

我现在经常使用VIM,但我从不使用点(。)命令重复上一个操作。我一直在阅读它是多么棒的但是我从来没有看到任何对我有意义的真实世界的例子以及我在VIM中编码的方式。什么是现实世界的例子,显示点(。)命令有多棒?

8 个答案:

答案 0 :(得分:35)

以下是使用dot命令执行的一些操作:

  • 比单词:%s/\<word\>/replacement/gc *更简单,然后cereplacement<esc>,然后重复n.。如果您的单词出现两次或三次,这很好。如果您要替换多个单词,请转到下一个单词,再次点击* n.
  • 当我想左对齐某些块时:<Ctrl-V>jjj<.....或在前面插入空格:<ctrl-v>jjjI<space><esc>....
  • dddw之后,dot命令将删除另一行/单词

使用dot命令发生的一件神奇事情是,如果它重复使用编号寄存器的命令,它将使用下一个编号的寄存器(参见:help redo-register)。

说明:如果您在9行上执行了dd并希望按照删除它们的顺序还原它们,请执行:"1P........。请注意,寄存器1到9是Vim的删除环。 "1P将在光标前插入最后删除的文本,然后"2P将插入上次删除的文本,依此类推。

答案 1 :(得分:13)

我经常使用dw....来删除一系列单词而无需先对其进行心理计算。在该示例中,5dw是较少的字符,但我认为使用dot命令重复delete word而不是计算它们大约快3ms。

编辑我刚刚进行了一些编辑,并意识到还有另一种情况,我使用dot命令相当数量。我想在Vim中有一种更简单的方法来处理这种类型的东西,但是dot命令可以帮助解决以下和类似情况。以下基本上是“我做过一次的事情的一个例子,现在我想再重复几次。”我正在写一个新的测试(在C中)并且需要在其中嵌入一个字符串常量表示我从其他位置复制的SQL脚本。原始的多行(7行)脚本没有用双引号括起来,所以我这样做了:

  • 将脚本直接粘贴到代码中(文件中有7个新行)。
  • 将光标定位在第一个新行上。
  • 空间 空间 空间 空间 esc 在当前行上插入空格和开头报价。
  • j 六次为每个额外的行添加开场报价。
  • 重新定位到粘贴文本的第一行。
  • A \ n esc 用于放置换行符关闭当前行的报价。
  • j 再次六次将结束报价放在余下的行上。

答案 2 :(得分:7)

do_something();
do_another();
third_option();

现在,光标位于第一行:A<bs><cr>{<cr><cr>}<cr><esc>。现在点击j.j.

do_something()
{ 

}

do_another()
{ 

}

third_option()
{ 

}

答案 3 :(得分:3)

我最常见的例子是更改文本的缩进级别

>%...

或者只是重新执行特定的文本更改,例如在几个变量前插入(char *)

i(char *)<Esc>jjjwwww.jjjbb.

(或其他)

答案 4 :(得分:3)

所有其他答案都提供了很好的示例,我只想补充说dot非常棒,因为在某种程度上它是您最后一个键组合的自动宏,只有一个键。

虽然宏很棒,但它们使用起来有点麻烦,而dot总是可用的,即使功能较弱。

答案 5 :(得分:3)

对我来说,dot命令最初被击中或未命中,直到我开始以任何频率录制宏。记录有用宏的技巧是将问题表示为可重复的步骤。有时,点是唯一可以做的事情,或者至少使问题变得更容易。

另外,使用dot命令会强制您使用之前可能不需要的某些命令,例如:cw ct; ci“ca)因为他们将文本的删除/更改折叠成一个可以通过点重复的”动作“。

另外,除了点之外还有;我使用的频率低得多,但是当我做它非常有用时会重复最后一个文字动作。对于诸如w和b之类的东西,但对于诸如f之类的东西,这不是很有用;这是一个不错的小技巧。

答案 6 :(得分:2)

与上一张海报一样,我经常在删除时使用它:

  • dw...
  • dd...

在多行重复动作时:

  • iSomeText:[Esc]j.j.j.

答案 7 :(得分:2)

当你需要转换它时:

instance Movable Position where
    (x,y) --> Left  = (x-1,y)
    (x,y) --> Right = (x+1,y)
    (x,y) --> Up    = (x,y-1)
    (x,y) --> Down  = (x,y+1)

进入这个:

instance Movable Position where
    Position(x,y) --> Left  = Position(x-1,y)
    Position(x,y) --> Right = Position(x+1,y)
    Position(x,y) --> Up    = Position(x,y-1)
    Position(x,y) --> Down  = Position(x,y+1)

您可以使用左侧“位置”的视觉块选择和右侧的点。