[已解决]请教一个remove-hook的问题

我自定义了一个函数 my-indent-current-buffer 用来格式化当前 buffer。

我使用了

(add-hook 'before-save-hook 'my-indent-current-buffer)   ; 保存 buffer 前格式化整个 buffer
(add-hook 'before-save-hook 'delete-trailing-whitespace) ; 让 emacs 在保存时自动清除行尾空格及文件结尾空行

在保存 buffer 前会自动格式化 buffer,并删除行尾空格,这是全局开启的,我想在某一个 mode 里面禁用 my-indent-current-buffer功能但是保留delete-trailing-whitespace 功能应该怎么写啊,比如在markdown-mode里面,应该怎么搞啊?求大佬们指点。 :pray:

找到方法了,判断一下就可以:

;; 保存 buffer 前格式化整个 buffer (排除 markdown-mode)
(add-hook 'before-save-hook
  (lambda ()
    (unless (eq major-mode 'markdown-mode)
      (my-indent-current-buffer))))
;; 让 emacs 在保存时自动清除行尾空格及文件结尾空行
(add-hook 'before-save-hook 'delete-trailing-whitespace)

不建议 加hook的时候用lambda表达式,因为这样会在remove-hook的时候很麻烦,同样对于advice-add。最好对每个hook定义一个有symbol的函数。

:thinking: 我不知道该咋写 :laughing: 大佬可以帮忙写一下么 :smiley:

不是大佬 也是新人 :slight_smile:

你不是已经写了一个函数叫 my-indent-current-buffer 了吗, 你把条件判断式加进去就可以了。

额,这是我的函数,咋加啊?蠢哭了我,帮我写一下呗, :pray: :pray:

(defun my-indent-current-buffer ()
  (interactive)
  (save-excursion
    (indent-region (point-min) (point-max) nil)))

如果你对自己的配置需求有一定要求,还是要对elisp有所了解的呀,C-h i m: Emacs Lisp Intro:slight_smile:

(defun my-indent-current-buffer ()
  "Indent each buffer before saveing process specified by my
customization excepted for `markdown-mode'.

NOTE: this function is a hook for `before-save-hook'."
  (interactive)
  (unless (eq major-mode 'markdown-mode)
    (save-excursion
      (indent-region (point-min) (point-max) nil))))
1 个赞

多谢多谢 :pray: 我英文不好,啃了一点没肯下来 慢慢积累吧我

说实话 我不建议对所有文件都做indent的操作, 这你以后肯定会遇到很多麻烦。最好对需要的文件做这种operation,其实你不仅可以利用major-mode做判断,文件名,甚至是buffer-name都可以。

1 个赞

哦 这样啊 我暂时用emacs就是用ox-hugo写日志,和写 c ,indent 用在org和c文件,排除 markdown 是因为ox-hugo导出的markdown有一些标签是html的,比如代码块高亮开启行号和行高亮后的标签是{{< highlight c "linenos=table, linenostart=1, hl_lines=1" >}} {{< /highlight >}},indent markdown会丢失代码块的缩进,所以把它排除掉indent,其他的用到再说吧,慢慢肯文档,慢慢积累