2012-05-28 106 views
0

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

回答

1

您可以在bash中设置信号和/或退出处理程序。 man 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 

经过我的Vim的,似乎是工作。 (使用sedsleep作为do_something进行测试)

+1

不错的技巧,尽管1.它必须是'do_something /tmp/out.txt;然后cat /tmp/out.txt; else cat /tmp/text.txt;万一 ; rm -f/tmp/{text,out} .txt'来满足“或者bash脚本以退出状态而不是0结束状态”的部分和3.你应该在这里使用'mktemp'。 – ZyX

+0

应用更改... –

+0

'mktemp'在macosx上的工作方式不同 – mikezter