Emacs:为什么打开文件时主模式设置不正确?

Emacs: Why major mode is not set correctly when file is opened?

为什么当我打开.py 文件(emacs test.py) 时主模式没有自动设置为python-模式?我的 .emacs 中处理 python 的某些部分是:

(setq
 python-shell-interpreter "ipython"
 python-shell-interpreter-args "--gui=wx --matplotlib=wx --colors=Linux"
)

(defun my-eval-after-load-python()
    (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57)))
    (split-window-horizontally (floor (* 0.49 (window-width))))
    (other-window 1)
    (run-python (python-shell-parse-command))
    (python-shell-switch-to-shell)
    (other-window 1)
)
(eval-after-load "python" '(my-eval-after-load-python))

左 window 应该显示 ipython shell 和右 window 打开的文件 test.py。一切正常,但 test.py 处于基本模式,实际上暂存缓冲区设置为 python-模式。

编辑

好吧,问题在于我的 eval 函数处理 windows 和缓冲区的方式,因此此代码正确处理主要模式:

(defun my-eval-after-load-python()
  (setq initial-frame-alist '((top . 48) (left . 45) (width . 142) (height . 57)))
  (split-window-horizontally (floor (* 0.49 (window-width))))
  (run-python (python-shell-parse-command))
)
(eval-after-load "python" '(my-eval-after-load-python))

左侧 window 显示 foo.py(在 python 模式下),右侧 window 显示暂存缓冲区(在文本模式下)。还有消息缓冲区和 python shell 缓冲区(劣质-python-模式)。现在只要打开左边window的劣质-python模式和右边window.foo.py的foo.py模式即可。

好的,所以你告诉 Emacs 查找文件一些 foo.py 文件,Emacs 将它读入一个新的 fundamental-mode 缓冲区,然后调用 python-mode.

那是一个自动加载,所以首先它必须加载 python.el,然后你的 eval-after-load 开始,你开始弄乱选定的缓冲区。

在那之后,python-mode 实际上被调用了——但是您已经选择了其他一些缓冲区,因此该缓冲区的模式被启用,并且 foo.py 保持在基本模式。

将您的代码包装在 save-current-buffer 中是一个明智的开始,但您可能还希望在操作中更加明确,而不是依赖 other-window 来执行您想要的操作。

先从基础开始。摆脱你的 python 相关配置。重新启动 emacs 并查看打开 .py 文件是否以 python 模式打开它。

如果这不起作用,请检查 auto-mode-alist 的值。这是一个关联列表,其中列表的每个元素都是一个 cons 单元格,其中 car 是键,cdr 是与该键关联的值。这些缺点单元格通常写为 "dotted pairs" 即(键。值)。所以 auto-mode-alist 只是一个关联列表,其中每个关联都用于将文件名模式与 emacs 模式相关联。文件名模式通常表示为正则表达式。

当您在 emacs 中打开文件时,它会检查自动模式列表以查看是否有任何键(正则表达式)与文件名匹配。如果匹配,则 emacs 将在加载文件后启动该模式。当没有匹配项时,emacs 将默认只使用基本模式。

因此,如果您发现当您打开名称以扩展名 .py 结尾的文件时 emacs 没有将缓冲区置于 python 模式,最可能的原因是没有自动-mode-alist entry which a key 与您正在使用的文件名相匹配。

我不使用 python 编程,但我在我的系统上注意到,我的自动模式列表中有以下条目

("\.pyw?\'" . python-mode)

当我打开 test.py 时,我的 emacs 在 python 模式下打开文件。

让这个位工作或验证它在普通 emacs 中工作。如果不是,则添加适当的条目,测试它是否有效,然后添加回您的配置。

如果您在添加设置函数之前发现它可以正常工作,请返回,我们可以查看该函数。您定义函数的方式有点混乱,当然可以改进,但没有什么明显的问题跳出来,这就是为什么我想看看是否只打开 pythong 文件而不使用任何其他文件python 设置工作正常。

根据 中给出的已接受答案,我能够实现所需的行为:

(defun my-eval-after-load-python (buffer alist direction &optional size pixelwise)
  (setq initial-frame-alist '((top . 44) (left . 18) (width . 135) (height . 49)))
  (let ((window
        (cond
        ((get-buffer-window buffer (selected-frame)))
        ((window-in-direction direction))
        (t (split-window (selected-window) size direction pixelwise))
        )
       ))
   (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated) 
   (run-python (python-shell-parse-command))
   (other-window 1) 
   (python-shell-switch-to-shell) 
   (select-window window)
  )
)

(eval-after-load "python" '(my-eval-after-load-python (current-buffer) nil 'right (floor (* 0.49 (window-width)))))