Vim 高级多行编辑

Vim advanced multiline edits

我正在尝试使用更高级的 vim 功能。 人们会如何进行以下编辑?

来自这个:

ssn=token_payload.fnr,
fname=token_payload.displayName,
email=token_payload.email,
login=token_payload.username,

对此:

ssn=token_payload['fnr'],
fname=token_payload['displayName'],
email=token_payload['email'],
login=token_payload['username'],

命令行:规范命令

我会将以下常规命令应用于文件中的所有行:

" note that in the real command, <Esc> would be a literal 
" press of the escape key (see explanation below)

:%norm f.s['<Esc>f,i']
  • 应用于整个文件:%
  • 以下普通模式命令:norm
  • 移至期间:f.
  • 用左方括号和引号代替:s['
  • escape插入模式(按ctrl+v输入文字字符,然后escape - 你会看到一个灰色符号出现):^[
  • 移至逗号:f,
  • 插入引号和右方括号:i']

我最近开始使用命令行方式而不是宏,因为我发现 你可以更容易地考虑它(特别是如果你编写命令 在带有 q: 的命令缓冲区中 - 参见 :help command-buffer).

使用宏

另一种方法是录制宏:

qa0f.s['<Esc>f,i']<Esc>jq

然后您可以使用 @a 将其部署到当前行并使用 @@ 重复。 或者使用 :%norm @a 到 运行 每行的宏。

和上面基本一样,只是你用qa代替了:%norm 记录到 a 寄存器中(您可以使用任何字母)。然后执行编辑。我 在用 q.

停止录制之前用 j 添加了一个下拉行

您可以在录制宏后通过粘贴内容来编辑宏 注册 ("ap)、编辑它们,然后在重播之前将它们拉回 ("ay$)。

使用外部工具

如果我想用一个命令执行多个替换,我会 通过 sed:

等外部程序过滤文本
:%!sed "s/\./['/; s/,$/'],/"

又一件好[好]事

:g[lobal] 命令是一个非常强大的工具! (参见 :help :g)我已经 经常将它与 norm 命令结合使用。例如,如果我 想要将文档中的所有段落格式化得很好,但不影响 缩进文本(可以是代码块或表格等)我会这样做:

:%g/^\w/norm gqap

这意味着,对于行首有字母的任何行,应用 命令 gqap 将普通模式命令 gq 应用到 'a paragraph'.

您可能还想将第一个单词大写并提高 header 级别 像这样的所有降价标题:

:%g/^#/norm w~I#

这会改变这个:

# a heading
some text.

## another heading
some more text

```sh
    # and a comment in some code will be unaffected
    print('hello world')
```
## a further heading
some text

# conclusion

进入这个:

## A heading
some text.

### Another heading
some more text

```sh
    # and a comment in some code will be unaffected
    print('hello world')
```
### A further heading
some text

## Conclusion

参见 these videos 'advanced' vim 东西

我会将其实现为 :s 命令。例如,此命令将进行请求的更改:

:%s/\.\(.*\),/[''],/

对所有行 % 进行操作,匹配点和逗号并将其间的所有内容放入一个组 (\(.*\)),然后用所需的值替换它,匹配第一组(</code>).</p> <p>如果要对不同的一组行进行操作,可以写<code>:1,4而不是:%,或者写:'<,'>对视觉选择进行操作。