Emacs 在所有文件的顶部隐藏长版权信息

Emacs 在所有文件的顶部隐藏长版权信息,emacs,hide,copyright-display,Emacs,Hide,Copyright Display,我们在所有源代码文件的顶部有15行的版权信息 当我在emacs中打开它们时,会浪费大量宝贵的空间。 有没有办法让emacs始终隐藏某条消息,但仍将其保留在文件中?看一看。基本上,您只需要找到一种方法来识别要折叠的零件,然后使用折叠车顶标记和折叠底部标记来标记它们。顺便说一句,EMACS elisp代码也有这样做的方法,因此您应该很容易找到可以修改的代码。您可以编写一个函数,将缓冲区缩小到除前15行以外的所有行 (defun hide-copyright-note () "Narrows th

我们在所有源代码文件的顶部有15行的版权信息

当我在emacs中打开它们时,会浪费大量宝贵的空间。

有没有办法让emacs始终隐藏某条消息,但仍将其保留在文件中?

看一看。基本上,您只需要找到一种方法来识别要折叠的零件,然后使用
折叠车顶标记
折叠底部标记
来标记它们。顺便说一句,EMACS elisp代码也有这样做的方法,因此您应该很容易找到可以修改的代码。

您可以编写一个函数,将缓冲区缩小到除前15行以外的所有行

(defun hide-copyright-note ()
  "Narrows the current buffer so that the first 15 lines are
hidden."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (forward-line 15)
    (narrow-to-region (point) (point-max))))
然后,您需要做的就是确保为包含版权说明的每个文件调用此函数。这可以通过添加一个钩子来实现,最好是添加到文件的主模式。例如,您可以将上述函数定义和以下行添加到.emacs文件中:

(add-hook 'c-mode-hook 'hide-copyright-note)
每当你打开一个C文件时,这将调用函数“隐藏版权注释”

实际上,您可能希望使钩子函数更加智能,方法是检查要隐藏的版权说明是否确实存在,或者仅当文件位于某个目录中时运行隐藏版权说明等

例如,为了坚持使用C示例,您可以在上述函数中插入以下测试:

(defun hide-copyright-note ()
  "Narrows the current buffer so that the first 15 lines are
hidden."
  (interactive)
  (when (copyright-message-p)
    (save-excursion
      (goto-char (point-min))
      (forward-line 15)
      (narrow-to-region (point) (point-max)))))

(defun copyright-message-p ()
  "Returns t when the current buffer starts with a Copyright
note inside a C-style comment"
  (save-excursion
    (goto-char (point-min))
    (looking-at "\\s */\\*\\(:?\\s \\|\\*\\)*Copyright\\b")))
至于你关心的其他问题:

当我在emacs中打开它们时,会浪费很多宝贵的空间

…或者你可以向下滚动。为了自动实现这一点,我们可以使用以下功能,而不是使用
隐藏版权说明

(defun scroll-on-copyright ()
  "Scrolls down to the 16th line when the current buffer starts
with a copyright note."
  (interactive)
  (when (copyright-message-p)
    (goto-char (point-min))
    (beginning-of-line 16)
    (recenter 0)))
然而,我推荐第一种变体的原因是,如果您只是自动向下滚动,那么无论何时跳转到缓冲区的开头(
M-您可以使用它,这是一个标准的内置包,它有一个名为
hs hide initial comment block
的通用命令,可以执行您想要的操作,而无需知道顶部注释部分的长度。您可以将其添加到任何语言的模式挂钩中,但下面是一个使用C的示例:

(add-hook 'c-mode-common-hook 'hs-minor-mode t)
(add-hook 'c-mode-common-hook 'hs-hide-initial-comment-block t)

请注意,它不仅仅隐藏版权,还隐藏了完整的初始注释块,这可能会隐藏有用的文档。

很抱歉延迟@Thomas,该功能非常有效!您对如何使该功能仅适用于以版权声明开头的文件有何建议?例如,我很高兴将其应用于y表示以“/*\n*版权”开头的任何内容
。至于你的其他评论,有没有办法让emacs在打开时自动向前滚动15行?为了简单起见,这可能是一个更好的解决方案。再次感谢。@sligocki:使用正则表达式搜索可以很容易地测试一个文件是否包含版权声明。我编辑了我的答案,以便为
“/*\n*版权”
根据您的要求-但是,您确定这不会使通知长达16行吗?在任何情况下,您都可以只搜索初始注释的结尾,而不使用固定的行数(
“*/”
)然后跳转到之后的第一个非空行。这样做将使不同长度的版权声明的方法更加灵活。请注意,此解决方案与行号冲突(行号偏移不正确)。@ideasman42请查看此解决方法:使用内置包,而不是折叠模式。