【问题标题】:Why the dot (.) command is so useful in VIM?为什么点 (.) 命令在 VIM 中如此有用?
【发布时间】:2011-11-11 14:36:13
【问题描述】:

我现在经常使用 VIM,但我从不使用点 (.) 命令来重复前面的操作。我一直在阅读它有多棒,但我从来没有看到任何对我有意义的真实世界示例以及我在 VIM 中编码的方式。有哪些真实世界的例子可以说明点 (.) 命令有多棒?

【问题讨论】:

  • 我在 vim 存在之前就使用 vi 并且使用了 .命令相当多,但我从来没有听过有人对它有多棒赞不绝口。也许我没有阅读正确的粉丝页面。
  • 我最近开始阅读 Drew Neil 的《实用 Vim》。本书从 .操作员,并试图让您理解为什么认为它可以提高您的工作效率。也许看看。
  • 我用'.'每时每刻。这是我传给新手的第一个技巧。也许你想多了。当你想再做一次时,只需点击一下。删除五行? dd dot dot dot dot...感受一下潮水!

标签: vim vi


【解决方案1】:

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

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

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

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

【讨论】:

  • 哦,我一直在寻找这样的东西来加快搜索和替换。很多次我找到了一些东西,然后想改变它,其他人很快就会喜欢它。谢谢你。
  • 一个人怎么能重复n次n .,而不是多次重复n.
【解决方案2】:

我经常使用dw.... 来删除一系列单词,而无需先在心里数数。在该示例中,5dw 的字符数较少,但我认为使用 dot 命令重复 delete word 超过计数会快 3 毫秒。

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

  • 将脚本直接粘贴到代码中(文件中新增 7 行)。
  • 将光标定位在第一行。
  • 空格空格空格空格"esc 在当前行插入空格和开引号。
  • j. 六次,为每一行添加开头引号。
  • 重新定位到粘贴文本的第一行。
  • A\n"esc 放置换行符和右引号当前行。
  • j. 重复六次以将结束引号放在剩余的行上。

【讨论】:

  • 您的最后一个示例使用 Visual Block 可能更容易:转到脚本的开头。使用Ctrl-vCtrl-q 调用块选择。点击6j 向下移动到最后一行。点击$ 选择到行尾。键入 I "<Esc> 以放置起始引号。点击gv 重新选择您的区块。输入 A\n"<Esc> 关闭报价。
  • @pydave:这很酷。我想可能有更快的方法。我正在使用带有 vim 仿真的 SlickEdit,但这个技巧对我不起作用(但这可能是因为我使用的是旧版本)。 vim 仿真有一些我不喜欢的问题,但 SlickEdit 中的标记功能非常好,这让一些怪癖值得。
  • 另一种方式::,+6s/.*/ "&\\n"V6j:s/.*/ "&\\n"(替换部分中的& 替换为匹配的模式)。
【解决方案3】:
do_something();
do_another();
third_option();

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

do_something()
{ 

}

do_another()
{ 

}

third_option()
{ 

}

【讨论】:

    【解决方案4】:

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

    虽然宏很棒,但使用起来有点麻烦,而 dot 始终可用,即使功能较弱。

    【讨论】:

      【解决方案5】:

      和之前的海报一样,我删除的时候也经常用到:

      • dw...
      • dd...

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

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

      【讨论】:

      • 这就像经典的例子。但是为什么不把 'yy' 和 'p' 重复一遍呢?
      • 嗯,这不适用于使用多次击键的命令,例如iSomeText[Esc]cereplacement[Esc](来自其他答案)。在p 的情况下,您是对的,只需重复p
      • 对于您的最后一个示例,有时您可以使用块选择来选择几行的列并使用 I 或 A。例如 Ctrl+vjjjISomeTextEsc。虽然很好地使用了点。
      • 你是对的 - 块选择是处理这个问题的好方法。而且...在你这样做之后,你可以使用. 在另一个块或另一行上重复它。
      【解决方案6】:

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

      >%...
      

      或者只是重新做一个特定的文本更改,比如在几个变量前面插入(char *)

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

      (或其他)

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案8】:

          当您需要转换时:

          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)
          

          您可以对左侧的“位置”使用可视块选择,而在右侧使用点。

          【讨论】:

          • 我的 goto 将使用 Visual Block 选择并在开始位置插入光标在开始括号上。 &lt;C-v&gt;3j&lt;I&gt;Position&lt;escape&gt;
          猜你喜欢
          • 2011-03-03
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 2018-07-02
          • 1970-01-01
          • 2015-12-10
          • 2017-06-05
          • 1970-01-01
          相关资源
          最近更新 更多