windows确实没有Linux方便高效,不过当需要工作在windows下的时候实在没办法。对于我这样的windows菜鸟,vim倒是帮了大忙,非常高效率。
在vim中调用cmd.exe,批量处理若干文件
argdel *.cpp
args *.cpp
argdo slient !cmd.exe "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 # & #:r"
argdel *.cpp
argadd %
args 用于引入文件列表(文件名为参数) *.cpp 为使用vim的正则表达式
argdo 反复执行命令(对列表中的每个文件,重复执行)
此处 slient很重要,加上这个标记以后可以去除 “Hit any key to close this window...” 这个烦人的中止,使得可以连续的自动进行。
& 用于连接 多个cmd.exe的命令。详细参数含义的可以参考下面。
# 是vim的,会自动展开为当前文件名, #:r表示编译完成后,执行文件(:r去除了.cpp后缀,直接执行(cmd.exe 中运行可执行文件可以不加.exe后缀))
## 可以用来连续替换文件列表。
一个例子,test/1.cpp test/2.cpp
!cmd.exe "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 1.cpp & 1"
然后自动关闭cmd.exe,再一次执行:
!cmd.exe "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 2.cpp & 2"
若是:
argdo slient !cmd.exe "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 ## & ##:r"
则展开为:
!cmd.exe "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 1.cpp 2.cpp & 1 2"
这里不是我想要的结果,但它是按这样的方式来展开的。
就这些。
剩下的就是将批处理结果重定向到文件,以便分析。
完整的vim脚本函数,添加对结果的记录,保存到文件tmp_log.txt:
func CM_Compile_Run_All()
echo "icl /Qxcm_emu *.cpp, ing..."
set splitbelow
set nomore "取消more分页,避免因为vim messages分页(more)而停止批量处理的程序
set autowriteall
enew
w! tmp_log.txt
argdel *
args *.cpp
keepalt "保持args列表,而不引入其他非cpp文件(否则此处会增加tmp_log.txt到列表)
argdo e tmp_log.txt| r !cmd.exe /c "c:\xx\setupenv.bat & C:\xx\compiler\bin\icl /Qxcm=gen5 # & #:r"
argdel *.cpp
argadd %
set noautowriteall
" analyze here:
"
endfunc
那么剩下的工作是对tmp_log.txt进行分析,提取运行结果。
ps
windows的bat脚本是不是很容易实现这些功能? 但实在是不喜欢windows不想再学它的。
当然,最主要是最初没有批处理需求,只是单个文件在vim里面编辑,然后运行,于是集成到vim中比较高效率。
看来vim可以帮助实现知识的跨平台使用,vim无所不能:)
参考链接
VIM EDITING:
vim messages:
附 cmd.exe 详解:
cmd [[{/c|/k}] [/s] [/q] [/d] [{/a|/u}] [/t:fg] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] string]
参数
/c
执行 string 指定的命令,然后停止。
/k
执行 string 指定的命令并继续。
/s
修改位于 /c 或 /k 之后的 string 处理。
/q
关闭回显。
/d
禁用自动运行命令执行。
/a
创建美国国家标准协会 (ANSI) 输出。
/u
创建 Unicode 输出。
/t:fg
设置前景 f 和背景 g 的颜色。下表列出了可用作 f 和 g 的值的有效十六进制数字。
/e:on
启用命令扩展。
/e:off
禁用命令扩展。
/f:on
启用文件和目录名完成。
/f:off
禁用文件和目录名完成。
/v:on
启用延迟的环境变量扩展。
/v:off
禁用延迟的环境变量扩展。
string
指定要执行的命令。
/?
在命令提示符显示帮助。
注释
使用多个命令
可以在 string 中使用由 && 分隔的多个命令,不过这些命令必须置于引号之中(例如,"command&&command&&command")。
处理引号
如果指定了 /c 或 /k,则在满足下述所有条件的情况下,cmd 会处理 string 中的其余命令而将引号保留:
未使用 /s。
正确使用一对引号。
在引号内未使用任何特殊字符(例如: &<>( ) @ ^ |}。
在引号内使用了一个或多个空格子符。
引号内的 string 为可执行文件的名称。
如果上述条件不能满足,则处理 string 时将首先检查它的第一个字符以验证其是否为左引号。如果第一个字符是左引号,则它会与右引号分离开。跟在右引号之后的任何文本都会得到保留。
阅读(2148) | 评论(0) | 转发(0) |