如何用Emacs-Lisp阻止创建或写入名为:w的文件?
阻止Emacs创建或写入名为
:w的文件 你之前的代码没生效主要有三个问题:
- 新建未保存的buffer里,
buffer-file-name的值是nil,根本触发不了判断逻辑 - 就算是保存已有文件,
buffer-file-name返回的是完整文件路径,不是单纯的:w,字符串匹配永远不成立 - 只是用
message提示,根本不会中断保存流程,文件该写还是会写
下面是能生效的代码:
;; 阻止创建或写入名为 ":w" 的文件(Evil误操作防护) (defun guard-against-mistake-w-file () (let ((filename (file-name-nondirectory (or buffer-file-name "")))) (when (string= filename ":w") (error "禁止创建/写入 :w 文件——这肯定是Evil模式下的误操作!") nil))) ;; 挂载到保存前钩子,触发时直接中断错误操作 (add-hook 'before-save-hook 'guard-against-mistake-w-file)
代码说明:
file-name-nondirectory:从完整路径里提取纯文件名,比如/home/xxx/:w会被转成:w,确保匹配准确or buffer-file-name "":处理新建buffer还没设置文件名的情况,避免nil传入函数报错error:直接抛出错误中断保存,同时弹出提示,比单纯的message更有强制力,用户一眼就知道操作被拦截了before-save-hook:覆盖所有保存操作(比如C-x C-s、save-buffer等),只要触发保存就会检查
内容的提问来源于stack exchange,提问作者user3875388
相关产品推荐
相关产品推荐

