vim - 使用 cabbrev 和 '!'

问题描述 投票:0回答:1

我多年来一直在使用以下

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>

所以,我认为问题的关键在于“!”被视为命令终止符(我错了吗?),因此过早执行。有谁知道如何解决这个问题?

    

vim command-line mapping
1个回答
0
投票
cabbrev

上扩展(如果您想要缩写后面有空格)或

<space>
(如果您不需要)。但这些实际上都是特殊情况。缩写实际上扩展了
非关键字字符
(如<C-]>
!
等),这就是这里发生的情况。
这会在两个缩写之间产生一种竞争条件。 

,

扩展

qa!
,因此
qa
无法扩展。
我不知道如何避免这种行为,但这就是使用映射而不是缩写的原因之一:

qa!

qa
是两个不同的映射,您可以确信按
qa!
不会与
发生冲突qa!
    

© www.soinside.com 2019 - 2024. All rights reserved.