我多年来一直在使用以下
cabbrev
(‘SafeQuitAll()’实际上在这里做什么并不重要);-
cabbrev qa <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'call <sid>SafeQuitAll()' : 'qa')<cr>
这效果很好,但我现在想添加对“!”的支持(即“:qa!”),所以我向 SafeQuitAll() 添加了一个参数来传入“!”状态,并添加了额外的
cabbrev
,这给了我这个;-
cabbrev qa <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'call <sid>SafeQuitAll(0)' : 'qa')<cr>
cabbrev qa! <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'call <sid>SafeQuitAll(1)' : 'qa!')<cr>
...除非这不起作用。 ':qa' 版本仍然可以正常工作,但是一旦我按 '!'当输入“qa!”时,命令行扩展为;-
:call <SNR>2_SafeQuitAll(0)!
即,“qa!”的
cabbrev
被“qa”的 cabbrev
掩盖并输入“!”导致第一个 cabbrev
触发。我尝试了各种语法组合来尝试解决此问题,但没有成功。特别是,我尝试了这个,但没有什么区别(我很确定 getcmdline()
总是返回一个空字符串,我不明白);-
cabbrev qa <C-r>=(getcmdtype()==#':' && getcmdpos()==1 && getcmdline()!~?'qa!' ? 'call <sid>SafeQuitAll(0)' : 'qa')<cr>
所以,我认为问题的关键在于“!”被视为命令终止符(我错了吗?),因此过早执行。有谁知道如何解决这个问题?
cabbrev
上扩展(如果您想要缩写后面有空格)或
<space>
(如果您不需要)。但这些实际上都是特殊情况。缩写实际上扩展了非关键字字符(如
<C-]>
或!
等),这就是这里发生的情况。这会在两个缩写之间产生一种竞争条件。 ,
扩展
qa!
,因此 qa
无法扩展。我不知道如何避免这种行为,但这就是使用映射而不是缩写的原因之一:qa!
和
qa
是两个不同的映射,您可以确信按qa!
不会与发生冲突qa!
。