Когда окно разбивается при запуске, как открыть файл с правой стороны?

Как открыть файл 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))
Другие вопросы по тегам