Как использовать vimpulse вместе с autopair.el - PullRequest
0 голосов
/ 18 мая 2011

Похоже, что когда vimpulse работает, автопара работает только частично в том смысле, что нажатие клавиши backspace в парах пустых скобок больше не удаляет закрывающую скобку, а только открывающую (что означает, что теперь backspace функционирует как обычное backspace).Пример:

(когда Vimpulse и autopair активны, а текущий режим - режим INSERT, курсор "|" обозначает курсор)

begin: (|)

Nowнажмите «backspace»

ожидаемый результат: |(как открывающие, так и закрывающие скобки удаляются)

фактический результат: |) (удаляется только открывающая скобка)

Я знаю, что это связано с тем, что vimpulse (или, скорее, viper-mode) переназначил [backspace] из delete-backward-char в другое (я думаю, viper-delete-backward-char).Но я не мог найти решение этой проблемы.

Может кто-нибудь найти решение этой проблемы?(чтобы клавиша возврата могла убирать открывающую и закрывающую скобки, когда скобка пуста и курсор находится между ними). ​​

Спасибо!

Ответы [ 4 ]

0 голосов
/ 16 ноября 2011

Баумихель нашел хитрость. Я просто добавляю быстрый фрагмент, чтобы помочь:

Во-первых, поскольку autopair-mode просто добавляет autopair-emulation-alist, оцените:

(defadvice viper-change-state-to-insert (after autopair nil activate)
  (add-to-ordered-list 'emulation-mode-map-alists 'autopair-emulation-alist 300))

Затем, помните, что vimpulse-normalize-minor-mode-map-alist удаляет все viper раскладок клавиатуры перед списком, поэтому выполните:

(defadvice vimpulse-normalize-minor-mode-map-alist (after order-viper--key-maps nil activate)
   (add-to-ordered-list 'emulation-mode-map-alists 'viper--key-maps 500))

Это работает для меня! Я оцениваю эти фрагменты во встроенном eval-after-load для vimpulse и autopair.

Моя идея заключается в том, что Emacs dev должен переосмыслить emulation-mode-map-alists и использовать порядок приоритетов индексации списка свойств, например: ((:name viper--key-maps :after (cua--keymap-alist autopair-emulation-alist)) (:name viper--intercept-key-maps :before (cua--keymap-alist autopair-emulation-alist))). Старые пакеты, такие как viper, CUA и т. Д., Должны быть лучше поддержаны, потому что наша установка после Emacs после многих лет становится ужасной.

0 голосов
/ 23 мая 2011

Я отвечу на этот вопрос сам.

Я не смог найти "ортодоксальный" способ решения проблемы, и я придумал хак.

Функция, которая связана св режиме вставки viper (viper-del-backward-char-in-insert) рекомендуется проверять, находится ли курсор в текущей паре, если это так, символ после курсора удаляется перед вызовом фактической функции.Это также учитывает возможные проблемы, вызванные префиксом (обратная косая черта).

Просто скопируйте приведенный ниже код в файл .emacs после загрузки viper-mode или vimpulse.

(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 голосов
/ 27 мая 2011

Вот мое обновленное решение.Поместите следующее в ваш файл .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)

Теперь, autopair-emulation-alist должен быть указан до viper--key-maps.

0 голосов
/ 18 мая 2011

Я думаю, что что-то подобное в вашем файле инициализации будет работать:

(add-hook 'autopair-mode-hook 
  '(lambda ()
    (define-key autopair-emulation-alist [remap viper-delete-backward-char] 'autopair-backspace)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...