有人可以向我解释为什么点(。)命令在VIM中非常有用吗?
现在我经常使用VIM,但是我从来没有使用dot(。)命令来重复之前的操作。 我一直在阅读它是多么的棒,但我从来没有看到任何真实世界的例子,这些例子对我来说是有意义的,也是我用VIM编写的。 什么是一些真实世界的例子,表明如何令人敬畏的点(。)命令是?
以下是我使用dot命令所做的一些操作:
- 比
:%s/\<word\>/replacement/gc
是在单词上,然后是cereplacement<esc>
,然后重复n.
。 如果你有两三次你的话,这很好。 如果您有几个要replace的单词,请转到下一个单词,点击*
然后再点击n.
- 当我想要左alignment某些块时:
<Ctrl-V>jjj<.....
或者在前面插入空格:<ctrl-v>jjjI<space><esc>....
- 在
dd
或dw
,点命令将删除另一行/单词
点命令发生的一个神奇的事情是,如果它重复一个使用了编号寄存器的命令,它将使用下一个编号的寄存器(见: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左边的'位置'和右边的点。