能否将复杂Emacs缩进检测代码转换为单行Modeline指令?
单行Emacs Modeline实现自动推断缩进风格
原有的
/* -*- indent-tabs-mode: t -*- */这类Modeline指令在C++等场景下存在局限,无法根据文件现有缩进自动切换空格或制表符的使用逻辑。可以将推断缩进风格的Lisp代码压缩为单行,通过Modeline的
eval:前缀执行:/* -*- eval: (progn (defun infer-indentation-style () (let ((space-count (how-many "^ " (point-min) (point-max))) (tab-count (how-many "^\t" (point-min) (point-max)))) (if (> space-count tab-count) (setq indent-tabs-mode nil)) (if (> tab-count space-count) (setq indent-tabs-mode t)))) (setq indent-tabs-mode nil) (infer-indentation-style)) -*- */这段指令的具体作用:
- 定义
infer-indentation-style函数,统计文件内行首以两个空格开头的行数、以制表符开头的行数 - 默认设置
indent-tabs-mode为nil(优先使用空格缩进) - 调用函数对比统计结果,自动切换缩进模式:空格占比更高则保留空格缩进,制表符占比更高则切换为制表符缩进
- 定义
注意事项:需确保Emacs允许本地文件执行这类代码,可通过配置
(setq enable-local-variables t)或在safe-local-variable-values中添加对应规则,避免触发安全提示。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

