我有一些如下所示的代码:
142 \newcommand*\john[2]{
143 blah blah blah blah
144 blah blah
145 blah blah blah
146 blah
147 }
148
149 \newcommand*\peter[3]{
150 blah blah
151 }
如果我可以双击(或按住 Ctrl 键单击,或其他方式){
第 142 行或第 147 行来得出“折叠”}
的定义,那就太好了,如下所示:\john
142 \newcommand*\john[2]{ ... }
148
149 \newcommand*\peter[3]{
150 blah blah
151 }
有这个功能吗?或者可以有这个功能吗?处理大文件时,这个功能会非常方便。
答案1
这应该可以工作(需要 AUCTeX 并且您首先需要使用TeX-fold-mode
或C-c C-o C-f启用M-x TeX-fold-mode
)
(defun mg-TeX-fold-brace ()
"Hide the group in which point currently is located with \"{...}\"."
(interactive)
(let ((opening-brace (TeX-find-opening-brace))
(closing-brace (TeX-find-closing-brace))
priority ov)
(if (and opening-brace closing-brace)
(progn
(setq priority (TeX-overlay-prioritize opening-brace closing-brace))
(setq ov (make-overlay opening-brace closing-brace
(current-buffer) t nil))
(overlay-put ov 'category 'TeX-fold)
(overlay-put ov 'priority priority)
(overlay-put ov 'evaporate t)
(overlay-put ov 'TeX-fold-display-string-spec "{...}")
(TeX-fold-hide-item ov))
(message "No group found"))))
;; Bind the function to C-c C-o p
(eval-after-load "tex-fold"
'(define-key TeX-fold-keymap "p" 'mg-TeX-fold-brace))
点必须放在括号内,括号除外。我几乎复制粘贴TeX-fold-make-overlay
了tex-fold.el
。您可以使用 调用此函数M-x mg-TeX-fold-brace
或将其绑定到您喜欢的键绑定。我C-c C-o p在示例中使用了 ,TeX-fold-mode
自动在定义的键上添加前缀C-c C-o。
要自动展开括号,请将点移动到括号之间;要永久显示括号,请使用C-c C-o i或M-x TeX-fold-clearout-item
。
从这个函数开始,可以编写一个函数来折叠任何你想要的东西。你需要找到一种方法来搜索折叠的开始和结束点。在这种情况下,我使用 AUCTeX 函数TeX-find-{opening,closing}-brace
来查找两个括号。在行中
(overlay-put ov 'TeX-fold-display-string-spec "{...}")
您可以设置用于替换折叠区域的字符串。
答案2
Giordano 解决方案完美,但缓冲区被杀死后折叠将消失。每次想要折叠时,都需要再次运行该函数。
我有另一种解决方案来自动折叠您想要的所有内容。我将此功能与注释一起使用。示例:
% Why I write this paragraph in latex \begin{fold}
% comment
% another comment
% \end{fold}
或者你想折叠段落或其他
% Paragraph that explains about A \begin{fold}
A is a letter. Another sentence. End of paragraph.
% \end{fold}
当你运行这个函数时。Mx latex-fold-foo 它将折叠所有 \begin{fold} \end{fold}
结果如下
% Why I write this paragraph in latex [fold]
% Paragraph that explains about A [fold]
每次将光标移动到折叠的段落时,它都会暂时打开。如果要删除折叠,请使用 Cc Co i
(defun latex-fold-foo ()
(interactive)
(save-excursion
(goto-char (point-min))
(while (search-forward (format "begin{fold}") nil t)
(TeX-fold-env))))
我的工作流程是
- 打开缓冲区
- 运行该函数自动折叠所有内容
- 如果您想编辑它并永久查看它,请抄送 Co i 删除该折叠