在vim中可以对可视选择的文本执行什么操作?
你可以对选中的文本进行哪些操作(使用快捷键)?为了简单起见,我们考虑这段简单的文本:
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 个回答
这个问题范围很广,但首先可以看看:help visual-operators
。
关于具体的问题,可以看看这个插件EvalSelection.vim,它可以在你的终端、Python和其他几种解释器中执行你在可视区域选中的源代码。举个很简单的例子,如果你在Vim的编辑器中有以下内容:
pwd
echo $SHELL
选择第一行,然后输入<Leader>esp
。我们来拆解一下:
<Leader>e
是调用EvalSelection.vim的默认快捷键。s
表示你想用终端来执行这个代码。p
表示你想把结果打印到Vim的命令行上。
当我运行上面的命令时,选中第一行后输出是~/Desktop
。如果我对第二行使用相同的命令,输出是/bin/zsh/
。
要正确地做到这一点,你需要使用 过滤器 和 vim 的 执行模式。
一个 过滤器 是任何标准的 UNIX 程序,比如 sort
、awk
、grep
、cut
、paste
、sed
等等,它们可以从标准输入(stdin)读取数据,并将结果输出到标准输出(stdout)。
vim 的 执行模式 允许你用程序的输出替换文本或读取文本。如果你选择了一段文本(比如,使用 V
或 C-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 }'
这样的命令。