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



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

相关内容

  • 没有找到相关文章

最新更新