Emacs 中与 Vim 的 matchit 相当的是什么?

Emacs 中与 Vim 的 matchit 相当的是什么?

使用 Vim 的插件马奇特,您不仅可以匹配括号,还可以匹配更多以括号结尾的语言结构(例如,if..end、do..end)。

现在我正在使用 Emacs(为了好玩!),我想知道是否有类似这个插件的东西?

非常感谢。

答案1

邪恶匹配 https://github.com/redguardtoo/evil-matchit

Benji Fisher 的 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)

答案2

我不知道哪个插件与语言结构匹配,但我确实使用了一个与简单括号匹配的简单函数。

好吧,我没有写过这个函数,是从某处复制的

;; 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

答案3

我不认为存在通用的设施,因为它在很大程度上取决于所编辑的语言。例如GAP 模式我曾经研究过,它确实有一个模拟 vim%键的功能,但我很确定,例如,cc-mode它没有。Ruby 模式就是一个具有跨逻辑块前进和后退功能的模式示例,class ... end但我认为它没有匹配。匹配不是很方便,而前进和后退更常见,因为它更强大。

您对哪种模式感兴趣?

答案4

我使用以下函数,得到了这里, 以此目的:

(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(很少使用它),但您当然也可以将其绑定到 %。

我建议你注意智能括号模式,支持任意的单字符或多字符分隔符对,包括两个分隔符都是相同字符串的情况。配置好分隔符对后,一个相当简单的 Lisp 函数(根据上下文调用导航函数sp-beginning-of-sexpsp-end-of-sexp)应该会为您提供所需的行为。

还请考虑突出显示括号模式,它为点周围的括号着色;我发现,使用这种模式可以让我获得以前在括号之间弹跳所获得结果的 99.4%,而无需移动点。

相关内容