Learn Vim 第十四章:外部命令

Learn Vim 第十四章:外部命令

💡 原文中文,约1800字,阅读约需5分钟。
📝

内容提要

Vim的Bang命令可调用外部命令,实现读取输出、写入输入及执行命令三种功能。通过过滤文本,可结合管道处理数据,如排序、转换大小写。普通模式下也可用过滤运算符。掌握外部命令能扩展Vim功能,使其接近IDE。

🔎

延伸解读

区分 :w !cmd 与 :w! node

文中特别提醒,:w !node 与 :w! node 形式相近但功能迥异。前者将缓冲区内容作为标准输入传给外部命令 node 执行,后者则是强制保存文件并命名为“node”。这一区分对避免误操作至关重要,尤其是当文件名与外部命令同名时,容易造成混淆。

过滤文本的实用场景

通过给 ! 命令指定范围,可以调用外部命令处理文本。例如,用 :.!tr 转换当前行大小写,用 :%!awk 提取列,或用管道组合 sort、column 等命令实现排序和格式化。这些技巧能显著提升文本处理效率,且无需离开 Vim。

Vim 与 Unix 哲学的契合

Vim 并非 IDE,但通过 Bang 命令可无缝调用外部命令,体现了 Unix 的模块化设计:每个命令专注单一功能,通过组合解决复杂问题。这种可扩展性使 Vim 接近 IDE,但实际效果取决于用户对外部命令的熟悉程度,因此持续学习外部命令是发挥 Vim 潜力的关键。

Q&A

Vim中Bang命令的三种主要功能是什么?

Vim的Bang(!)命令可以执行三件事:将外部命令的标准输出读入当前缓冲区、将缓冲区内容作为标准输入写入外部命令、从Vim内部执行外部命令。

如何在Vim中读取外部命令的输出并插入到当前缓冲区?

使用命令 `:r !{cmd}` 可以将外部命令的标准输出读入当前缓冲区。例如,`:r !ls` 会插入ls命令的结果。也可以指定行号,如 `:10r !cat file1.txt` 将输出插入到第10行之后。

在Vim中,如何将缓冲区内容作为输入传递给外部命令?

使用命令 `:w !cmd` 可以将当前缓冲区的内容作为标准输入传递给外部命令。例如,`:w !node` 会将缓冲区内容发送给node命令执行。注意与 `:w! node` 的区别,后者是强制保存文件并命名为node。

在Vim中如何执行外部命令而不影响缓冲区?

使用命令 `:!cmd` 可以直接执行外部命令,例如 `:!ls -ls` 查看目录内容,或 `:!kill -9 3456` 终止进程。执行后返回Vim,缓冲区不变。

如何在Vim中使用外部命令过滤文本?

在Vim中,可以使用 `!` 范围过滤文本。例如,`:.!tr '[:lower:]' '[:upper:]'` 将当前行的小写字母转换为大写。也可以使用 `:%!awk '{print $1}'` 对全文应用awk命令。还可以通过管道连接多个命令,如 `:%!awk 'NR > 1' | sort -nk 3 | column -t`。

在Vim普通模式下如何使用过滤运算符?

在普通模式下,可以使用 `!` 运算符配合动作命令来过滤文本。例如,`!jtr '[a-z]' '[A-Z]'` 会将当前行和下一行的小写字母转换为大写。

Vim如何通过外部命令扩展功能,使其接近IDE?

Vim通过Bang命令可以无缝调用外部命令,从而扩展其功能。例如,可以使用外部命令进行文本过滤、数据处理等。这种可扩展性使得Vim能够处理复杂任务,接近IDE的体验。

🏷️

标签

➡️

继续阅读