Давно уже хотел сделать подсветку цветом в своем ОБФ. Вот руки и дошли...
Сидел сегодня колупался. Что из этого вышло - напишу чуть позже, а пока хочу рассказать, что в результате копаний возникла проблема, которую я с ходу победить не смог и начал рыться в инете. И тут наткнулся на один блог, довольно интересный, о чем я писал тут. Так вот в этом блоге я набрел на пост и сразу вспомнил уважаемого Тенгу. Он где-то в своих постах об ОБФ упоминал, что хотел бы иметь возможность открывать ссылки на что угодно в vim. Ну вот, кажется это то что надо. :)
Показаны сообщения с ярлыком huge file. Показать все сообщения
Показаны сообщения с ярлыком huge file. Показать все сообщения
среда, 17 марта 2010 г.
воскресенье, 1 февраля 2009 г.
"Большой файл", часть... следующая. ;)
Попробовал заменить заголовки, на более короткие, типа:
Функция для фолдинга получилась следующая:
В определении синтаксиса пришлось поставить "\V" в начала, ибо заэкранировать тильду (~) по другому не вышло! :( Может кто знает как это сделать? У меня не вышло это провернуть ни каким колличеством обратных слешей. :( Да! И вызов этой функции поменял на событие BufReadPost, потому что при вызове ее в buffer enter был совершенно не понятные мне глюки.
В общем много еще не понятного таит в себе vim... :)
~ Заголовок1
~end Заголовок1
Функция для фолдинга получилась следующая:
function! LoadClipboardFile()
set number
set foldclose=all
set foldmethod=syntax
syntax sync fromstart
syntax region NoteFold start="\V\^~ \.\*\$" end="\V\^~end\.\*\$" fold transparent
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^.\\s','','g')
set foldcolumn=3 "отступ от края
mapa =strftime("%Y-%m-%d %H:%M")
imap
mapG o I~end kI~ zoA
endfunction
В определении синтаксиса пришлось поставить "\V" в начала, ибо заэкранировать тильду (~) по другому не вышло! :( Может кто знает как это сделать? У меня не вышло это провернуть ни каким колличеством обратных слешей. :( Да! И вызов этой функции поменял на событие BufReadPost, потому что при вызове ее в buffer enter был совершенно не понятные мне глюки.
В общем много еще не понятного таит в себе vim... :)
среда, 28 января 2009 г.
Еще пару слов о vim и фолдинге.
Написав предыдущую заметку, я решил проверить, а не проще-ли будет сделать фолдинг на основе синтаксиса? И проверил. :) Вот собственно новая функция:
Теперь весь фолдинг обрабатывается по синтаксису. :) Мне так даже больше нравится...
function! LoadClipboardFile()
set number
syntax clear
syntax sync fromstart
set foldmethod=syntax
syntax region NoteFold start="---=====.\{-}=====---" end="---=====.\{-}=end=---" fold transparent
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
set foldcolumn=3 "отступ от края
map <F2> :r!date '+\%F \%H:\%M \%S s'<CR>
imap <F2> <Esc><F2>
map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h
endfunction
Теперь весь фолдинг обрабатывается по синтаксису. :) Мне так даже больше нравится...
вторник, 27 января 2009 г.
Пару слов о vim и его фолдинге.
История эта началась с небольшого поста уважаемого tengu-crow, в котором я откментировал, что тоже есть такие идеи и методы использования. Собственно для того, что бы понять о чем идет дальше речь, желательно прочесть то, о чем шла речь в том посте + коментарии мои и tengu-crow + последующие его заметки и наши общие коментарии под общим названием в его ЖЖ "Афигено большой файл" тут, тут, и тут. :) И так речь идет о фолдинге в vim по просьбе вышеупомянутого френда. :)
Я не являюсь сторонником использования русских терминов и абревиатур, как например НЖМД - накопитель на жестких магнитных дисках, вместо хард драйв или просто хард. И поэтому люблю использовать устоявшиеся английские словоформы, порой даже записанные русскими буквами. Они, как правило более лаконичны, емки и облегчают понимание с иностранными коллегами. Так что уж простите, но я буду применять в тексте не "складки", а английское "фолдинг".
vim ~/.vimrc
;)
Собственно исторически сложилось, что файл со всякими записями у меня назывался *.clipboard, поэтому для его открытия я и сделал функцию.
И так каждая запись у меня имела вид:
---===== <дата опционально> тема =====---
текст
---===== <дата опционально> тема =end=---
Соотеветственно строка
делает следующее:
Далее делаем еще одну косметическую операцию, а именно надпись на фолде:
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
Тут вообще практически все понятно: устанавливаем заголовок фолда как строку, взятую из начала фолда и удалив из нее "---===== " - вначале и " =====---" - в конце, что бы не мешали. ;)
Ну можно еще немного объяснить, как работает вставка новой записи, хотя там все просто - чисто последовательность команд vim-а:
Свернутый файл выглядит так:

