我目前正在编写一个小的bash脚本,以在特定位置创建一个预填充文件。为此,我的bash脚本调用vim并执行一个vim脚本。 在这个vim脚本中,我想问用户要保存创建的文件的位置是否正确。然后,用户输入是或否。 为此,我使用了以下命令:
call inputsave()
let name = input('Is it the correct location ? y/n')
call inputrestore()
当我在gvim或vim中时,此输入功能可以正常工作。但是从脚本来看,启动bash脚本的终端没有显示任何内容。
是否可以将输出重定向到我的终端?
我发现了:redir > {file}
,但这显然是将所有vim输出重定向到一个非交互式文件。
我还设法通过以下方式在终端中回显了一些内容:
let tmp = "!echo what I want to display"
execute tmp
unlet tmp
但同样这只是为了显示内容。我将无法输入输入
我的bash脚本:
#!/bin/bash
touch tmp.txt #file used to pass argument to vim
echo "$1" >> tmp.txt #append argument to the end of the txt file
vim -e tmp.txt <create_new_file.vim #launch vim and execute the scrip inside create_new_file.vim
rm tmp.txt
echo "new file created"
create_new_file.vim
基本上只是调用位于我的CreateFile(_name)
中的函数.vimrc
。此函数调用inputsave()
,input()
和inputrestore()
。
答案 0 :(得分:3)
您通过标准输入将命令直接输入Vim;这样,Vim无法与您(用户)进行交互,并且这种对Vim的使用是非典型的,因此不鼓励使用。
除非确实需要特殊的Vim功能,否则最好使用非交互式工具,例如sed
,awk
或Perl / Python / Ruby / < em>您最喜欢的脚本语言在这里。
也就是说,您可以非交互式地使用Vim:
要获得涉及多个窗口的更高级处理以及Vim的真正自动化(您可以在其中与用户互动或让Vim运行以让用户接管),请使用:
vim -N -u NONE -n -c "set nomore" -S "create_new_file.vim" tmp.txt
这应该允许您在遵循命令脚本的同时与Vim交互。
以下是使用(或有用)参数的摘要:
-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.