Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从windows批处理文件运行vim;在其中引用引号;插入文本_Windows_Batch File_Vim - Fatal编程技术网

从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

为了进行重复编辑,比如在许多文件中用另一个字符串替换字符串,我一直在使用从windows批处理文件运行vim(关于堆栈溢出的帮助非常有用!)。我的后续问题是,如果:

  • a) vim命令包含引号和空格

  • b) 如何在插入vim时“转义”,即批处理文件是什么 vim中逃逸的等价物

例如,关于(a),我想做:

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的东西获得学分;-)