在vim中可以对可视选择的文本执行什么操作?

2 投票
2 回答
3286 浏览
提问于 2025-04-16 04:22

你可以对选中的文本进行哪些操作(使用快捷键)?为了简单起见,我们考虑这段简单的文本:

   a  b  cd  1  p
   a  b  cd  2  y
   a  b  cd  3  t
   a  b  cd  4  h
   a  b  cd  5  o
   a  b  cd  6  n

一个具体的问题:是否可以对选中的内容执行Python或shell命令/脚本?

还有几个更具体的问题:

1-) 如何对Python列进行就地排序?

2-) 如何交换列的位置?

3-) 如何增加数值?(比如,只对选中部分中大于3的数字进行操作)

谢谢。

2 个回答

5

这个问题范围很广,但首先可以看看:help visual-operators

关于具体的问题,可以看看这个插件EvalSelection.vim,它可以在你的终端、Python和其他几种解释器中执行你在可视区域选中的源代码。举个很简单的例子,如果你在Vim的编辑器中有以下内容:

pwd
echo $SHELL

选择第一行,然后输入<Leader>esp。我们来拆解一下:

<Leader>e是调用EvalSelection.vim的默认快捷键。s表示你想用终端来执行这个代码。p表示你想把结果打印到Vim的命令行上。

当我运行上面的命令时,选中第一行后输出是~/Desktop。如果我对第二行使用相同的命令,输出是/bin/zsh/

4

要正确地做到这一点,你需要使用 过滤器 和 vim 的 执行模式

一个 过滤器 是任何标准的 UNIX 程序,比如 sortawkgrepcutpastesed 等等,它们可以从标准输入(stdin)读取数据,并将结果输出到标准输出(stdout)。

vim 的 执行模式 允许你用程序的输出替换文本或读取文本。如果你选择了一段文本(比如,使用 VC-V),然后按下 :,命令提示符会变成 :'<,'>,这意味着“将后面的命令应用到你选择的行上。”此时,你可以输入 !foo 来用程序 foo 的输出替换选中的文本。

举个例子,如果你想按 Python 列排序文本,先选中它,然后按 :,再输入 !sort -k5。整个命令看起来像 :'<,'>!sort -k5。运行这个命令后会得到:

   a  b  cd  4  h
   a  b  cd  6  n
   a  b  cd  5  o
   a  b  cd  1  p
   a  b  cd  3  t
   a  b  cd  2  y

对于其他两个任务,awk 是个好帮手。像 :'<,'>!awk '{ print $1, $3, $2, $4, $5 }' 这样的命令可以交换第二列和第三列的位置(不过要注意,列之间的空格会被压缩)。如果你想增加某一列的值,可以试试 :'<,'>!awk '{ sub($4, $4+1); print }' 这样的命令。

撰写回答