【问题标题】:Emacs hide/show support for C++ triple-slash Doxygen markup?Emacs 隐藏/显示对 C++ 三斜杠 Doxygen 标记的支持?
【发布时间】:2010-05-29 18:16:35
【问题描述】:

我使用 Doxygen 的三斜杠语法来标记我的 C++ 代码。有 出现的两个重要案例:

1) 块标记 cmets,它是行上的唯一元素,并且可以 或者可能不会开始向左冲洗;例如

class foo
/// A one sentence brief description of foo.  The elaboration can
/// continue on for many lines.
{
    ...
};

void foo::bar
    /// A one sentence brief description of bar.  The elaboration can
    /// continue on for many lines.
    () const
{
    ...
}

2) 总是跟随一些 C++ 的尾随标记 cmets 第一行较早的标记,但仍可能溢出到 后续行;例如

class foo
{
    int  _var1;                 ///< A brief description of _var1.
    int  _var2;                 ///< A brief description of _var2
                                ///< requiring additional lines.
}

void foo::bar
    ( int arg1                  ///< A brief description of arg1.
    , int arg2                  ///< A brief description of arg2
                                ///< requiring additional lines.
    ) const
{
    ...
}

我想知道有哪些隐藏/显示支持来处理这些约定。 最重要的情况是块标记 cmets。理想情况下我会 希望能够完全消除这些,这意味着我会 不想浪费一条线来简单地表示折叠的存在 阻止标记注释,更喜欢边缘标记,例如 hideshowvis.el

【问题讨论】:

    标签: c++ emacs doxygen


    【解决方案1】:

    也许,作为部分答案,以下 sn-p 代码可以解决问题。 在 C++ 模式下按 M-s M-s ,它会隐藏您描述的所有类型的 cmets。再次按 M-s M-s 再次显示 cmets。我知道短代码有其局限性:

    1. 如果可以分别隐藏/显示每条特殊评论,那就太好了。

    2. 由于所有特殊的 cmets 都是隐藏的,因此您经常需要 M-s M-s。因此,hs1-mode 应该对大型 C++ 文件更有效(也许应该通过 jit-font-lock 实现)。

    3. 特殊 cmets 的连续行应连接到一个隐藏块。


    (defvar hs1-regexp
      "\\(\n[[:blank:]]*///\\|///<\\).*$"
      "List of regular expressions of blocks to be hidden.")
    
    (define-minor-mode hs1-mode
      "Hide/show predefined blocks."
      :lighter " hs1"
      (if hs1-mode
          (let (ol)
        (save-excursion
          (goto-char (point-min))
          (while (search-forward-regexp hs1-regexp nil 'noErr)
            (when (eq (syntax-ppss-context (syntax-ppss (match-end 1))) 'comment)
              (setq ol (make-overlay (match-beginning 0) (match-end 0)))
              (overlay-put ol 'hs1 t)
              (overlay-put ol 'invisible t)
              ))))
        (remove-overlays (point-min) (point-max) 'hs1 t)
        ))
    
    (add-hook 'c++-mode-hook '(lambda () (local-set-key (kbd "M-s M-s") 'hs1-mode)))
    

    【讨论】:

    • 非常感谢。这正是我想要的。
    • 由于某种原因,当我按下 Alt+s(一次或两次)时没有任何反应,但我可以通过 Alt+x hs1-mode 切换到该模式。
    猜你喜欢
    • 2021-06-20
    • 2012-02-13
    • 2014-12-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2015-01-27
    • 2015-10-16
    • 2012-11-08
    相关资源
    最近更新 更多