记住无扩展名的文件模式


10

我已经开始编辑许多没有扩展名的文件,但仍处于主要模式格式。

我是团队中唯一的Emacs用户,我不想让我的编辑器需要特殊的东西很痛苦。我想避免更改代码库。

  • 我无法更改文件名
  • 我不能使用特殊的Emacs注释

我希望Emacs记住我手动将文件放在最后(使用M-x conf-mode)的任何模式,并在我再次访问它时自动激活该模式。

savehist-mode用来处理持久性。

我可以轻松地做到这一点吗?


1
如果您可以编辑该文件,通常可以添加带有注释的第一行:# -*- mode: conf -*-,这将提示Emacs使用conf-mode。如果它们很少,并且您可以通过正则表达式进行匹配,则可以将regexp添加到中automode-alist
wvxvw 2015年

2
@wvxvw的局限之一是“ 我不能使用特殊的Emacs注释 ”。
PythonNut 2015年

2
抱歉,我不知道我怎么想念它。还有,这是auto-mode-alist我的坏事。
wvxvw 2015年

显然,这里的正确答案是让您团队的其他成员使用Emacs。任何其他答案都只是一种解决方法。
马拉巴巴

Answers:


13

有多种方法可以识别不依赖扩展名的文件的主要模式,请参见手册中的选择文件模式

根据您要处理的文件类型,也许可以使用magic-mode-alist。另请注意,auto-mode-alist不仅限于匹配的扩展名:您可以匹配文件名或路径的任何部分。

如果您要处理的文件对于这些机制不够一致,则一种选择是添加auto-mode-alist与整个文件名匹配的条目,或与某些项目的根路径匹配的条目,然后调用自定义函数以将名称与模式匹配。

如果给定目录中的所有文件均为同一类型,则也可以使用本地目录变量来设置模式。目录变量可以在您的init文件中设置,而不是在.dir-locals文件中设置- 有关详细信息,请参见目录变量

更新资料

这是管理您自己的绝对文件名和主模式列表的快速尝试。

(defvar my-custom-mode-alist '())
(defvar my-custom-mode-alist-file (expand-file-name "custom-file-assoc" user-emacs-directory))

;; command to save the file->mode association of the current buffer
(defun save-file-mode-association ()
  (interactive)
  (when buffer-file-name
    (add-to-list 'my-custom-mode-alist (cons buffer-file-name major-mode))
    (write-custom-mode-alist my-custom-mode-alist-file)))

(defun write-custom-mode-alist (file)
  (with-current-buffer (get-buffer-create " *Custom File Assocations*")
    (goto-char (point-min))
    (delete-region (point-min) (point-max))
    (pp my-custom-mode-alist (current-buffer))
    (condition-case nil
        (write-region (point-min) (point-max) file)
      (file-error (message "Can't write %s" file)))
    (kill-buffer (current-buffer))
    (message "Wrote custom file associations to file %s" file)))

(defun load-custom-mode-alist (file)
  (when (file-exists-p file)
    (with-current-buffer
        (let ((enable-local-variables nil))
          (find-file-noselect file))
      (goto-char (point-min))
      (setq my-custom-mode-alist (read (current-buffer)))
      (setq auto-mode-alist (append auto-mode-alist my-custom-mode-alist))
      (kill-buffer (current-buffer)))))

;; Load any custom file associations and add them to auto-mode-alist
(load-custom-mode-alist my-custom-mode-alist-file)

不幸的是,这些文件的格式非常宽松,并且具有非常通用的文件名。不过,感谢您指出的细节auto-mode-alist。将来我可能会magic-mode-alist在脑海中回想些事情。
PythonNut 2015年

4

根据Glucas的建议,以下内容似乎很有效。

(defvar file-name-mode-alist '())
;; other stuff here, of course
(setq savehist-additional-variables '(file-name-mode-alist))
(savehist-mode +1)
(setq auto-mode-alist (append auto-mode-alist file-name-mode-alist))

(add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (and
            buffer-file-name
            (not
              (file-name-extension
                buffer-file-name)))
       (setq file-name-mode-alist
        (cons
          (cons buffer-file-name major-mode)
          file-name-mode-alist))
      (setq auto-mode-alist
        (append auto-mode-alist
          (list (cons buffer-file-name major-mode)))))))

1
真好 比我一起破解的解决方案更优雅。:-)
glucas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.