Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

февраля 18, 2009

Сворачиание текста. (Folding)

В современных Delphi IDE есть такая возможность как сворачивание участка кода при помощи {$REGION '<Name>'} ... {$ENDREGION}. Это очень удобная фича и вим ее поддерживает.

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

В простейшем случае делаем следующее
1) Переходим в line visual-mode (Shift-v).
2) Выделяем нужный участок кода (при помощи j/k)
3) Набираем zf

Сладка создана. Раскрыть ее - zo, закрыть - zc. Если набираете za, то состояние сладки меняется на противоположное. zd - удалить складку. zj/zk - переместиться до первой вкладки вниз/вверх.

Еще создать складку можно командой zf{motion}. К примеру, zf} свернет абзац.

В общем-то, вот и вся теория, остались некоторые мелочи.

Маркеры
Недостаток того, что мы только что сделали - складка не сохраняется при закрытии файла. Поэтому, перед тем, как создавать вкладки, нужно включить опцию
:set fdm=marker
Эта опция включает создание маркеров в начале и конце складок. По умолчанию маркеры имеют вид
/* {{{ */
blablabla
/* }}} */
Что для паскалиста не есть гуд. Для установки правильных комментариев нужно набрать что-нибудь из
:set commentstring={%s}
:set commentstring=(*%s*)
:set commentstring=//%s
на собственный вкус. Далее, {{{ и }}} выглядят очень неуклюже, исправляется это командой
:set foldmarker=<<<,>>>
Если вам нравится дельфи-стиль, то наберите
:set foldmarker=$REGION\ ',$ENDREGION
На самом деле, маркеры должны настраиваться из файла синтаксиса (во всяком случае, для многих языков настраиваются автоматически), и видна очередная недоработка касательно паскаля в виме.

Можно создавать вложенные друг в друга сладки.

Кроме того, можно установить способ вычисления текста, который будет написан на свернутой складке. По умолчанию - это слова в строчке, где расположен первый маркер. Чтобы установить свое выражение для вычисления функции, нужно определить опцию

:set foldtext=...

И не забывайте про :help fold.

PS
Кстати, кто знает как фолдинг делается в блоггере? (Типа как lj-cut в жж.)


Читать дальше......

февраля 05, 2009

Snippets

Иногда бывает очень полезной автоматическая вставка некоторого частовстречающегося кода, так называемых Snippet'ов. К примеру, это могут быть языковые конструкции (if ... then, while ... do, begin ... end. Такая фитча есть в Delphi IDE).

Для настройки ее в виме, потребуется скачать плагин Snippets_plugin. Устанавливается он очень просто - нужно открыть его в виме и набрать :UseVimball.

Теперь можно перейти к использованию. Нужна, скажем, конструкция if ... then ...;. Набираем:
:Snippet if if <{Cond}> then <{Body}>;

Если в режиме вставки набить if<TAB>, то сработает этот сниппет. Далее курсор будет установлен на Cond, необходимо набить конкретный Cond и нажать TAB. Курсор будет перевден на {Body} (а в общем случае - на первую необработаную шнягу вида <{что-то}>).

Вот, собственно, и вся теория. Теперь по мелочам.

Вместо if можно набирать любую последовательность символов без пробелов. Т.е., скажем, такой сниппет :Snippet i,. if (i < 0)Or(i >= Width) then Exit; будет корректен.

Одна из самых полезных фич в плагине - это теги. Допустим, что в предыдущем примере мы хотим иметь возможность вставлять вместо i другие переменные. Тогда:

:Snippet i,. if (<{Name}> < 0)Or(<{Name}> >= Width) then Exit;

Теперь, если вы наберете первое Name, второе будет заполнено автоматически.

Более хитрый способ использования сниппетов - значение, введенное ранее подставлять не сразу, а использовать для вычисления того, что нужно подставить. Записывается это как <{Name:Expression}>, где Name - имя тега, а Expression - выражение, которое будет подставлено. Значение, введенное пользователем в Name ранее заносится в регистр @z.

Для вставки Enter'ов используется <CR>.

Для создания сниппетов специально для паскаля лучше создать pascal_snippets.vim в папке Vim\vimfiles\ftplugin (сразу после установки vim'а она обычно пустая), в котором и прописать все необходимые сниппеты.

Таб может показаться неудобным, тогда можно добавить в _vimrc что-то вроде

let g:snippetsEmu_key = "<S-Tab>"

И, конечно же, не забудьте про :help Snippet.

ПС.
Ценный совет. Не ставьте в качестве названия сниппета просто i или j.


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru