簡體   English   中英

Emacs:為什么打開文件時未正確設置主模式?

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

當我打開.py文件(emacs test.py)時,為什么主模式沒有自動設置為python-mode? 我的.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緩沖區(下python模式)。 現在只需要在左側窗口中打開下級python-mode和在右側窗口中打開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-mode打開了它。

如果這不起作用,請檢查auto-mode-alist的值。 這是一個關聯列表,其中列表的每個元素是一個cons單元格,其中car是鍵,而cdr是與該鍵關聯的值。 利弊單元通常被寫為“點對”,即(鍵值)。 因此,auto-mode-alist只是關聯的列表,其中的每個關聯都用於將文件名模式與emacs模式關聯。 文件名模式通常表示為正則表達式。

在emacs中打開文件時,它將檢查auto-mode-alist以查看是否有任何鍵(正則表達式)與文件名匹配。 如果匹配,則文件加載后emacs將啟動該模式。 如果沒有匹配項,則emacs將默認為僅使用基本模式。

因此,如果您在打開以擴展名.py結尾的文件時發現emacs並未將緩沖區置於python模式下,則最可能的原因是該代碼沒有自動模式輔助項,而該項是與您使用的文件名匹配。

我沒有使用python編程,但是我在系統上注意到,在auto-mode-alist中有以下條目

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

當我打開test.py時,我的emacs以python-mode打開文件。

使此位正常工作或驗證它是否在香草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)))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM