首页 > 解决方案 > Vim 高级多行编辑

问题描述

我正在尝试使用更高级的 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'],

标签: vim

解决方案


命令行 :norm 命令

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

" 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['
  • 转义插入模式(按 ctrl+v 输入文字字符,然后转义 - 你会看到一个灰色符号出现):^[
  • 移至逗号:f,
  • 插入引号和右方括号:i']

我最近开始使用命令行方式而不是宏,因为我发现您可以更轻松地考虑它(特别是如果您在命令缓冲区中使用 -see 组合命令q::help command-buffer

使用宏

另一种方法是录制宏:

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

然后您可以在当前行上部署@a并使用 重复@@。或用于:%norm @a在每一行上运行宏。

和上面基本一样,只不过不是:%normqa用来记录到a寄存器里(你可以用任何字母)。然后执行编辑。j在使用停止录制之前,我添加了一个下拉列表q

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

使用外部工具

如果我想用一个命令执行多个替换,我会通过像 sed 这样的外部程序过滤文本:

:%!sed "s/\./['/; s/,$/'],/"

还有一件好事

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

:%g/^\w/norm gqap

这意味着,对于在行首带有字母的任何行,应用gqap将正常模式命令gq应用于“段落”的命令。

您可能还希望将第一个单词大写并增加所有降价标题的标题级别,如下所示:

:%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

查看这些视频以了解“高级”vim 内容


推荐阅读