Emacs/AucTeX 中的折叠括号

Emacs/AucTeX 中的折叠括号

我有一些如下所示的代码:

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-modeC-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-overlaytex-fold.el。您可以使用 调用此函数M-x mg-TeX-fold-brace或将其绑定到您喜欢的键绑定。我C-c C-o p在示例中使用了 ,TeX-fold-mode自动在定义的键上添加前缀C-c C-o

要自动展开括号,请将点移动到括号之间;要永久显示括号,请使用C-c C-o iM-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))))

我的工作流程是

  1. 打开缓冲区
  2. 运行该函数自动折叠所有内容
  3. 如果您想编辑它并永久查看它,请抄送 Co i 删除该折叠

相关内容