如何给指定文件添加模式

我想把一个具体的文件,譬如test.org在打开的同时自动设置成只读模式,应该怎么做

我只会

(add-hook 'org-mode-hook 'read-only-mode)

但是这样所有的org都变成只读了

(add-to-list 'auto-mode-alist '("\\FILENAME\\'" . read-only-mode))

哦哦,感谢大神解答

我想扩展一下,有没有对这种具体的一个文件进行自定义设置,比如字体颜色,快捷键这些,有这种可能吗

(define-derived-mode org-read-only-mode org-mode "Org + read-only"
  "Major mode for readonly org file."
  (read-only-mode 1))

(add-to-list 'auto-mode-alist '("\\FILE.org\\'" . org-read-only-mode))

大概明白了,就是多用define-derived-mode来自定义字体,颜色和快捷键这些,然后add-to-list,大神我这样理解对吗

define-derived-mode 用来定义一个派生模式,所有特性都继承自父模式,不用设置就可以用了,要加个性化设置也可以。

懂了这下子,谢谢大神指点

我是在主mode hook里面写if语句判断文件后缀名,不同文件执行不同操作,比如js和json文件我都用js-mode,但是打开文件时做不同操作

(add-hook 'js-mode-hook (lambda ()
   (cond 
     ((equal (substring buffer-file-name -5) ".json");如果文件后缀名是json
       (progn 
         ;;json文件用js mode打开时自动格式化
         (json-pretty-print-buffer)
         (message "json-pretty"))
       )
     (t ;(tide-setup)
      (nox-ensure);js文件从tide改成用@manateelazycat的nox来补全
      ))
))

并没有效果

add-to-list没有起效

\\file.org\\’ 这个格式我是不是没有写对 “~/text/a.org’”

想要正确匹配,需要扩展全名,然后再转义:

(regexp-quote (expand-file-name "~/test.org"))

每个模式都派生或设置 hook 稍嫌麻烦,可以统一处理:

(defvar read-only-file-list
  (list
   (expand-file-name "~/test.org")
   ))

(defun enable-read-only-fn ()
  (when (member (expand-file-name (buffer-file-name)) read-only-file-list)
    (read-only-mode 1)))

(add-hook 'find-file-hook #'enable-read-only-fn)
1 个赞

我马上试试这个

这个正常了,上面那个我不知道我是不是哪里写错了,再去看看

搞来搞去是我自己搞错了,大神已经写明白是file name我非加上路径,搞出这么多问题,不好意思大神,现在明白了,都设置成功

万分感谢

auto-mode-alist 不是设置 major mode 的吗,read-only-mode 是个 minor mode。

正确的做法之一是 file local variable 设置 buffer-read-only。

* hello

# Local Variables:
# buffer-read-only: t
# End:
3 个赞

这样设置还是可以编辑,并不是只读

从自定义链接颜色到最后的快捷键,都是对任何org文件起效,并不是单独对 辨证分类这个文件生效,我想我对twlz0ne大神的话理解错误,但是不知道错在哪里?

起初想实现的功能是给辨证分类这个文件单独启用只读模式,然后为org level定义不同的字体颜色,配置几个快捷键

目前除了颜色字体不知道怎么搞,只读和快捷键倒是可以了,只是快捷键在所有org里面生效,只读正常

请教我的错误在哪里,要如何修改呢,感谢

快捷键和颜色需必须定义成 buffer local 才不会影响父模式:

(define-derived-mode org-read-only-mode org-mode "org-read-only"
  "Major mode for readonly org file."
  (read-only-mode 1)

  ;; faces
  (setq-local face-remapping-alist
              '((org-link (:foreground ...))))
  ;; keys
  (use-local-map (copy-keymap (with-no-warnings org-mode-map)))
  (local-set-key (kbd "C-c C-c") ...)
  )

同一主mode打开不同文件时同样的快捷键绑定不同的功能,按我上面的方法我测试了下面的代码可行,不过大家好像都不喜欢这样的用法

(add-hook 'org-mode-hook (lambda ()
  ;;……
  (cond 
   ;;如果文件最后8个字符是data.org
     ((equal (substring buffer-file-name -8) "data.org")
       (progn ;;这是只对data.org文件生效的快捷键
          (local-set-key (kbd "C") 'next-line)
       ))
     (t ;对不是data.org的org文件生效的快捷键
          (local-set-key (kbd "C") 'hydra-org-mode/body)
     ))
))

我这没有问题,file local 变量要生效的话,需要重新打开文件(或者M-x normal-mode)。

感谢大神,这下子好了,我也完全明白了

感谢大神,这个方案可以用,只是不适合我这个文件,不过另有几个文件可以用这个,也是一个解决方案

明白了,感谢大神,只是对我这个文件不是很合适,因为多了三行代码又不能隐藏,整个文档看起来很奇怪