首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将vimpulse与autopair.el结合使用

如何将vimpulse与autopair.el结合使用
EN

Stack Overflow用户
提问于 2011-05-18 16:47:52
回答 4查看 176关注 0票数 0

似乎当vimpulse正在运行时,autopair只能部分起作用,在空方括号对中按退格键将不再删除结束方括号,而只删除开始的方括号(这意味着退格键现在起到正常退格键的作用)。举个例子:

(当Vimpulse和autopair都激活,且当前模式为INSERT模式时,"|“表示光标)

开始:(|)

现在按“退格键”

预期结果:|(左括号和右括号都去掉了)

实际结果:|) (只去掉左方括号)

我知道这与vimpulse (或者更确切地说是viper-mode)将退格符从delete- fact char重新映射到其他东西(我认为是viper- delete-backward-char )有关。但是我找不到解决它的办法。

有人能找到解决这个问题的办法吗?(因此,当括号为空且光标位于两者之间时,退格键将同时删除左括号和右括号)。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-23 17:13:40

我将亲自回答这个问题。

我想不出一个“正统”的方法来解决这个问题,于是我想出了一个办法。

建议在viper insert模式下绑定的函数(viper-del-backward-char- in -insert)检查游标当前是否在匹配对中,如果是,则在调用实际函数之前删除游标后的字符。这还会考虑到前缀字符(反斜杠)可能导致的问题。

只需在viper-mode或vimpulse加载后将以下代码复制到您的.emacs文件中。

代码语言:javascript
复制
(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)

这是一个技巧,但这可能是我现在能做的最好的了。

票数 0
EN

Stack Overflow用户

发布于 2011-05-19 00:07:50

我认为在您的init文件中类似这样的内容会起作用:

代码语言:javascript
复制
(add-hook 'autopair-mode-hook 
  '(lambda ()
    (define-key autopair-emulation-alist [remap viper-delete-backward-char] 'autopair-backspace)))
票数 0
EN

Stack Overflow用户

发布于 2011-05-27 07:11:21

这是我最新的解决方案。将以下内容放入您的.emacs文件中,在加载自动空气和vimpulse的代码之后:

代码语言:javascript
复制
(add-to-ordered-list 'emulation-mode-map-alists (car (last emulation-mode-map-alists)) 400)

它将autopair的快捷键映射移到了毒蛇快捷键的前面,给了它更高的优先级。也许您必须熟悉订单号(这里是400),这取决于您是否使用其他模拟模式。可以使用C-x v emulation-mode-map-alists检查结果。在我的例子中:

代码语言:javascript
复制
(viper--intercept-key-maps cua--keymap-alist autopair-emulation-alist viper--key-maps)

现在,应该在viper--key-maps之前列出autopair-emulation-alist

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6042070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档