11 апр. 2011 г.

Org-mode - вся твоя жизнь в plain-text формате!

Сегодня я собираюсь написать об одном расширении Emacs'а, которое способно изменить ваш распорядок жизни раз и навсегда.
Эта небольшая программа, написанная на EmacsLisp'е, называется org-mode. Она создана, чтобы сделать человеческую жизнь организованной, чтобы не растрачивать зря драгоценные секунды и минуты...
Вы вольны использовать org-mode в качестве ежедневника, TODO-листа, планировщика проектов или для обычных заметок. Существуют уникумы, которые используют org-mode как табличный редактор, но сейчас я не планирую описывать как это делается.

Вначале я хотел просто перевести мануал с оффсайта расширения, но потом решил, что будет лучше, если я покажу на простых примерах, как можно использовать org-mode в своей жизни.

Установка

Вначале нужно установить org-mode. Можно воспользоваться пакетным менеджером дистрибутива, если в репозиториях присутствует пакет с org-mode. А можно просто скачать исходники с сайта расширения (ссылка на него приведена в конце статьи) и скопировать все *.el файлы куда-нибудь в район ~/.emacs.d/elisp/org/. Потом нужно прописать следующие строки в ~/.emacs и перезапустить гхм, ... текстовый редактор:

Использование

Вначале парочка простых примеров...

Откроем тестовый файл ~/test.org и добавим в его начало следующие строчки:
#+STARTUP:  showall
#+STARTUP: hidestars
Благодаря им, информация отображаемая org'ом в буфере Emacs'а будет более полной и красиво выглядящей.
Нужно убить и открыть буфер заново, чтобы изменения вступили в силу.

Теперь попробуем добавить в наш файл пару простых, многоуровневых списков. При помощи них можно отражать взаимосвязи между иерархическими задачами или чем-нибудь подобным...
Каждый элемент списка маркируется звездочками и пробелом после них, за которым следует непосредственно сам текст. Чем больше звездочек, тем больше уровень вложенности:
* первый уровень вложенности
** элемент второго уровня вложенности
** еще один
** и еще...
*** а это уже третий уровень
Благодаря директиве hidestars в начале файла, наши списки будут выглядеть вот так:
Многоуровневые списки
Составим список задач на день, на котором я буду дальше показывать различные фичи org-mode:

Как видно, элементы первого уровня не несут полезной информации, а выполняют лишь роль тегов. Поэтому...сделаем их тегами! Для этого надо добавить в начало org-файла следующую директиву:
#+TAGS: ОБРАЗОВАНИЕ(o) ПРОЕКТЫ(p) ДОМ(h)
...и снова закрыть и открыть файл. Теперь можно удалить ненужные элементы первого уровня и добавить соответствующие теги элементам бывшего второго уровня.
Чтобы добавить тег (отмечу, что можно добавлять сразу несколько тегов) нужно остановить курсор на соответствующей строке и нажать комбинацию клавиш C-c C-c и затем нажать на клавишу, буква которой стоит в скобках у соответствующего тега (у нас это o,p или h). Должно получиться что-то вроде этого:

Перед обзором оставшихся возможностей org-mode необходимо добавить в ~/.emacs следующие полезные строчки:
Конечно, формировать список дел на сегодня, имея в распоряжении лишь иерархические списки и теги, не очень удобно. Хотелось бы еще как минимум иметь возможность задать время на которое запланировано некое дело и выставить статус выполнения для текущего дела.

Вначале рассмотрим как можно задавать время. Для задачи (любого элемента любого уровня) можно задать как временной интервал, на который запланировано выполнение задачи, так и дедлайн, после которого задача обязательно должна быть выполнена. Для первого используется комбинация клавиш C-c C-s, а для второго C-c C-d. Других различий между этими сущностями больше нет.
По нажатию одной из вышеупомянутых комбинаций клавиш откроется окно с календарем и в минибуфер можно будет ввести временные значения или их интервалы.

Чтобы задать время выполнения задачи достаточно ввести через двоеточие часы и минуты - в выделенном участке минибуфера (справа) отразится выбранное вами время. Если нужно указать день недели или число - вводите данные примерно в таком формате, как в правой части минибуфера. Временной интервал можно вводить через тире.
Enter подтверждает введенные данные и добавляет в описание задачи сроки ее выполнения или дедлайн.
Задаем время выполнения

Задаем временной интервал

Задаем временной интервал вместе с другой датой

В результате, у нас должно получиться что-то вроде этого:

Теперь перейдем к выставлению статусов для текущих дел.
Если внимательно посмотреть на участок лиспового кода выше, то можно заметить, что в нем уже содержатся статусы, осталось лишь научиться вставлять их в задачи.
Вставка происходит точно так же как и у тегов, лишь только сочетание клавиш другое - C-c C-t.
При вставке или изменении статуса запись об этом событии оказывается в логе задачи - я счел подобное поведение удобным для контроля за исполнением заданных временных интервалов. Если же это не нужно - можно удалить все строки вида *org-log* из конфига.
Вставив и поменяв некоторые статусы мы получим картину вида:

К задачам еще можно добавлять заметки при помощи хоткея C-c C-z (сохранение введенной заметки по хоткею C-c C-c):

