似乎当vimpulse正在运行时,autopair只能部分起作用,在空方括号对中按退格键将不再删除结束方括号,而只删除开始的方括号(这意味着退格键现在起到正常退格键的作用)。举个例子:
(当Vimpulse和autopair都激活,且当前模式为INSERT模式时,"|“表示光标)
开始:(|)
现在按“退格键”
预期结果:|(左括号和右括号都去掉了)
实际结果:|) (只去掉左方括号)
我知道这与vimpulse (或者更确切地说是viper-mode)将退格符从delete- fact char重新映射到其他东西(我认为是viper- delete-backward-char )有关。但是我找不到解决它的办法。
有人能找到解决这个问题的办法吗?(因此,当括号为空且光标位于两者之间时,退格键将同时删除左括号和右括号)。
谢谢!
发布于 2011-05-23 17:13:40
我将亲自回答这个问题。
我想不出一个“正统”的方法来解决这个问题,于是我想出了一个办法。
建议在viper insert模式下绑定的函数(viper-del-backward-char- in -insert)检查游标当前是否在匹配对中,如果是,则在调用实际函数之前删除游标后的字符。这还会考虑到前缀字符(反斜杠)可能导致的问题。
只需在viper-mode或vimpulse加载后将以下代码复制到您的.emacs文件中。
(defun not-escaped (escape-char)
"Character immediately before cursor is not prefixed by escape-char"
(let ((count 0))
(save-excursion
(if (char-before)
(backward-char))
(while (and (char-before)
(= (char-before) escape-char))
(setq count (+ count 1))
(backward-char))
(if (= 0
(% count 2))
t
nil))))
(defun in-matched-empty-pair (pair-list)
"tell if cursor is in an empty pair in pair-list"
(let ((next-char (char-after))
(prev-char (char-before))
(matched nil)
(pair)
(pair-left)
(pair-right))
(if (and next-char
prev-char)
(while (and (setq pair
(pop pair-list))
(not matched))
(setq pair-left (pop pair)
pair-right (pop pair))
(if (= next-char pair-right)
(if (and
(= prev-char pair-left)
(not-escaped ?\\))
(setq matched t)))))
(if matched
t
nil)))
(defvar viper-workaround-pairs
'(
(?\" ?\")
(?\' ?\')
(?\` ?\`)
(?\( ?\))
(?\[ ?\])
(?\{ ?\})
))
;; Workaround for integration problem with autopair
(defadvice viper-del-backward-char-in-insert (before viper-auto-delete-pair-backward())
(if (in-matched-empty-pair viper-workaround-pairs)
(delete-char 1)))
;; Activate advice
(ad-activate 'viper-del-backward-char-in-insert)这是一个技巧,但这可能是我现在能做的最好的了。
发布于 2011-05-19 00:07:50
我认为在您的init文件中类似这样的内容会起作用:
(add-hook 'autopair-mode-hook
'(lambda ()
(define-key autopair-emulation-alist [remap viper-delete-backward-char] 'autopair-backspace)))发布于 2011-05-27 07:11:21
这是我最新的解决方案。将以下内容放入您的.emacs文件中,在加载自动空气和vimpulse的代码之后:
(add-to-ordered-list 'emulation-mode-map-alists (car (last emulation-mode-map-alists)) 400)它将autopair的快捷键映射移到了毒蛇快捷键的前面,给了它更高的优先级。也许您必须熟悉订单号(这里是400),这取决于您是否使用其他模拟模式。可以使用C-x v emulation-mode-map-alists检查结果。在我的例子中:
(viper--intercept-key-maps cua--keymap-alist autopair-emulation-alist viper--key-maps)现在,应该在viper--key-maps之前列出autopair-emulation-alist。
https://stackoverflow.com/questions/6042070
复制相似问题