为什么在宏中使用单词时更改大小写会改变行为?

时间:2018-10-15 09:25:51

标签: vim

我正在将某些单词更改为大写,我按viw~将单词的大小写从小写改为大写。我向前移动了一个单词,然后按.对下一个单词重复操作,我注意到它影响前面的某些单词字母的大小写,而在其他时候,它不会更改整个单词的大小写

这是一个在单个句子的文件上用vim -u NONE完成的示例

  

这是一个测试句子

将光标放在句子开头, v i w 我的句子现在是:

  

这是一个测试语句示例

我用 w 向前移动1个单词,然后按重复该操作。 我的句子现在是:

  

这是一个测试语句示例

w

  

这是示例测试语句

w

  

这是一个巨大的测试语句

w

  

这是例题

当我改为将动作捕获为宏而不是使用时,也会发生相同的行为。

我怀疑vim只是在更改与第一个单词相同的字母大小写,但是为什么呢?为什么viw在宏中不起作用?

2 个答案:

答案 0 :(得分:5)

在等于上一个命令所覆盖区域的区域上重复执行该操作。这与宏无关。

来自:help .

Note that when repeating a command that used a Visual selection, the same SIZE
of area is used, see visual-repeat.

并且来自:help visual-repeat

When repeating a Visual mode operator, the operator will be applied to the
same amount of text as the last time:
- Linewise Visual mode: The same number of lines.
- Blockwise Visual mode: The same number of lines and columns.
- Normal Visual mode within one line: The same number of characters.
- Normal Visual mode with several lines: The same number of lines, in the
  last line the same number of characters as in the last line the last time.
The start of the text is the Cursor position.  If the "$" command was used as
one of the last commands to extend the highlighted text, the repeating will
be applied up to the rightmost column of the longest line.

Vim的优势之一是您无需执行许多操作即可选择文本。在这种情况下,您应该使用:help g~运算符,它将以更直观的方式与.重复:

g~iw

代替:

viw~

demo

答案 1 :(得分:4)

  

我怀疑vim只是在更改相同数量字母的大小写[...]

您是对的。为了达到您的期望,Vim必须记住您如何创建视觉选择。在您的示例中,这很容易(iw),但是您可以应用多个文本对象和移动,使用o移至所选内容的另一侧,进行修改,依此类推。这将很难在其他地方重新创建,并且为了避免不一致的行为,Vim始终表现出愚蠢的行为,并在使用.命令重做时仅使用选择的先前宽度。

如果要对某个文本对象或动作应用操作,请跳过视觉模式,而使用相应的动作映射;例如g~iw而不是viw~