有人可以向我解释为什么点(。)命令在VIM中非常有用吗?

现在我经常使用VIM,但是我从来没有使用dot(。)命令来重复之前的操作。 我一直在阅读它是多么的棒,但我从来没有看到任何真实世界的例子,这些例子对我来说是有意义的,也是我用VIM编写的。 什么是一些真实世界的例子,表明如何令人敬畏的点(。)命令是?

以下是我使用dot命令所做的一些操作:

  • :%s/\<word\>/replacement/gc是在单词上,然后是cereplacement<esc> ,然后重复n. 。 如果你有两三次你的话,这很好。 如果您有几个要replace的单词,请转到下一个单词,点击*然后再点击n.
  • 当我想要左alignment某些块时: <Ctrl-V>jjj<.....或者在前面插入空格: <ctrl-v>jjjI<space><esc>....
  • dddw ,点命令将删除另一行/单词

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

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

我用dw....经常删除一连串的单词,而不需要在脑子里先计数。 在这个例子中, 5dw是更less的字符,但我认为我使用点命令只需重复delete word就可以更快。

编辑我只是现在做一些编辑,并意识到有另一种情况,我使用点命令相当数量。 我会想象在Vim中处理这种types的事情有一个更简单的方法,但是dot命令有助于解决以下和类似的情况。 下面基本上是一个例子,“ 我做了一次,现在我想重复几次”。我正在写一个新的testing(在C中),需要embedded一个string常量,代表一个SQL脚本,我从另一个地方复制。 原来的多行(7行)脚本没有用双引号括起来,所以我这样做了:

  • 将脚本直接粘贴到代码中(文件中有7个新行)。
  • 将光标定位在第一个新行上。
  • 空间 太空 空间 esc插入空格和当前行开头报价。
  • j 六次增加每条附加行的开盘报价。
  • 重新定位到粘贴文本的第一行。
  • \ n esc在当前行放置换行符和结束引号。
  • j 六次再次把结束报价放在其余的线上。
 do_something(); do_another(); third_option(); 

现在,将光标放在第一行: A<bs><cr>{<cr><cr>}<cr> 。 现在打jj

 do_something() { } do_another() { } third_option() { } 

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

 >%... 

或者只是像在几个variables前面插入(char *)一样重新进行特定的文本更改:

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

(pipe他呢)

像以前的海报一样,我经常在删除时使用它:

  • dw...
  • dd...

当在多行上重复一个动作时:

  • iSomeText:[Esc]jjj

所有其他的答案提供了很好的例子,我只是想补充说, dot是伟大的,因为从某种意义上说,它是一个自动的macros,为您的最后一个组合键,只有一个键。

虽然macros是伟大的,他们有点麻烦使用,而dot总是可用的,即使不那么强大。

对于我来说,点命令是一开始就被击中或错过,直到我开始以任何频率录制macros。 logging有用的macros的技巧是将问题表示为可重复的步骤。 有时点是唯一可以做或者至less使问题变得更容易的事情。

而且,使用dot命令会迫使你使用某些你可能不需要的命令,比如:cw ct; ci“ca),因为它们将文本的删除/更改合并为一个可以通过点重复的”动作“。

此外,除了点也有; 我使用得less得多,但是当我做它非常有用的重复上一个文本议案。 对于像w和b这样的东西,对于像f这样的东西不是有用的; 它是一个很好的小窍门。

当你需要转换这个:

 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) 

你可以使用视觉块select左边的'位置'和右边的点。