我正在审查emacs中的一些代码,这些代码包含一系列跨越多个页面的for循环。作者所做的缩进很差,因此不容易分辨循环的开始和结束。我正在使用高亮括号模式来查找循环的位置。但是,循环通常包含几页代码。因此,每当我滚动查看更多代码时,括号的颜色会发生变化,而我无法找到循环结束的位置。我已经阅读了有关使用标记和多窗口滚动的其他帖子,但这似乎并不适用于我的情况。将光标位置锁定在屏幕上也没有用,因为它仍随屏幕移动。有什么建议或意见吗?
答案 0 :(得分:1)
您可以使用forward-list
(C-M-n
)和backward-list
(C-M-p
)在括号内向前和向后导航。 (另请尝试forward-sexp
(C-M-f
)和backward-sexp
(C-M-b
))。
查看EmacsWiki on Navigating Parentheses,Emacs manual node on matching paretheses和this SO thread on matching brackets。
答案 1 :(得分:0)
我认为您正在寻找错误的解决方案。
将光标放在循环上,从括号或大括号开始,然后按 C-M-n 这将运行命令forward-list
,它将光标跳转到匹配的末端paren或大括号。
打开缓冲区,移动到起始位置,使用 Cx 3 将窗口分成两半,移动到新窗口,然后使用forward-list
现在你应该有启动paren在左侧视图和右侧视图中的结束区域。
或者,使用隐藏显示来折叠循环内的代码块以缩小大小并可能将其放在一个屏幕上。
同时查看follow-mode
这将允许您在多个窗口中查看一个缓冲区,从而有效地将您可以看到的连续代码行数增加一倍或三倍。这适用于show-paren-mode
。
此外,如果缩进非常糟糕,请运行mark-whole-buffer
和indent-region
进行修复。
答案 2 :(得分:0)
以下是https://github.com/nschum/highlight-parentheses.el/blob/master/highlight-parentheses.el的修改,允许您向上或向下滚动而不删除叠加层。您可以添加其他this-command
语句以满足您的需求。
(defun hl-paren-highlight ()
"Highlight the parentheses around point."
(unless
(or
(eq this-command 'mwheel-scroll)
(eq this-command 'scroll-up)
(eq this-command 'scroll-down))
(unless (= (point) hl-paren-last-point)
(setq hl-paren-last-point (point))
(let ((overlays hl-paren-overlays)
pos1 pos2
(pos (point)))
(save-excursion
(condition-case err
(while (and (setq pos1 (cadr (syntax-ppss pos1)))
(cdr overlays))
(move-overlay (pop overlays) pos1 (1+ pos1))
(when (setq pos2 (scan-sexps pos1 1))
(move-overlay (pop overlays) (1- pos2) pos2)
))
(error nil))
(goto-char pos))
(dolist (ov overlays)
(move-overlay ov 1 1))))))