1

为什么当我打开一个 .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))

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

编辑

好吧,问题只是我的 eval 函数处理窗口和缓冲区的方式,因此这段代码可以正确处理主要模式:

(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))

左侧窗口显示 foo.py(python 模式),右侧窗口显示暂存缓冲区(文本模式)。还有消息缓冲区和 python shell 缓冲区(inferior-python-mode)。现在只需在左侧窗口打开inferior-python-mode,在右侧窗口打开foo.py。

4

3 回答 3

2

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

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

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

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

于 2016-11-10T04:39:17.970 回答
2

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

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

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

因此,如果您发现当您打开一个名称以 .py 结尾的文件时,emacs 没有将缓冲区置于 python 模式,最可能的原因是没有 auto-mode-alist 条目,该键匹配您正在使用的文件名。

我没有用 python 编程,但我注意到我的系统上,我的 auto-mode-alist 中有以下条目

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

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

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

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

于 2016-11-10T07:43:33.590 回答
0

根据在启动时拆分窗口时给出的公认答案,如何在右侧打开文件?我能够实现所需的行为:

(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)))))
于 2016-12-16T00:02:28.507 回答