ChatGPT解决这个技术问题 Extra ChatGPT

使用emacs,如何去配对(平衡)括号

当光标在一个括号上时,如何跳转到配对括号。很适合在 emacs -nw 中工作。

就像 Vim 中的 % 一样。

;;在得到@Lindy、@Francesco 的提示后,我发现了更多:

  C-M-f     Move forward over a balanced expression
  C-M-b     Move backward over a balanced expression
  C-M-k     Kill balanced expression forward
  C-M-SPC   put the mark at the end of the sexp.
  C-M-n  Move forward over a parenthetical group 
  C-M-p  Move backward over a parenthetical group 
  ;; C-M key binding can also be done by --> ESC Control-key

  ;;And put this to .emacs, it will highlight opening/closing parens:
  (show-paren-mode 1)
Matching braces in Emacs 的可能重复项
还有一个很棒的 paredit 模式可以保持括号平衡,并允许操作......
提示:尝试 C-M-uC-M-f 之前到达周围的括号,这样您就不必已经在上面了。
@AlexOtt 希望您现在已经熟悉 SmartParens,它是改进/扩展的 Paredit。
关于广泛的括号运动,如果你是邪恶的,请检查 evil-lisp-state (Github)

T
TacticalCoder

使用 C-M-rightC-M-left(分别为 backward-sexpforward-sexp)转到当前表达式的开头或结尾。这适用于括号对,也适用于简单的单词。


谢谢,我发现它映射到我的桌面左右切换桌面。
谁能告诉CM-right的命令名称?它现在通过 gnome 桌面将我带到其他工作区
@Andrew_1510 这是 backward-sexp/forward-sexp。您可以使用 Esc 然后 C-<arrow> 生成这些键绑定,而不是同时按住 Ctrl+Alt+<arrow>。这样,组合键不会被 gnome 捕获,而是会正确地转发到 emacs。
您还可以将 C-M-fC-M-b 用于前进和后退。 (这对应于 C-fC-b 键映射,用于简单的向前和向后移动,早于带有箭头键的键盘。)
@Francesco:非常感谢这个 ESC 防止冲突的东西,我从来不知道它(尽管是 Gnome / Emacs 用户,因为,Gnome 存在;)去 +1 一个你的答案,这样你就可以获得一些 SO 代表!
C
Community

如 emacs wiki (http://www.emacswiki.org/emacs/NavigatingParentheses) 中所述:

CMn forward-list 向前移动括号组

CMp 向后列表 向后移动括号组

CMf forward-sexp 在平衡表达式上向前移动

CMb backward-sexp 在平衡的表达式上向后移动

CMk kill-sexp 前杀平衡表达式

CM-SPC mark-sexp 将标记放在sexp 的末尾。

https://superuser.com/questions/677516/how-do-i-jump-to-the-opening-or-closing-paren-brace-in-emacs


A
Asrail

对于括号、大括号和方括号,只需双击它们就可以了。


点击?用你的鼠标?在 emacs 中?
点击?在 emacs 中?呸,我说! :) -- (我假设 OP 没有使用 xemacs?)
有时,单击某物比搜索它或移动光标位置要快。 FWIW,双击一些括号,括号或花括号会将光标移动到其对并选择内部内容。至少从 X 上的 Emacs 24 开始。
好的!它有效,但前提是您双击打开的大括号。如果您单击关闭以查找打开(backward-sexp 等效项),则它不起作用。
当他们可以做 Cs ( Left C-Space CM-Right?
y
ychaouche

我建议使用 CMf 和 CMb,因为 CM-right/left 已经绑定到我的 DE(切换到右侧/左侧的桌面)。


M
Moritz Bunkus

我为此使用了以下小功能(尽管我不知道它是否符合 vim 的行为;我自己不是 vim 用户):

(defun mo-match-paren (arg)
  "Go to the matching parenthesis."
  (interactive "p")
  (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
        ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
        (t (self-insert-command (or arg 1)))))

这看起来像是要绑定到“%”,因为如果它不在括号上,它将插入按下的键
o
ocodo

我强烈推荐 SmartParens 它具有广泛的导航和括号结构操作(即换行、引号、标签、括号、大括号、常规括号、sexp 等),支持多种语言和结构,并且易于定制。

它还支持相当复杂的结构,称为 hybrid-s-expressions in it's documentation。这使得它在处理 C/C++、Java、JS 等语言中的代码方面非常强大。

对于 navigation,使用以下内容。

sp-forward-sexp (&optional arg)                 ;; C-M-f
sp-backward-sexp (&optional arg)                ;; C-M-b
sp-down-sexp (&optional arg)                    ;; C-M-d
sp-backward-down-sexp (&optional arg)           ;; C-M-a
sp-up-sexp (&optional arg)                      ;; C-M-e
sp-backward-up-sexp (&optional arg)             ;; C-M-u
sp-next-sexp (&optional arg)                    ;; C-M-n
sp-previous-sexp (&optional arg)                ;; C-M-p
sp-beginning-of-sexp (&optional arg)            ;; C-S-d
sp-end-of-sexp (&optional arg)                  ;; C-S-a
sp-beginning-of-next-sexp (&optional arg)       ;; none
sp-beginning-of-previous-sexp (&optional arg)   ;; none
sp-end-of-next-sexp (&optional arg)             ;; none
sp-end-of-previous-sexp (&optional arg)         ;; none

请注意,它将许多命令映射到 Emacs 默认等效项。安装好后,浏览一下它的功能(都是以sp-为前缀的),感受一下它的规模。

还有很多,我建议你有一个look at the wiki