通过正则表达式替换用VIM粘贴

通过正则表达式替换用VIM粘贴

我正在使用 VIM 的y命令复制一些代码(多行),并希望使用p-command 将其粘贴到文件中的其他位置。

但是,我想在对其进行一些更改后快速粘贴复制的代码。例如,我想将复制的代码转换为大写(复制“hello”但粘贴“HELLO”)。

附加示例是添加一些缩进:

复印:

function hello() {
}

但粘贴:

   function hello() {
   };

有什么快速的方法可以做到吗?使用最少的命令、文件/配置更改以及更好地使用标准方式/命令/框架来尽可能地做到这一点,因为我想要一个适用于许多平台(包括旧平台)的解决方案、macOS 的 vim 等等。

PS 如果还有其他内置方法,特别是根据粘贴位置粘贴具有正确缩进的代码,我也很想知道。但是,仍然想了解如何在粘贴复制的内容之前对其执行随机正则表达式(即使它不是源代码)。

答案1

vim和(基于行)或, (基于字符)中'[的标记用于标识先前更改或拉出/粘贴的文本的边界。']`[`]

因此>']将缩进光标位置和之后粘贴文本末尾之间的代码p

gU`[after p/P将从光标到粘贴开始的文本大写。

答案2

您不需要正则表达式搜索和替换来更改字母或单词的大小写。

  • ~可以翻转字母、单词、方向、选择等的大小写。例如,将光标移动到hofhello并键入~w以将整个单词更改为HELLO
  • gU不会翻转大小写,而是将文本更改为大写。例如,如果你有hElLo,那么将光标移动到h并键入gUw,它会变成HELLO
  • gu 将文本更改为小写 - 例如,将光标移动到HHELLO 中,然后键入guw将其更改为hello

这只是一个最小的概述。输入更多选项和详细信息:help casevim


您可能还想研究 vim 的宏/键映射功能来自动执行重复的编辑任务 ( :help macro)。我通常会映射,;到我目前需要的任何重复但临时的编辑任务(是的,我知道它们已经在 vi 中使用,但我很少(如果有的话)使用它们。而且它们都很方便地彼此靠近和.),所以我可能会映射,移动到行的开头,向前移动一个单词,然后从光标开始大写该单词:

:map , 0wgUw

之后,按下,它将使一行中的第二个单词大写。例如,在包含 的行上function hello() {,它将大写 HELLO。它不需要是完美的,它只需要做一件小事,如果我不得不重复做的话,这件事会很烦人(事实上,这通常是多次做同一件事的烦恼,并且知道我将不得不再做数十次或数百次,以激励我进行映射)

是的,可以创建一个宏来拉取整个函数,移动光标,粘贴并缩进它,然​​后将函数名称大写。我现在没有动力亲自去做这件事。不过,我建议将其分成两个映射 - 一个用于搜索^function并提取整个内容,另一个用于粘贴并大写函数名称。 (像这样的东西就是我喜欢使用,;用于临时地图的原因......按键彼此靠近非常方便)。

对于我在当前编辑的文件之外重复使用的内容,我将其映射到功能键或将其记录在寄存器中。我不经常这样做,因为我的大多数乏味的重复性任务都是高度情境化的,并且特定于我当前正在处理的任何事情......我倾向于在我的 ~/.vimrc 中为非常通用的东西定义功能键宏,例如通过管道传输当前段落par以重新格式化。

相关内容