Emacs: Почему основной режим не установлен правильно при открытии файла?
Почему основной режим не устанавливается автоматически в режим python, когда я открываю файл.py (emacs test.py)? Некоторые части моего.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, а в правом - открытый файл 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 (inferior-python-mode). Теперь нужно открыть режим inferior-python в левом окне и файл foo.py в правом окне.
3 ответа
На основании принятого ответа, приведенного в разделе Когда окно разбивается при запуске, как открыть файл с правой стороны? Я смог реализовать желаемое поведение:
(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)))))
Сначала начните с основ. Избавьтесь от своих настроек, связанных с Python. Перезапустите emacs и посмотрите, открывает ли файл.py его в режиме python.
Если это не работает, проверьте значение auto-mode-alist. Это список ассоциаций, в котором каждый элемент списка является cons-ячейкой, где car - это ключ, а cdr - значение, связанное с этим ключом. Эти минусы часто пишутся как "пунктирные пары", т. Е. (Ключ. Значение). Таким образом, auto-mode-alist - это просто список ассоциаций, где каждая ассоциация используется для связи шаблона имени файла с режимом emacs. Шаблоны имен файлов обычно представлены в виде регулярных выражений.
Когда вы открываете файл в emacs, он проверит auto-mode-alist, чтобы увидеть, соответствует ли какой-либо из ключей (регулярных выражений) имени файла. Если он совпадает, то emacs запустит этот режим после загрузки файла. Когда совпадений нет, emacs по умолчанию просто использует основной режим.
Итак, если вы обнаружите, что emacs не помещает буфер в режим python, когда вы открываете файл с именем, заканчивающимся расширением.py, наиболее вероятной причиной является отсутствие записи auto-mode-alist, которая является ключом, который соответствует имени файла, который вы используете.
Я не программирую на python, но я замечаю, что в моей системе есть следующая запись в моем auto-mode-alist
("\\.pyw?\\'" . python-mode)
Когда я открываю test.py, мой emacs открывает файл в режиме python.
Получите этот бит работает или убедитесь, что он работает в ванильном Emacs. Если это не так, добавьте соответствующую запись, протестируйте ее и добавьте обратно свою конфигурацию.
Если вы обнаружите, что он работает правильно, пока вы не добавите свою функцию настройки, вернитесь, и мы можем посмотреть на эту функцию. То, как вы определили вашу функцию, немного запутанно и, безусловно, может быть улучшено, но ничего очевидного не возникает как проблема, поэтому я хотел бы посмотреть, работает ли просто использование файла pythong без каких-либо других средств настройки python.
Итак, вы говорите Emacs найти файл foo.py, и Emacs читает его в новый fundamental-mode
буфер, а затем вызывает python-mode
,
Это автозагрузка, поэтому сначала она должна загрузиться python.el
, после чего включается ваша eval-after-load, и вы начинаете возиться с выбранным буфером.
После этого, python-mode
на самом деле вызывается - но вы оставили другой выбранный буфер, поэтому режим включается для этого буфера, а foo.py остается в фундаментальном режиме.
Оборачиваем ваш код в save-current-buffer
было бы разумным началом, но вы также можете быть более явными в своих манипуляциях, а не полагаться на other-window
делать то, что вы хотите.