我在我的.
vimrc中为我正在使用的版本控制系统编写了一些宏(Perforce)(请不要为vim建议perforce插件,我试过它,我不喜欢它).它们都可以正常工作,除了恢复宏,它由于确认提示而中断(我需要这样做,所以我不会意外地指责我的变化).它目前看起来像这样:
map <F8> :if confirm('Revert to original?',"&Yes\n&No",1)==1 | !p4 revert <C-R>=expand("%:p")<CR><CR><CR>:edit<CR> | endif
当vim尝试加载文件时,这会导致bash抱怨:
bin/bash: -c: line 0: Syntax error near unexpected token `('
看看缓冲区bash看到的,看起来错误是vim在第一个管道之后发送了所有内容,而不仅仅是用于bash的部分.我尝试了一些替代方案,但我似乎无法使其工作.当我删除管道和endif(使用速记if)时,我已经让它正确显示确认对话框,但是在用户给出响应之后vim会抱怨.
解决方法
使用管道将多个vim命令串在一起并不是特别明确,并且存在许多偏心.重要的是,(见
:help :bar
)它不能在像shell命令之类的命令之后使用:看到一个|字符作为其参数.
例如.
:echo system("p4 revert " . shellescape(expand("%:p")))
如果您在文件名中包含空格或引号等字符(或者巧妙地将其命名为rm -rf~(请勿在家中尝试此操作!)),shellescape()
包装器非常有用.
为了创建更易读/可维护的代码,您可能希望将代码移动到一个函数中:
function Revert() if confirm('Revert to original?',1)==1 return system("p4 revert " . shellescape(expand("%:p"))) endif endfunction
您可以在宏中使用:call或:echo命令访问它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。