Как видно, при интенсивной смене статусов задач и использовании заметок содержимое org-файла чересчур разрастается и его становится трудно воспринимать на глаз. Чтобы избежать этого - удалите директиву showall в начале файла. Все дополнительные данные по задачам свернутся и развернуть их можно будет клавишей Tab, если конечно возникнет такая необходимость.
Сравните:
Изначальный вид

После удаления директивы showall

В org-mode удобно составлять отмечаемые чекбоксами списки, например списки покупок или приглашенных друзей. Список должен начинаться с символов
- [ ], после которых идет пробел и сам текст элемента списка. Установка или снятие чекбокса на котором сейчас стоит курсор происходит с помощью комбинации клавиш C-c C-c. Выглядит все это так:

К списку с чекбоксами можно добавлять счетчики, которые показывают сколько чекбоксов уже было помечено. Есть два вида счетчиков - первый показывает соотношение между отмеченными чекбоксами и общим их количеством, а второй - то же соотношение, но уже в процентах. Для установки первого типа счетчиков нужно к описанию списка (которое уровнем выше) добавить символы [/], а для второго - [%]. Счетчики начнут считать только после того, как будет установлен или снят хотя бы один чекбокс.


Осталась без внимания еще одна часть org-mode, которая может удобно и красиво обрабатывать данные из org-файлов для представления их пользователю - agenda views. Данные могут браться как из открытого буфера с org-файлом, так и из некоторого каталога на диске (у меня это ~/.org), в который сложены все эти org-файлы (смотри в строчки для конфигурационного файла выше).
Для вызова списка доступных agenda views у меня используется сочетание клавиш Esc-Esc-a. О всех элементах данного списка я не расскажу, поскольку сам пользуюсь лишь двумя.
Первый - это распорядок на текущий день или неделю (agenda for current week or day). Отмеченные временными метками задачи выдергиваются из org-файлов, лежащих в каталоге ~/.org и выводятся в виде почасового расписания на текущую неделю.

Второй, используемый мною элемент - вывод "временной линии" (timeline for current buffer), но лишь для отдельного буфера с org-файлом, открытого в данный момент. Для нашего файла ~/test.org, это будет выглядеть так:


Ссылки

Сайт расширения org-mode - http://orgmode.org/
Огромный мануал по различным хитрым настройкам org-mode

12 комментариев:

  1. Скажи, а ты реально этим пользуешься? Как у тебя это удаётся, не имея его всё время под рукой? Можешь попробовать описать именно этот, не технический аспект?

    На правах зануды: А мне больше нравится оригинальный девиз orgmode, без слова формат.

    ОтветитьУдалить
  2. Да, я всем этим реально пользуюсь. Но действительно, как ты заметил, невозможность постоянно иметь org-mode под рукой несколько скрашивает все удобство от его использования.
    Обычно, я или выставляю статус для запланированного дела, выполненного вне дома, сразу как приду домой. Или дела, которые точно будут выполняться вне дома, я не заношу в org-файл, а держу в голове.
    Если бы ты посмотрел мой org-файл, то увидел бы, что там по большей части домашние дела.
    Ноутбук конечно решил бы эту проблему, но пока с этим туго(

    ОтветитьУдалить
  3. Чёт про установку я ни..ига не понял. Можешь подробнее объяснить, без слов: "суём куда-нибудь..."
    Пожалуйста!

    ОтветитьУдалить
  4. 1) Качаем исходники org-mode с сайта и распаковываем их.
    2) Проверяем, есть ли у нас в домашнем каталоге каталог .emacs.d - в нем обычно лежат различные пользовательские плагины и конфиги для емакса. Если такого каталога нет - создаем его.
    3) Смотрим, есть ли у нас внутри ~/.emacs.d каталог для пользовательских расширений. Обычно, он называется elisp. Если его нет - создаем.
    4) Внутри каталога elisp создаем подкаталог org.
    5) Теперь переходим обратно в каталог с исходниками org-mode и копируем все файлы с расширением "el" в ~/.emacs.d/elisp/org
    6) Добавляем строчки, которые приведены в посте в секции "Установка", в конфигурационный файл емакса, который должен лежать по адресу ~/.emacs
    7) Перезапускаем emacs
    ????
    PROFIT!

    ОтветитьУдалить
  5. Не прокатило. С директориями всё ясно. Меня интересует другое: где находиться конфигурационный файл emacs'а ? У меня Win7, может в этом проблема?

    ОтветитьУдалить
  6. Дааа!)) Я пытался использовать Emacs под виндой, в итоге забил на это дело и поставил Cygwin, а в него emacs. Предлагаю попробовать сделать также).
    Где у виндового Emacs'а конфиг лежит я без понятия...

    ОтветитьУдалить
  7. У меня стоит и в Linux, и в Windows7. Всё нормально работает.
    Конфиг emacs найдёшь здесь: c:\Users\Имя пользователя\AppData\Roaming\.emacs

    ОтветитьУдалить
  8. Ещё вопрос. Как сделать ссылку на папку? Например C:\моя папка. Чтобы при нажатии на эту ссылку папка открывалась.

    ОтветитьУдалить
  9. В org-mode? Без понятия, ни разу такого не использовал.

    ОтветитьУдалить
  10. Прошу прощения, что откапываю стюардесу, но ты до сих пор этим пользуешься?

    ОтветитьУдалить
  11. Да) Не ранее как сегодня, на нашем собрании, записывал в quadrocopter.org итоги своего выступления и что мне надо сделать к следующему.

    ОтветитьУдалить