[英]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.