20090305

Свёртки вместо режима структуры в Vim

На этот пост меня подвигла записка дебианщика про древоредакторы. Собственно, это редакторы для иерархически организованных заметок в которых так называемый режим структуры («Outline mode») сделан основным. Специальные редакторы — это, конечно, замечательно, но в 90% случаев всё можно сделать гораздо проще. В обычном текстовом редакторе Emacs* Vim.
* ну в Emacs вроде тоже можно :-) вот

Итак, простая идея:

1. пишем все заметки в простой текстовый файл;
2. структуру/иерархию заметок указываем с помощью заголовков разного уровня; для определённости, помечаем заголовки как в Markdown (# заголовок, ## подзаголовок, ### подподзаголовок, и т.д.);
3. используем режим свёртки в редакторе, чтобы имитировать режим структуры, т.е. сворачиваем каждый раздел и подраздел, показывая только его заголовок.

Нетривиален только пункт 3. В Vim для этого можно создать файл ~/.vim/syntax/mkdfold.vim примерно такого содержания:
" Markdown section regions to be folded
syn region mkdSec1 start=/^\s*#[^#].*/ end=/^\s*#[^#].*/me=s-1 fold
syn region mkdSec2 start=/^\s*##[^#].*/ end=/^\s*#\{1,2\}[^#].*/me=s-1 fold containedin=mkdSec1
syn region mkdSec3 start=/^\s*###[^#].*/ end=/^\s*#\{1,3\}[^#].*/me=s-1 fold containedin=mkdSec1,mkdSec2
Он определяет диапазоны подразделов, которые будут «сворачиваться». В этом примере от заголовка до заголовка того же или более высокого уровня.

Теперь пишем простой текстовый файл в котором первой строкой ставим modeline, примерно такого содержания:
vim: set ft=mkdfold foldmethod=syntax ai si ts=3 sw=3 :

И пишем дальше в нём свои заметки:
# Заметки
## Способы организовать иерархические заметки
* fold mode как органайзер (Vim)
* outline mode (куча редакторов)
* спецредакторы (см. virens)
## Как организовать синтаксические свёртки в Vim
* файл с синтаксисом, определяющий начало и конец разделов и их вложенность
* modeline в редактируемом файле, которая включит этот синтаксис и свёртки
Переоткрываем файл, и всё, пользуемся обычными командами свёртки, чтобы скрыть лишнее. zM — свернуть всё. zR — развернуть всё. zj и zk — следующая и предыдущая свёртка соответственно. za — свернуть/развернуть свёртку под курсором. Ну и много других (:help fold-commands).

Выглядит это примерно так:
+-- 10 строк: # Дела------------------------------------------------------------
# Заметки
+--- 4 строк: ## Способы организовать иерархические заметки--------------------
+--- 3 строк: ## Как организовать синтаксические свёртки в Vim-----------------


Плюсы такого подхода: 1) используется обычный редактор (ничего ставить и ни к чему привыкать не надо), 2) используется plain-text (при желании, заметки можно открыть в любом другом редакторе). Минусы: 1) ну не все используют Vim и не всем нравятся его свёртки, 2) возможно, специализированные средства более удобны.

Я ещё подумал, и идея мне эта ещё больше понравилась. Можно приспособить для ведения списков дел. Надо только добавить подсветку важных дел (восклицательный знак на конце) и сделанных/отложенных/отменённых.

А вообще, всякую мелочь и ерунду я записываю в TiddlyWiki. Уже давно, и очень доволен. Мне это удобнее, чем организовывать заметки иерархически.

Дополнение: как выяснилось, такой подход можно значительно развить, смотрим цикл заметок тов. tengu-crow про ведение «блога» в текстовом файле (с помощью Vim!) и связанный с ним цикл заметок тов. olly cat про использование свёрток в Vim для ведения файла заметок. Спасибо за ссылки!

Есть ещё специализированный плагин VimOutliner, но это уже более глубокое развитие идеи. Я хотел показать, что минимальный функционал для ведения записок есть и в штатной конфигурации.