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              | Перейти в следующее окно              |
    |---------+---------------------------+---------------------------------------|
    

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 17

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

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

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

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

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

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

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

                      Самое читаемое