Когда окно разбивается при запуске, как открыть файл с правой стороны?
Как открыть файл foo, связанный с основным режимом (в данном случае это python, так что это foo.py), в правой части разделенного окна (и окно разделяется только для этого основного режима)? Следующий код не работает вообще (он отображает рабочий буфер с обеих сторон).
(defun my-eval-after-load-python()
(split-window-horizontally)
)
(eval-after-load "python" '(my-eval-after-load-python))
1 ответ
Для настройки конкретного major-mode
который соответствует имени файла или расширению файла, см. переменную auto-mode-alist
, Emacs 25 поддерживает python-mode
за .py
Расширения файлов "из коробки".
Предостережение при запуске: встроенная (жестко запрограммированная) библиотека startup.el
содержит некоторый выбор буферов / окон, которые отображаются при запуске. Настройка конкретной компоновки окна при запуске Emacs всегда является сложной задачей, и этот метод, скорее всего, будет индивидуальным для конкретного пользователя. Для лучших результатов пользователь может захотеть разместить функции организации окон в самом низу .emacs
или же init.el
или используйте emacs-startup-hook
(который работает в конце процесса запуска). Некоторые библиотеки, такие как desktop.el
(восстановление на рабочем столе) усложнит выбор того, какой буфер должен иметь фокус при завершении запуска. Каждый пользователь должен будет потратить некоторое время на организацию стартапа таким образом, чтобы он соответствовал его потребностям. Например, может быть два окна, и пользователь может захотеть сфокусироваться на другом - что-то вроде технологичного (other-window 1)
в нижней части файла настройки может быть все, что нужно. В приведенном ниже примере с my-display-buffer
, возвращаемое значение является окном - пользователь может захотеть перенести последнюю строку window
как это (select-window window)
так что он будет выбран; или вместо изменения my-display-buffer
Пользователь может добавить (select-window (my-display-buffer BUFFER ALIST DIRECTION))
при использовании функции без ее внутреннего изменения. Оригинальный постер также может быть заинтересован в использовании find-file
(для нацеливания на текущее окно), или find-file-other-window
(создать / настроить другое окно) - например, (find-file-other-window "~/foo.py")
,
Если фокус уже находится в нужном окне (например, окно справа уже выбрано), просто используйте что-то вроде set-window-buffer
или же switch-to-buffer
,
Чтобы управлять отображением буфера выше, ниже, влево или вправо, см. Следующий пример, который использует пользовательскую функцию под названием my-display-buffer
ниже:
Пример использования: определение функции my-display-buffer
должно появиться в .emacs
или же init.el
файл до использования любого из этих четырех примеров фрагментов.
(let ((buffer (find-file-noselect "~/foo.py")))
(with-current-buffer buffer
(message "major-mode: %s" major-mode))
(my-display-buffer buffer nil 'left))
или же
(let ((buffer (find-file-noselect "~/foo.py")))
(with-current-buffer buffer
(message "major-mode: %s" major-mode))
(my-display-buffer buffer nil 'right))
или же
(let ((buffer (find-file-noselect "~/foo.py")))
(with-current-buffer buffer
(message "major-mode: %s" major-mode))
(my-display-buffer buffer nil 'above))
или же
(let ((buffer (find-file-noselect "~/foo.py")))
(with-current-buffer buffer
(message "major-mode: %s" major-mode))
(my-display-buffer buffer nil 'below))
Пример функции:
(defun my-display-buffer (buffer alist direction &optional size pixelwise)
"BUFFER: The buffer that will be displayed.
ALIST: See the doc-string of `display-buffer' for more information.
DIRECTION: Must use one of these symbols: 'left 'right 'below 'above
SIZE: See the doc-string for `split-window'.
PIXELWISE: See the doc-string for `split-window'.
There are three possibilities:
- (1) If a window on the frame already displays the target buffer,
then just reuse the same window.
- (2) If there is already a window in the specified direction in relation
to the selected window, then display the target buffer in said window.
- (3) If there is no window in the specified direction, then create one
in that direction and display the target buffer in said window."
(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)
window))