Развернутый:

И далее:
Я не являюсь сторонником использования русских терминов и абревиатур, как например НЖМД - накопитель на жестких магнитных дисках, вместо хард драйв или просто хард. И поэтому люблю использовать устоявшиеся английские словоформы, порой даже записанные русскими буквами. Они, как правило более лаконичны, емки и облегчают понимание с иностранными коллегами. Так что уж простите, но я буду применять в тексте не "складки", а английское "фолдинг".
Небольшое лирическое отступление.
Когда программисты пишут программы, то довольно удобно, что бы все функции были "свернуты", то есть мы видели только их заголовки, а внутрь попадали только тогда, когда нам это действительно надо. Это напоминает лист бумаги, часть которого сложена и как бы скрыта от глаз, но в любой момент ее можно развернуть и глянуть что внутри. Данный подход называется фолдингом. Фолднг в vim бывает 3-х видов:- manual - ручной
- indent - большая величина отступа означает большую глубину складки
- expr - для определения складок используется выражение
- syntax - складки определяются в соответствии с правилами подсветки синтаксиса
- diff - специальный режим складок для отражения различий в файлах
- marker - складки определяются с помощью специальных маркеров в тексте
Далее лирика, но уже без отступлений. ;)
И так, в нашем афигено большом файле есть темы и заметки. И очень не плохо было бы, сворачивать все наши записи, оставляя только заголовки от них. С методом мы уже определились. Так что поехали. Далее привожу не весь, но часть конфига, дабы не загружать повествование лишними деталями. Для тех, кто не в курсе, коментарии в конфигах vim начинаются со знака ковычек (").vim ~/.vimrc
;)
Собственно исторически сложилось, что файл со всякими записями у меня назывался *.clipboard, поэтому для его открытия я и сделал функцию.
"вызываем функцию при открытии файла
autocmd BufEnter *.clipboard silent exe LoadClipboardFile()
"сама функция
function! LoadClipboardFile()
"покажем номера строк, люблю я так ;)
set number
"выберем метод фолдинга
set foldmethod=expr
"а тут самое интересное: вычисление фолдинга по маскам, но об этом позже
set foldexpr=getline(v:lnum)=~'=end=---$'?'s1':getline(v:lnum)=~'^---=====\\s'?'a1':-1
"заголовок, тоже опишу ниже
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
"отступ от края, в котором будут показываться уровни фолдинга
set foldcolumn=3
"ну это чисто для вставки даты в текст по нажатию F2map <F2> :r!date '+\%F \%H:\%M \%S s'<CR>
imap <F2> <Esc><F2>
"а это для создания новой записи по нажатию F4 map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h endfunction
И так каждая запись у меня имела вид:
---===== <дата опционально> тема =====---
текст
---===== <дата опционально> тема =end=---
Соотеветственно строка
foldexpr=getline(v:lnum)=~'=end=---$'?'s1':getline(v:lnum)=~'^---=====\\s'?'a1':-1
делает следующее:
- берем текущую строку (getline)
- если она оканчивается на '=end=---$', то возвращаем s1, что означает конец текущего фолда (знак =~ - означает если содержит)
- если нет, то оцениваем ее начало на наличие '^---=====\\s', и если так, то возвращаем начало нового фолда (a1)
- если же нет, то возвращаем -1, что значит, что уровень фолда не поменялся
Далее делаем еще одну косметическую операцию, а именно надпись на фолде:
set foldtext=v:folddashes.substitute(getline(v:foldstart),'^---=====\\s\\\|\\s=====---$','','g')
Тут вообще практически все понятно: устанавливаем заголовок фолда как строку, взятую из начала фолда и удалив из нее "---===== " - вначале и " =====---" - в конце, что бы не мешали. ;)
Ну можно еще немного объяснить, как работает вставка новой записи, хотя там все просто - чисто последовательность команд vim-а:
map <F4> o---===== <Esc>zo<F2>kJA =====---<CR>---===== <F2>kJA =end=---<Esc>k^/=====-<CR>h
- o---=====
- вводимновую строку, печатаем начало заголовка и выходим в командный режим - zo - раскрываем фолд, ибо обнаружив начало, наш фолд схлопывается
- F2 - на ней у нас висит мап ввода даты. ;)
- Но дата вбилась строкой ниже! Поэтому поднимаемся обратно и присоединяем (J) следующую строку к нашей.
- A - начинаем в конце ее добивать окончание заголовка (=====---)
- переход на новую строку - Далее все повторяется для закрывающего заголовка (=end=---
) - k - поднимаемся вверх
- ^ - переходим в начало строки
- /=====-
- ищем точку после даты на первом знаке равно - И делаем шаг влево, что бы оказаться сразу же за введенной датой и быть готовыми вводить новый заголовок. :)
Свернутый файл выглядит так:

Развернутый:

И далее:
Подписаться на:
Сообщения (Atom)