我想要一个for
循环模拟维夫姆。
当我不选择任何文件时,我可以键入:!echo %f
并看到echo
以当前文件名作为参数的输出。
当我选择多个文件时,:!echo %f
会生成 的输出,echo
其中所有选定的文件名都以空格作为参数连接。
如果我想echo
对每个选定的文件应用任何程序(例如)怎么办?所以
echo file1
echo file2
echo file3
...
代替
echo file1 file2 file3
我有什么选择?
PS:我想要以下 Bash 代码的 Vifm 模拟:
for f in file1 file2 file3; do
echo $f
done
答案1
选项1:用户定义命令
:com loop for f in %f; do %a "$f"; done
将其放入~/.config/vifm/vifmrc
始终进行命令设置。
要应用于ls -l
每个选定的文件,请发出
:loop ls -l
使用了两个宏:
%f
正确引用所选文件名。%a
论据。在我们的示例中,ls
并且-l
.
选项 2:地图
:noremap b :!for f in %f; do "$f"; done<A-B><A-B><Left>
再次将其放入~/.config/vifm/vifmrc
以始终进行地图设置。
当您b在正常或可视模式下按 时,for 循环将显示在命令行中,并且光标将方便地位于 和 之间do
,"$f"
因此您只需键入所需的命令并按 即可Enter。
光标定位由以下部分完成<A-B><A-B><Left>
:在命令行模式下,Alt+B将光标移动到上一个单词的开头,并且Left(显然)向左移动一个空格。
笔记&
:如果运行时间较长并且您不希望 Vifm 在运行时阻塞,请记住将该命令添加到后台。
答案2
这将产生所需的输出:
:!echo %f | xargs -n 1 echo
当然你可以定义一个命令(例如for
)以方便使用:
:com for echo %f | xargs -n 1
然后你只需输入:
:for echo