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

Эта статеечка для начинающих пользователей 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              | Перейти в следующее окно              |
|---------+---------------------------+---------------------------------------|
+29
29 мая 2009, 23:54
24
evgenyk 10,4

комментарии (17)

+24
ilembitov #
Ух. Мне прям душу греет эта трушность — использовать ASCII-схемы вместо скриншотов)
0
ryukzak #
А почему нет, если у вас есть artist-mode…
–2
bobry #
скорее уж org-mode
+1
semka #
Да нет, именно артист судя по всему.
0
evgenyk #
Для пустых — артист, для табиц с текстом — орг. Я все никак не могу перестать наслаждаться таблицами орг-моде.
0
VlK #
Может, раз уж речь о начинающих, показать, как привязывать интерактивные команды к клавишам в .emacs?
+2
evgenyk #
Это пожалуй тема для еще одной статьи. Вообще, emacs неисчерпаем на темы, как электрон Ленина.

«Электрон, так же неисчерпаем, как и атом, природа бесконечна…» © В.И. Ленин
0
ryukzak #
Быть может лучше было бы привести хорошо прокомментированный пример конфига емакса? Небольшой только. Экрана 2. С вырезанием всяких модефикаций модов, собственных функций и прочих заумностей? Максимум джаббера конфиг оставить.
+1
hsvitaly #
А с фреймами то стало намного проще ) посему спасибо
+1
puzan #
Спасибо. Про dedicated-mode не знал ) полезная штука.
+1
ryukzak #
А никто не знает простого аналога desktop-save-mode, но такого, что бы он дружил с «виртульными рабочими столами» и фрэймами на них?

Для тех кто не использовал виртуальные раб столы. workspace.el. Совершенно чудесная вещь. С ней размер экрана уже не так важен. Рекомендую.

Также есть ещё вот такая вот штука follow-mouse.el Позволяет сделать так, чтобы фокус фрэйма был всегда под курсором мышки. На ноутбуке очень удобно, так как тачпад всегда близко. Со стационарны — не очень.
+1
aleo #
Есть еще несколько очень полезных команд для работы с окнами

C-x — подгоняет размер окно под файл (если например файл занимает всего пару строк)
C-x + делает все открытые окна одной высоты
С-x { и C-x } — уменьшает/увеличивает окно по ширине
C-x ^ — увеличивает окно по вертикали (на высоту одной строки)

Ну и напоследок www.xkcd.ru/378/ ;)
0
aleo #
Да, и еще одна дико удобная комбинация
C-M v и C-M-Shift v — эти два аккорда прокручивают вверх/вниз содержимое «другого» окна.
0
bobry #
ура! блог про емакс ожил :)
–5
litum #
Разобраться ко всех тонких нюансах настройки и проникнуться красотой идеологии emacs сможет только тот, кто не побрезгует съесть кусочек своей ноги.
+1
AS_Pushkin #
C-x 1 — скрыть все окна и оставить только текущее.
0
evgenyk #
Спасибо, добавил.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.