使用 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-sexp
或sp-end-of-sexp
)应该会为您提供所需的行为。
还请考虑突出显示括号模式,它为点周围的括号着色;我发现,使用这种模式可以让我获得以前在括号之间弹跳所获得结果的 99.4%,而无需移动点。