【问题标题】:Is it possible to have a specific org-mode file use a custom theme or face?是否可以让特定的组织模式文件使用自定义主题或面孔?
【发布时间】:2014-11-17 13:54:12
【问题描述】:

我希望能够指定特定于将在org-mode 中打开的文件的主题或自定义面孔集。有什么办法可以做到吗?我已经有了https://github.com/vic/color-theme-buffer-local,但这并没有提供在打开特定文件时自动应用它的方法。

理想的解决方案不涉及在我的 init.el 中进行硬编码,而是涉及在加载的文件(或引用的 setupfile)中设置变量或调用 elisp。

举个例子说明为什么这会很有用,一些文件非常扁平,使用一组样式更具可读性,而其他文件嵌套很深,并且受益于另一组样式。

【问题讨论】:

    标签: emacs themes org-mode


    【解决方案1】:

    原始发布者引用了一个名为 color-theme-buffer-local ( https://github.com/vic/color-theme-buffer-local ) 的特定库,原始发布者希望将其应用于以称为 org-mode 的主要模式打开的文件——仅当某个变量是t.

    以下示例通过调用代码行来使用color-theme-buffer-local 的说明中引用的代码:(load-theme-buffer-local 'misterioso (current-buffer)) 变量my-favorite-variable 将控制在打开org-mode 缓冲区时何时调用上一行代码 - - 即,当non-nil 适用时,nil 不适用。


    编辑(2014 年 11 月 16 日):以下是根据原始发布者希望使用文件局部变量的修订答案:

    https://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html#Specifying-File-Variables

    http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Local-Variables.html#File-Local-Variables

    原始发帖人在此答案下方的评论中描述的行为是由于常规org-mode-hook 在考虑文件局部变量之前运行之前。因此,当org-mode-hook 运行时(使用初始答案),变量my-favorite-variable 仍然是nil。以下修订后的答案使用hack-local-variables-hook,它在考虑文件局部变量之后运行。

    (defvar my-favorite-variable nil)
    
    (defun my-favorite-function ()
    (interactive)
      (when
          (with-current-buffer (current-buffer)
            my-favorite-variable)
        (load-theme-buffer-local 'misterioso (current-buffer))))
    
    (add-hook 'hack-local-variables-hook 'my-favorite-function)
    

    【讨论】:

    • 我在缓冲区中用C-c C-e 测试了(load-theme-buffer-local 'misterioso (current-buffer)),主题发生了变化。为了测试您的代码,我在暂存缓冲区中执行了它,并将 # -*- my-favorite-variable: 1; -*- 放入我的 org 文件中,用 C-x k 关闭它,然后重新打开它。主题没有改变。 M-: my-favorite-variable 表明它的值为 1。知道可能是什么问题吗?
    • 感谢您教我有关文件局部变量的知识,并帮助我了解标准的主要模式挂钩运行之前考虑文件局部变量。我发布了一个使用hack-local-variables-hook 的修订答案,它在考虑文件局部变量之后运行
    • 嗯!别客气 :)。很好的侦探,虽然我不喜欢使用文件局部变量 - 我只是希望能够以某种方式在文件中设置一些东西(最好是在设置文件中)来控制主题。这现在可以在文件中使用,但事实证明文件局部变量在 org-mode 中不是很好,并且在安装文件中也不起作用。所以我现在正在寻找其他方式(也许是 org-mode 文件标签)?
    • 其他想法可能是在文件打开时包含一组选项——例如,(1) do X; (2) 做Y; (3) 执行 Z - 如果不是 1、2 或 3 并且经过了设定的秒数(例如 10 秒),则选择默认选项(无论是什么)。另一个想法是创建一个特定的文件扩展名(使用auto-mode-alist 和一个自定义函数)来加载一种类型的主题,以及另一个加载不同主题的扩展名——例如文件名.org1 文件名.org2。第三个想法可能是有一个快速拨号——加载主题编号 1、2 或 3 主题——或快速拨号上提供 1、2 或 3 的功能
    【解决方案2】:

    据我所知,对于整个 Emacs 会话运行,颜色主题是全局的。这同样适用于背景颜色,我希望 shell 缓冲区为深色,否则为浅色;不可能自动取款机。

    如果您喜欢浅色背景,可以查看我的颜色主题“Leuven”(在 Emacs 24.4、MELPA 或 GitHub 上)并报告您认为有用的改进。

    【讨论】:

    • 原发帖者引用的库使用face-remapping-alist,这是用来使人脸缓冲区本地化的。您能否在您的答案中添加一个比较和对比语句,以解释您的颜色主题通常是全局的语句之间的区别,与使用face-remapping-alist 时的规则例外:gnu.org/software/emacs/manual/html_node/elisp/…
    • 感谢 fniessen 创建了鲁汶。我实际上是在问这个问题,因为您的主题非常适合我的一些文档(更多嵌套文档),但对其他文档非常不利(主要是浅层待办事项列表 - 例如,日晒对那些文档来说要好得多)。
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多