Chinaunix首页 | 论坛 | 博客
  • 博客访问: 453505
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1540
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-26 11:11
文章分类

全部博文(122)

文章存档

2010年(1)

2009年(76)

2008年(45)

我的朋友

分类: WINDOWS

2009-10-13 18:16:35

 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 时将首先检查它的第一个字符以验证其是否为左引号。如果第一个字符是左引号,则它会与右引号分离开。跟在右引号之后的任何文本都会得到保留。

阅读(2122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~