从windows批处理文件运行vim;在其中引用引号;插入文本
为了进行重复编辑,比如在许多文件中用另一个字符串替换字符串,我一直在使用从windows批处理文件运行vim(关于堆栈溢出的帮助非常有用!)。我的后续问题是,如果:从windows批处理文件运行vim;在其中引用引号;插入文本,windows,batch-file,vim,Windows,Batch File,Vim,为了进行重复编辑,比如在许多文件中用另一个字符串替换字符串,我一直在使用从windows批处理文件运行vim(关于堆栈溢出的帮助非常有用!)。我的后续问题是,如果: a) vim命令包含引号和空格 b) 如何在插入vim时“转义”,即批处理文件是什么 vim中逃逸的等价物 例如,关于(a),我想做: call vim fn.txt +"1,$s/$/\"/" +wq 在文件fn.txt的每一行末尾添加一个引号,但这当然不起作用,因为windows不知道上面一行的第二个引号被引用了 作为(b
- a) vim命令包含引号和空格
- b) 如何在插入vim时“转义”,即批处理文件是什么 vim中逃逸的等价物
call vim fn.txt +"1,$s/$/\"/" +wq
在文件fn.txt的每一行末尾添加一个引号,但这当然不起作用,因为windows不知道上面一行的第二个引号被引用了
作为(b)的示例,如何在文件fn.txt中的第7行之后插入包含文本“inserted line”的行
call vim fn.txt +:7 +oinserted line????
上面的问号表示我不知道如何继续。备选方案
除非您真的需要特殊的Vim功能,否则最好使用非交互式工具,如sed
、awk
,或Perl/Python/Ruby/您最喜欢的脚本语言
也就是说,您可以非交互地使用Vim。但是,正如您所发现的,Windows命令行上的转义操作非常棘手。转义字符应该是^
(因此“
变成^”
),但在一些快速测试中我也无法让它工作。只需阅读/S
打开cmd.exe/?
的文档,并尝试理解它:-(因此,最好将Vim命令放入一个单独的脚本中,因为只将脚本的filespec传递给Vim。以下详细信息都使用了该技巧
静默批处理模式
对于非常简单的文本处理(即使用Vim,如增强的“sed”或“awk”,可能只是得益于:substitute
命令中增强的正则表达式),请使用Ex模式
注意:静默批处理模式(:help-s-ex
)会弄乱Windows控制台,因此您可能必须在Vim运行后执行cls
清理
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
注意:如果“commands.ex”
文件不存在,Vim将挂起等待输入;最好事先检查它是否存在!或者,Vim可以从stdin读取命令。您也可以使用从stdin读取的文本填充新缓冲区,如果使用-
参数,则可以从stderr读取命令
全自动化
对于涉及多个窗口的更高级处理和Vim的真正自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:
以下是所用参数的摘要:
-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.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-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.
选择
除非您真的需要特殊的Vim功能,否则最好使用非交互式工具,如sed
、awk
,或Perl/Python/Ruby/您最喜欢的脚本语言
也就是说,您可以非交互地使用Vim。但是,正如您所发现的,Windows命令行上的转义非常棘手。转义字符应该是^
(因此“
变成^
),但在一些快速测试中,我也无法使其正常工作。只需阅读有关打开cmd.exe/?
的/S
开关的文档,并尝试理解它:-(因此,最好将Vim命令放入一个单独的脚本中,因为只将脚本的filespec传递给Vim
静默批处理模式
对于非常简单的文本处理(即使用Vim,如增强的“sed”或“awk”,可能只是得益于:substitute
命令中增强的正则表达式),请使用Ex模式
注意:静默批处理模式(:help-s-ex
)会弄乱Windows控制台,因此您可能必须在Vim运行后执行cls
清理
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
注意:如果“commands.ex”
文件不存在,Vim将挂起等待输入;最好事先检查它是否存在!或者,Vim可以从stdin读取命令。您也可以使用从stdin读取的文本填充新缓冲区,如果使用-
参数,则可以从stderr读取命令
全自动化
对于涉及多个窗口的更高级处理和Vim的真正自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:
以下是所用参数的摘要:
-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.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-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.
我不能真正测试你的第一个问题,但是为什么你在那里使用引号,而不是其他地方?但是,你的第二个问题很简单。你在这个关系中发送给vim的所有东西都被视为命令。
o
移动不过是一个普通模式动作。要从commandmode运行普通模式动作,只需使用norm
看看在:h norm
我不能真正测试你的第一个问题,但是为什么你在那里使用引号,而不是其他地方?你的第二个问题很简单。你在这个关系中发送给vim的所有东西都被视为命令。o
移动不过是一个正常模式动作。要从commandmode运行正常模式动作,只需使用n即可orm
看一看:h norm
^
只能用作无引号字符串中的转义字符-在双引号字符串中,^
不是特殊的,并被视为文本。这可能是您的问题。(来源:,不想为windows的东西获得学分;-)^
只能用作无引号字符串中的转义字符-在双引号字符串中,^
不是特殊字符,被视为文本。这可能是您的问题。(来源:,不想为windows的东西获得学分;-)