1

С плагином Vim Matchit вы можете сопоставлять не только парены, но и намного больше языковых структур, которые входят в Париж (например, if..end, do..end).

Сейчас я использую Emacs (для удовольствия!), И мне интересно, есть ли что-то похожее на этот плагин?

Спасибо большое.

5 ответов5

1

зло-матчить https://github.com/redguardtoo/evil-matchit

Vim matchit.vim, созданный Бенджи Фишером, портирован на Emacs.

Когда он установлен, вы можете нажать «%» для перехода между соответствующими тегами в Emacs.

Поддерживаются большинство современных языков:

HTML
Python
Java
C++/C
Javascript
Fortran
SQL
Perl
Latex
CMake
Org-mode (match tag of org-mode and tags of other languages embedded in org file)
Ruby
Bash
Lua
PHP
Vim script
Emacs email (message-mode)
1

Я не знаю, какой плагин соответствует языковым структурам, но я использую простую функцию, которая соответствует просто круглым скобкам.

Хорошо, я не написал эту функцию, скопировал откуда-то

;; goto-matching-paren
;; -------------------
;; If point is sitting on a parenthetic character, jump to its match.
;; This matches the standard parenthesis highlighting for determining which
;; one it is sitting on.
;;
(defun goto-matching-paren ()
  "If point is sitting on a parenthetic character, jump to its match."
  (interactive)
  (cond ((looking-at "\\s\(") (forward-list 1))
        ((progn
           (backward-char 1)
           (looking-at "\\s\)")) (forward-char 1) (backward-list 1))))
(define-key global-map [(control ?c) ?p] 'goto-matching-paren) ; Bind to C-c p
0

Я думаю, что обычно режим будет определять что-то вроде того, что вы после (или были после 2 лет назад). Ch m (режим справки) в файле в режиме, в котором вы работаете.

Например, режим ruby-mode имеет «ruby-begin-of-block» и «ruby-end-of-block». Я думаю, что их эквиваленты обычно связаны с MCP (начало) и MCN (конец).

Вы должны быть в состоянии придумать связывание злого режима, которое имеет смысл. Если бы вы были действительно амбициозны, вы могли бы выскочить и вызывать версии ruby в режиме ruby, если% не удалось.

Надеюсь, что это поможет - или, по крайней мере, поможет следующему человеку найти аналогичный ответ.

0

Я не думаю, что есть общая возможность, так как она сильно зависит от редактируемого языка. Например, в режиме GAP, над которым я работал, есть функция, имитирующая ключ % vim, но я уверен, что, например, cc-mode нет. Режим Ruby является примером режима, в котором есть функции для продвижения вперед и назад по логическим блокам, таким как class ... end но я не думаю, что у него есть совпадение. Это не очень утомительно, чтобы иметь матч, скорее вперед и назад более типично, так как он более мощный.

Какой режим (ы) вас интересует?

0

Для этой цели я использую следующую функцию, которую я получил здесь :

(defun bounce-paren ()
  "Will bounce between matching parens just like % in vi"
  (interactive)
  (let ((prev-char (char-to-string (preceding-char)))
        (next-char (char-to-string (following-char))))
    (cond ((string-match "[[{(<]" next-char) (forward-sexp 1))
          ((string-match "[\]})>]" prev-char) (backward-sexp 1))
          (t (error "%s" "Not on a paren, brace, or bracket")))))

Следует отметить, что он поддерживает только односимвольные пары, и что его изменение для поддержки многосимвольных разделителей потребует, по существу, полного переписывания. У меня есть привязка к F2 (и я редко использую ее), но вы, конечно, можете также привязать ее к%.

Я рекомендую вашему вниманию режим Smartparens , который поддерживает произвольные пары одно- или многосимвольных разделителей, включая случаи, когда оба разделителя представляют собой одну и ту же строку. После того, как вы настроили свои пары, довольно простая функция Lisp, которая в зависимости от контекста вызывает одну из функций навигации sp-beginning-of-sexp или sp-end-of-sexp , должна дать вам желаемое поведение.

Также рассмотрим режим highlight-круглых скобок, который раскрашивает окружающие точки; Я нахожу, что использование этого режима дает мне 99,4% того, что я получал от подпрыгивания между фигурными скобками, без необходимости вообще перемещать точку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .