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
而不是:%
,或者写:'<,'>
对视觉选择进行操作。
我正在尝试使用更高级的 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
而不是:%
,或者写:'<,'>
对视觉选择进行操作。