imb*_*hie 42 vim shell command-prompt
我有四个文本文件A.txt,B.txt,C.txt和D.txt我必须在所有这些文件中执行一系列vim编辑.目前我正在做的是打开每个文件并逐个执行相同的vim命令.
是否可以创建一个我可以从命令提示符运行的脚本文件,意味着无需打开vim编辑的实际文件.
例如,如果我必须在vim编辑器中打开A.txt文件后执行以下vim命令:
:g/^\s*$/d
:%s/^/[/
:%s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
:%s/$/]/
:%s/design/test/
Run Code Online (Sandbox Code Playgroud)
是否可以创建脚本文件并将所有这些命令包括在内gvim A.txt(第一个命令在文件中).并编辑从命令提示符运行脚本文件.
如果有可能请告诉我怎么做,也请让我知道如何处理单个文件和一次多个文件?
Jim*_*imR 31
vim -c <command> Execute <command> after loading the first file
Run Code Online (Sandbox Code Playgroud)
你描述的是什么,但你必须一次只做一个文件.
所以,在windows shell中......
for %a in (A,B,C,D) do vim -c ":g/^\s*$/d" -c "<another command>" %a.txt
Run Code Online (Sandbox Code Playgroud)
POSIX外壳类似,但我现在面前没有一台机器.
我想你可以一次加载所有文件并执行它,但它需要在每个文件的vim命令行上重复命令,类似于
vim -c "<command>" -c "<command>" -c ":n" (repeat the previous -c commands for each file.) <filenames go here>
Run Code Online (Sandbox Code Playgroud)
编辑:2014年6月8日:仅仅是一个FYI,我几分钟前发现了这一点.
vim有命令bufdo来处理编辑器中加载的每个缓冲区(文件).查看bufdo命令的文档.在vim中,:help bufdo
Ing*_*kat 20
的量-c直接传递给上的Vim命令行命令被限制为10,并且这不是很可读.或者,您可以将命令放入单独的脚本中并将其传递给Vim.这是如何做:
对于非常简单的文本处理(即使用Vim,如增强型'sed'或'awk',可能只是受益于:substitute命令中增强的正则表达式),请使用Ex模式.
REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"
Run Code Online (Sandbox Code Playgroud)
注意:静默批处理模式(:help -s-ex)会混淆Windows控制台,因此您可能必须cls在Vim运行后进行清理.
# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"
Run Code Online (Sandbox Code Playgroud)
注意:如果"commands.ex"文件不存在,Vim将挂起等待输入; 更好地检查它的存在!或者,Vim可以从stdin读取命令.您还可以使用从stdin读取的文本填充新缓冲区,如果使用-参数,则从stderr读取命令.
对于涉及多个窗口的更高级处理,以及Vim的真实自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:
vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
Run Code Online (Sandbox Code Playgroud)
以下是使用的参数的摘要:
-T dumb Avoids errors in case the terminal detection goes wrong.
-N -u NONE Do not load vimrc and plugins, alternatively:
--noplugin Do not load plugins.
-n No swapfile.
-es Ex mode + silent batch mode -s-ex
Attention: Must be given in that order!
-S ... Source script.
-c 'set nomore' Suppress the more-prompt when the screen is filled
with messages or output to avoid blocking.
Run Code Online (Sandbox Code Playgroud)
Ben*_*Ben 19
使用您希望在脚本中保存的每个文件上运行的所有命令,例如"script.vim",您可以在一个文件上执行该脚本(如其他人所提到的):
vim -c "source script.vim" A.txt
Run Code Online (Sandbox Code Playgroud)
更进一步,您可以将文件保存在脚本的末尾,方法是:w在脚本本身中放置一个命令,或者从命令行传递它:
vim -c "source script.vim | w" A.txt
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用该argdo命令在多个文件上运行Vim中的任何命令.所以你的命令变成了:
vim -c "argdo source script.vim | w" A.txt B.txt C.txt D.txt
Run Code Online (Sandbox Code Playgroud)
最后,如果要在每个文件上运行脚本后退出Vim,只需添加另一个命令退出:
vim -c "argdo source script.vim | w" -c "qa" A.txt B.txt C.txt D.txt
Run Code Online (Sandbox Code Playgroud)
请尝试以下语法:
ex foo.txt <<-EOF
g/^\s*$/d
%s/^/[/
%s/\(.*\)\(\s\+\)\(.*\)/\3\2\1
%s/$/]/
%s/design/test/
wq " Update changes and quit.
EOF
Run Code Online (Sandbox Code Playgroud)
该ex命令相当于vim -E.添加-V1详细输出.
替代单线语法例如:
ex +"g/^\s*$/d" +"%s/^/[/" +"%s/design/test/" -cwq foo.txt
Run Code Online (Sandbox Code Playgroud)
要从文件加载命令,请使用-s cmds.vim.
您还可以使用shebang for Vim来解析参数中的文件.
有关更多示例,请参阅:
| 归档时间: |
|
| 查看次数: |
22578 次 |
| 最近记录: |