tengu_crow: (Default)
[personal profile] tengu_crow
2009-06-30 11:08

Как мне раньше в голову не пришло? Сел и написал в течении пяти минут. /* и гораздо дольше возился оформляя пост со всеми его скобками и пр. */



добавить в .vimrc:

" навигация по разделам блога
map \j 0vey/^<C-R>" <CR>
map \k 0vey?^<C-R>" <CR>
map \J 0vehy/^<C-R>" <CR>
map \K 0vehy?^<C-R>" <CR>


Тупо - макросы выделяют начало заголовка - и перескакивают по нему дальше.

ПОДРОБНОСТИ


• Задача: встав на название раздела я хочу перейти к следующему разделу (то есть на следующий или предыдущий раздел с тем же уровнем в иерархии), либо к его подразделам.

Шорткаты выбраны так, чтобы наложиться на общую мнемонику - \j,\k - вверх-вниз плюс лидер, аналогично \J,\K - вверх-вниз по подразделам.


• Механизм работы:


0 - перейти к началу строки
v - войти в режим выделения
e - перейти к концу текущего слова (а текущее слово в данный момент - токены заголовка)
[h] - для перехода к разделу на уровень ниже (т.е. не к следующему разделу, уровня 3, а к подразделу уровня 2)
y - скопировать токен заголовка в буфер " и выйти из режима выделения
/ или ? - перейти в режим поиска вверх, либо вниз
^ - регэксп "начало строки"
<C-R>" - вставить в поисковую строку содержимое буфера " (искомый заголовок - что-то вроде ## или ###)+ пробел после нее
<CR> - перейти к следующему заголовку-параграфу


С возвратом сложнее - в смысле - с переходом от низкого к высокому уровню.

Можно тупо добить либо поменяв поисковый шаблон через / , либо набрав несколько раз <Ctrl+O> (вернуться назад по истории поиска).

• Забавная подробность.

Этот маппинг работает независимо от того, какой символ используется для обозначения раздела (что #, что ~, что = - все что угодно, главное, чтобы количество спецсимволов маркировало уровень раздела и было отделено пробелом от его названия).

Вот когда начинаешь писать такие макросы - можешь оценить все богатство Vim'овских шорткатов - все эти движения вперед-назад по самым разным предложениям, словам, буквам и параграфам. Они совершенно аффигительно упрощают написание сложных систем обработки делая простыми даже очень сложные операции.

Date: 2009-06-30 08:42 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
P.P.S. разумеется можно просто искать заголовки по / - набирая что-нибудь вроде /^###, однако, когда по умолчанию включен русский язык - подобный набор зело напрягает. Гораздо приятнее прыгать по заголовкам заранее установленными шорткатами.

Date: 2009-06-30 08:49 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
P.P.P.S. вообще, это далеко не предел - этот макрос можно устаканивать и устаканивать :) Но главная идея, думаю, ясна :)

Date: 2009-06-30 09:51 am (UTC)
From: [identity profile] vjoiller.livejournal.com
хитрО :)

Date: 2009-06-30 10:09 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
Ну... боюсь, постороннему это покажется тарабарщиной :)

Date: 2009-06-30 11:01 am (UTC)
From: [identity profile] unclebb.livejournal.com
Вот да.. я пока не оценил, но усердно пытаюсь понять )

Date: 2009-06-30 11:53 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
1. Есть такая программа - Vim - немеряно навороченный текстовый редактор. Работает практически везде, наделен кучей фич и мозгосворачивательной, но жутко быстрой (когда к ней адаптируется спинной мозг) клавиатурной моделью работы.

2. Vim - очень гибко настраивается. В основном через .vimrc - текстовый файл, в который пишутся разные настройки, которые Vim читает на старте.

3. Мне понадобилось чтобы Vim сам прыгал по заголовкам внутри моего файла. Для этого я использовал маппинг - привязку к клавиатурным комбинациям определенных действий.

4. Маппинг делается с помощью команды map , которая к сочетанию клавиш key (например нажатие подряд "\j" в первой команде) привязывает определенное действие (все, что начинается с 0 для этого примера - что делает каждый код - описано в подробностях). После того, как я впишу четыре строчки в .vimrc - Vim по каждому нажатию подряд \j будет выполнять перечисленные действия.

5. Все прочее постигается последовательным освоением Vim, увы. Система внешне сложная, но сторицей окупает каждую потраченную на нее минуту.

Date: 2009-06-30 12:10 pm (UTC)
From: [identity profile] unclebb.livejournal.com
+ в репутацию )

Date: 2009-06-30 11:13 am (UTC)
From: [identity profile] ollycat (from livejournal.com)
Шикарно! :) Я как-то раньше об этом не подумал... По поводу возврата: надо глянуть в доках, но что-то было на тему запоминания предыдущего положения. В общем точно не помню, надо посмотреть.

Date: 2009-06-30 11:56 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
Ага. Так по-моему Ctrl+O, или что-то другое имелось в виду? Я еще не сообразил добавить, что дальше по заголовкам можно прыгать через n/N - но имхо это понятно и так.

Продолжаю радоваться виммеровской модели работы :) и богатству концепций, которые она порождает :)))

Date: 2009-06-30 11:59 am (UTC)
From: [identity profile] ollycat (from livejournal.com)
ПОка руки не дошли порыться, так что не помню, может и ctrl + o.
Про n/N конечно же и так понятно. ;)

Ну а от порожденного богатства голова кругом идет - аж пипец. :)))))

Date: 2009-07-01 07:03 am (UTC)
From: [identity profile] ollycat (from livejournal.com)
По поводу удаленного поста: а я и не знал, что он главный дизайнер. :) Все равно не очень понимаю, чем дизаин не угодил? Вроде ничего особо режущего глаз (мой по крайней мере) не вижу. ;)

P.S. Сорри, что офтопик. ;)

Date: 2009-07-01 07:17 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
Ну тут прошла волна рекламы майкрософтовского LiveMesenger'a. Эм. Я сообразил, что ругался в закрытом посте :) который был виден только френдам. Сейчас открою и дам ссылку...

http://tengu-crow.livejournal.com/363615.html

ЖЖ опять порадовал - прицепили к нему мелкомягкое детище (подозреваю не задаром), а кучу недоделок так и оставили. Мало того - реклама детища прошла по вредленте залпами (выяснилось, что если подключить ЛивМесенджер "не глядя" он походу вывешивает от имени владельца ЖЖ пост во френдленту). Все это и вызвало возмущение и негодование :)

Date: 2009-08-23 07:53 pm (UTC)
From: [identity profile] mitry.livejournal.com
Очень интересно читать Ваши посты про аффигительный файл. Хотел бы предложить свой маппинг:
:nnoremap <buffer>[[ ^/<C-R><C-A><CR>
:nnoremap <buffer>]] ^?<C-R><C-A><CR>
В vim'е предусмотрены [[ и ]] для перемещения по секциям, и их лучше всего и переопределить. Кроме того, <C-R><C-A> вставляет текущее СЛОВО в командную строку, т.е. не используются регистры.

Date: 2009-08-27 08:12 am (UTC)
From: [identity profile] tengu-crow.livejournal.com
О! Отлично :))) Спасибо большое. Ценная идея + сразу чувствуется рука опытного виммера :))) Утащил к себе в вимрц. Попробую в ближайшее время :)))

ЗЫ Прошу прощения за время реакции на пост - весь месяц пребывал вне сети :)

February 2026

S M T W T F S
1234567
891011121314
1516171819 2021
22 232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 16th, 2026 04:59 am
Powered by Dreamwidth Studios