Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
Linux vim过滤器命令中断时执行命令_Linux_Vim - Fatal编程技术网

Linux vim过滤器命令中断时执行命令

Linux vim过滤器命令中断时执行命令,linux,vim,Linux,Vim,我在vim中使用filter命令调用bash脚本,有时需要中断这些脚本。我通过点击vim窗口中的Ctrl+C来实现这一点。bash脚本随后终止(至少vim停止filter命令),但我传递给filter命令的文本(通常是一个可视选择)将丢失。如果我通过Ctrl+C中断执行,或者bash脚本结束时退出状态不是0,我希望vim返回到filter命令之前的状态。请注意,我知道我可以按u键撤消,但我想修改filter命令来执行此操作,因为我可能会忘记按u键并在没有注意到的情况下松开文本。您可以在bash中

我在vim中使用filter命令调用bash脚本,有时需要中断这些脚本。我通过点击vim窗口中的Ctrl+C来实现这一点。bash脚本随后终止(至少vim停止filter命令),但我传递给filter命令的文本(通常是一个可视选择)将丢失。如果我通过Ctrl+C中断执行,或者bash脚本结束时退出状态不是0,我希望vim返回到filter命令之前的状态。请注意,我知道我可以按u键撤消,但我想修改filter命令来执行此操作,因为我可能会忘记按u键并在没有注意到的情况下松开文本。

您可以在bash中设置信号和/或退出处理程序<代码>曼巴什,
/trap.*sigspec

比如:

trap "your_commands"  SIGINT
my_program
要使其“保留”文本,您可能需要这样的内容:

TIN=`mktemp`
TOUT=`mktemp`
cat > $TIN
trap "cat $TIN; rm -f $TIN; rm -f $TOUT" EXIT
do_something < $TIN > $TOUT || cp $TIN $TOUT
mv $TOUT $TIN
TIN=`mktemp`
TOUT=`mktemp`
猫>罐头
陷阱“cat$TIN;rm-f$TIN;rm-f$TOUT”出口
做点什么<$TIN>$TOUT | cp$TIN$TOUT
mv$TOUT$TIN

检查我的Vim,似乎正在工作。(使用
sed
sleep
以及dou\u something进行测试)

不过技巧不错1。它必须是
do\u something
,才能保留当前行为2。如果do_something/tmp/out.txt,则必须是
;然后是cat/tmp/out.txt;else cat/tmp/text.txt;endif;rm-f/tmp/{text,out}.txt
以满足“或bash脚本在退出状态为0以外的情况下完成”部分和3的要求。您应该在这里使用
mktemp
。@mikezter,您可以编写实现,比如
mktemp(){echo/tmp/$$\u$RANDOM;}