想要header line根据不同的文件来显示或不显示应该怎么做

如,我想在.el下面利用header line 显示路径,但是在scratch buffer下面不显示怎么做? 我使用 setq-default header-line-format 要么都显示要不都不显示。

使用 setq header-line-format 的话只有当前buffer显示是对的,但是是手动的。怎么动态都判断当前buffer是否需要显示而控制这个变量?

我使用了这个hook,(add-hook 'buffer-list-update-hook #'header--header-line-active) 不知道对不对?可以达到效果。

一个思路

(defun foo ()
  (when buffer-file-name
    (setq header-line-format "%f")))

(add-hook 'emacs-lisp-mode-hook #'foo)

这个覆盖面积有点大了。是我没说清楚。我是需要有一个过滤器来根据规则显示。

有可能要显示的是1.el,2.md,但是2.el,1.md就不显示。这个过滤器是个自定义函数。所以要对每个buffer做下判断才行

再请教个题外话。hook有执行顺序么?有没有办法控制在同一个hook下的函数执行顺序?

看你想从哪里控制,如果有个别文件需要的话,可以用 file local variable;

;; -*- eval: (setq header-line-format "%f"); -*-

还可以写个 Global 或者 Local Minor Mode 控制,在里面做控制,注意 Global Minor Mode 杀伤力大。

EDIT: Global minor mode 好像不行,试试 find-file-hook。

有,见 add-hook 的参数。

我有根据不同的文件来显示不同的header line,文件都是同一个mode,就在hook里面写if语句判断文件后缀名做不同操作,比如我org文件的header-line默认显示行号,文件名,完整路径。但后缀名是data.org的文件又对header-line做了其它处理

(add-hook 'org-mode-hook (lambda ()
   (cond 
     ;;如果文件最后8个字符是data.org
      ((equal (substring buffer-file-name -8) "data.org")
         (progn
            (setq header-line-format '(" %l " my-data-org-title " " default-directory ))
        ))
  )))

我data.org的文件内容是保存在数据库里,浏览器中查看的,生成data.org是为了方便编辑,于是定义了一个变量在header-line标注当前文件状态是已连接数据库在同步中,还是已断开连接

可以参考awesome-tab代码