Pull to refresh

Emacs для начинающих: управление окнами, dedicated-mode

Reading time3 min
Views8K
Эта статеечка для начинающих пользователей Emacs, рассказывает об управлении окнами в этом замечательном редакторе.

Многие пользователи, работающие под Линуксом, так же как впрочем и под другими Unix-ами, а некоторые даже и под Windows, используют в качестве редактора Emacs.

Редактор не просто мощный, а сверхмощный, но как каждая мощная вещь, требует некоторых усилий в освоении. Расскажу про управление окнами.

Несколько слов о терминологии. В Emacs она несколько необычна. То, что обычно мы называем окном, в Emacs называется фреймом (frame). Окном (window) называется некоторая часть фрейма. Обычно окно занимает весь фрейм, но можно разделить фрейм на несколько окон, что очень, очень удобно.

Например команда C-x 2 делит текущее окно по горизонтали на два других окна, команда C-x 3 делает то же самое, но по вертикали, C-x 0 уничтожает текущее окно. Для навигации по окнам есть несколько способов. Первый, это просто кликнуть мышкой по нужному окну. Второй, использовать комбинацию клавиш «перейти к следующему окну», C-x o, команда/функция (other-window). Ну и третий способ, вставить в .emacs строчку:

(windmove-default-keybindings)

Теперь можно двигаться по окнам, используя комбинацию клавиш Shift-<стрелка> или по emacs-овски, <S-up>, <S-down>, <S-left>, <S-right>.

То же самое можно делать из скриптов.

Таки образом, например определив в нашем файле .emacs функцию:

(defun my-make-three-windows () 
  "Make three windows"
  (interactive)
  (split-window-horizontally)
  (split-window-vertically)	
  )

и вызвав ее на выполнение, мы получим следующую конфигурацию окон:
|-----------+-----------|
|           |           |
|           |           |
|-----------+           |
|           |           |
|           |           |
|-----------+-----------|

Лично я, в своем органайзере, на базе org-mode использую вот такую комбинацию:

+----------+---------------+---------------+
|          |               |               |
|          |               |               |
|          |               |               |
|          +---------------+---------------+
|          |                               |
|          |                               |
|          |                               |
+----------+-------------------------------+

Интересно, но какая из всего этого польза? Ну например, можем в каждом из окон открыть интересующий нас файл. Модифицируем функцию:

(defun my-make-three-windows () 
  "Make three windows"
  (interactive)
  (find-file "~/file_1")
  (split-window-horizontally)
  (find-file "~/file_2")
  (split-window-vertically)	
  (find-file "~/file_3"))

Так, хорошо, но вот если у нас уже поделено пространство на окна, наша функция делит текущее окно на три части, а мы хотим, чтобы наши окна занимали бы весь фрейм. Нет вопросов. Добавляем первой строчкой уничтожение других окон:

(defun my-make-three-windows () 
  "Make three windows"
  (interactive)
  (delete-other-windows)
  (find-file "~/file_1")
  (split-window-horizontally)
  (find-file "~/file_2")
  (split-window-vertically)	
  (find-file "~/file_3"))

Теперь мы хотим, чтобы в правом окне, у нас находился бы всегда один и тот же буфер, с открытым файлом, а Emacs делает хочет, и запросто может поместить в нашем окне нежелательный нам буфер. Применим dedicated-mode. В Ubuntu он находится в пэкидже emacs-goodies. Итак, устанавливаем emacs-goodies. и добавляем в нашу функцию команду:

(defun my-make-three-windows () 
  "Make three windows"
  (interactive)
  (delete-other-windows)
  (find-file "~/file_1")
  (split-window-horizontally)
  (find-file "~/file_2")
  (split-window-vertically)	
  (find-file "~/file_3")
  (other-window 1)
  (other-window 1)
  (dedicated-mode))

Обратите внимание на строчку (other-window 1), это мы перегнали курсор в нужное нам окно, и только тогда подали команду (dedicated-mode). Теперь наше правое окно будет всегда связано с буфером файла «file_1».

Эту же самую команду можно подать и интерактивно, она привязана к клавишам ESC M-d.

Табличка клавиш/функций:
|---------+---------------------------+---------------------------------------|
| Клавиши | Функция                   | Действие                              |
|---------+---------------------------+---------------------------------------|
| C-x 1   | delete-other-windows      | Удалить другие окна, оставить текущее |
| С-x 2   | split-window-vertically   | Делит по вертикали                    |
| C-x 3   | split-window-horizontally | Делит по горизонтали                  |
| C-x 0   | delete-window             | Уничтожает текущее окно               |
| ESC M-d | dedicated-mode            | Влк/выкл назначенный режим            |
| C-x o   | other-window              | Перейти в следующее окно              |
|---------+---------------------------+---------------------------------------|
Tags:
Hubs:
+29
Comments17

Articles