我自定义了一个函数 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里面,应该怎么搞啊?求大佬们指点。
找到方法了,判断一下就可以:
;; 保存 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的函数。
不是大佬 也是新人
你不是已经写了一个函数叫 my-indent-current-buffer
了吗, 你把条件判断式加进去就可以了。
额,这是我的函数,咋加啊?蠢哭了我,帮我写一下呗,
(defun my-indent-current-buffer ()
(interactive)
(save-excursion
(indent-region (point-min) (point-max) nil)))
如果你对自己的配置需求有一定要求,还是要对elisp有所了解的呀,C-h i m: Emacs Lisp Intro
。
(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 个赞
多谢多谢 我英文不好,啃了一点没肯下来 慢慢积累吧我
说实话 我不建议对所有文件都做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,其他的用到再说吧,慢慢肯文档,慢慢积累
已踩坑,要怎么remove-hook 掉 lambda呢?
好吧,解决了
(defun remove-lambda-from-hook (hook)
"Remove all lambda expressions from HOOK, keeping only the last one."
(let ((hook-list (symbol-value hook))
(last-lambda nil))
;; 找到最后一个 lambda 表达式
(dolist (func hook-list)
(when (and (functionp func) (not (symbolp func)))
(setq last-lambda func)))
;; 移除所有 lambda 表达式
(set hook
(cl-remove-if (lambda (x)
(and (functionp x)
(not (symbolp x))))
hook-list))
;; 将最后一个 lambda 表达式添加回去
(when last-lambda
(add-hook hook last-lambda))))
因为我原来的就有一个hook,就保留那个hook就好了