为什么当我打开.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))
左窗口应该显示python shell,右窗口应该显示打开的文件test.py。一切正常,但test.py处于基本模式,实际上scratch buffer被设置为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缓冲区(inferio -python-mode)。现在只需在左侧窗口打开inner -python模式,在右侧窗口打开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是与该键关联的值。这些cons单元格通常写成"点对",即键。值)。因此,auto- modelalist只是一个关联列表,其中每个关联用于将文件名模式与emacs模式关联起来。文件名模式通常表示为正则表达式。
当您在emacs中打开文件时,它将检查自动模式器,以查看是否有任何键(正则表达式)与文件名匹配。如果一个匹配,那么emacs将在加载文件后启动该模式。当没有匹配项时,emacs将默认只使用基本模式。
所以,如果你发现当你打开一个文件名以.py结尾的文件时,emacs没有将缓冲区置于python模式,最可能的原因是没有自动模式条目,其中一个键与你正在使用的文件名匹配。
我不使用python编程,但我注意到在我的系统中,在我的auto-mode-alist
中有以下条目("\.pyw?\'" . python-mode)
当我打开test.py时,我的emacs以python模式打开该文件。
让这个位工作或验证它在香草emacs中工作。如果不是,那么添加适当的条目,测试它的工作,然后添加回您的配置。
如果你发现它工作正常,直到你添加你的setup函数,然后回来,我们可以看看这个函数。您定义函数的方式有点混乱,当然可以改进,但没有什么明显的问题,这就是为什么我想看看是否只是打开一个python文件而没有任何其他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)))))