Getting Things Done in vim
Решил тут поискать по интернету плагины для vim для управления задачами. Нашел целую кучу
- gtd.vim
- vim-quicktask
- vim-tasks
- vim-orgmode (дрожите, емаксеры!)
- vim-tada
Вот теперь думаю что бы из них попробовать.
Решил тут поискать по интернету плагины для vim для управления задачами. Нашел целую кучу
Вот теперь думаю что бы из них попробовать.
https://news.slashdot.org/story/23/08/05/1632219/vims-creator-bram-moolenaar-dies-at-age-62
Автор вима Брам Мооленаар умер в возрасте 62 лет. Кстати интерес голландские программисты в ЖЖ у меня и у slobin был обязан своим возникновением в том числе и ему.
Попробовал iris - почтновый клиент встроенный в vim. Как то он меня не впечатлил. Странная схема работы с паролями, неудобный интерфейс навигации по папкам. Почему-то не включились биндинги для навигации по сообщениям, и соответствнено попробовать как там работает цитирование не получилось.
Попытался тут освоить git mergetool и что-то не въехал в то, как сделать чтобы это было удобно. Если я прописываю в качестве mergetool vimdiff, то открываются 4 окна и в общем более менее понятно как делать выбор между вариантами из трех верхих в нижнем. Правда кнопок приходится нажимать как-то слишком много. Да и навигация по конфликтам внутри одного файла какая-то неудобная.
Прописываю в качестве mergetool fugitive-вский Gdiff, вообще открывается всего два окна вместо минимум трех нужных. Может, конечно у меня fugitive древний (из debian/stable) но и git оттуда же. То же самое происходит при вызове :G mergetool изнутри vim с fugitive
В общем по-моему фугитивовский G merge который работает с конфликтами через quickfix удобнее. Хотя у него quickfix неправильный какой-то и при наличии нескольких конфликтов в одном файле по-моему по ним прыгать не позволяет.
Поэтому зачастую я даже вместо :Gmerge использую
:grep -r '^<<<<' *
(звездочка нужна чтобы оно в .git не искала).
А для разрешения конфликта - макрос, вынесенный в заголовок поста. Это если конфликт надо брать из мержимой ветки. Если из HEAD, то соответственно
dd/^=====<CR>:.,/^>>>>>>/d<CR>:Gw<CR>:cn<CR>.
Это как раз из тех случаев, когда я макрос в .vimrc не записвываю. Мне проще назначить его заново, чем вспоминать на какую клавишу я его повесил три месяца назад.
Нет, fugitive это счастье с большой буквы Щ. Как я раньше без него жил... Когда у тебя в jira задачи в статус Waiting For Merge в экран не влазят, фугитивовские :Git merge и :Git diff неоценимы.
Теперь еще научитсья тесты не в отдельных окнах screen, а в term-буферах vim запускать..
А то в screen я что-то не вижу как можно изнутри screen (в смысле из скрипта, запущенного в нём) сделать две вещи
Кажется, я составил список плагинов и встроенной функциональнсоти vim, про которые надо написать.
Встроенная функциональность:
Плагины:
На самом деле я еще не всё из этого сам освоил в совершенстве.
X-Post to LJ
Обнаружил сущестование в vim таких полезных событий для автокоманд как BufReadCmd и BufWriteCmd.
В результате теперь у меня получилось сделать плагин (который лежит в ~/.vim/plugin/fossilwiki.vim)
и умеет открывать и сохранять странички по именам вида wiki://Название.
При этом, если страничка была открыта через этот плагин, на ,l назначается команда превращения текущего слова/выделенного текста в маркдауновскую ссылку, а если нет, то нет.
Осталось повесить на <Enter> переход по такой ссылке (уже имеющейся в тексте) и, пожалуй уже можно будет хвастаться в фоссиловской рассылке. Здесь я как-то пока не соображу, как определить текующую позицию курсора, и как от неё искать границы ссылки.
Текст плагина пока такой:
augroup fossilwiki
au! * wiki://*
au BufReadCmd wiki://* let s:page=shellescape("< amatch>:t")
\ |exe "r !fossil wiki export ".s:page
\ . "\|\| fossil wiki create ".s:page." /dev/null"
\ | :%s/^M$//e
\ | set filetype=markdown |doau BufReadPost
au BufReadPost wiki://* :map < buffer> ,l lbcw[< Esc>pa](wiki?name=< Esc>pa)< Esc>
au BufReadPost wiki://* :vmap < buffer> ,l da[< Esc>pa](wiki?name=< Esc>
\:let @@=substitute(@@,' ','+','g')< CR>pa)< Esc>
au BufWriteCmd wiki://* exe "w !fossil wiki commit "
\. shellescape("< amatch>:t") . " -M text/x-markdown"
\| set nomodified
augroup end
(бэкслеш с начале строки это признак продолжения команды с предыдущей строки. Чтобы не было слишком длинных строк.)
И еще тут есть один грязный хак, который унаследован от шелловского скрипта, использовавшегося раньше - если страница не существует, она создается (пустая) в момент чтения. Возможно, правильнее было бы заводить buffer-local переменную, которая бы содержала слово create если страницы не существует, и слово commit, если существует. Но это я еще не разобрался с неймспейсами в vim.
P.S. А чтобы дримвидсовский конвертер маркдауна не принимал вимовские токены в угловых скобках за незакрытые html-тэги, пришлось везде после < пробелов навставлять, так как почему-то < он понимает в обычном тексте, но не в преформаттед блоке. А на тэги ругается и в нём тоже.
Вот такие я себе завел макросы в vimrc:
au FileType markdown :map <buffer> ,l lbcw[<Esc>pa](wiki?name=<Esc>pa)<Esc> au FileType markdown :vmap <buffer> ,l da[<Esc>pa](wiki?name=<Esc>:let @@=substitute(@@,' ','+','g')<CR>pa)<Esc>
Первый макрос простой, он работает если выделения нет и конвертирует слово под курсором в маркдауновскую ссылку на wiki. Но в нем есть хитрый хак - это первая команда 'l'.
Дело в том что команда b (переход в начало слова) в vim, переходит в начало следующего слова, если курсор уже находится в начале слова. А если курсор находится в пробеле после слова, переходит все равно в начале слова. То есть последовательность lb переводит в начало текущего слова, даже если мы там уже и были. И даже если были в его конце.
Ну а дальше все просто. Командой c мы удаляем слово (при этом оно попадает в неименованный буфер) вставляем скобку, слово, еще скобку, фиксированное начало url, еще раз слово, закрывающую скобку.
Вот со вторым вариантом хитрее. Если у нас есть выделенный фрагмент из несколькоих слов, мы его забираем в буфер, потом в квадратных скобках вставляем как есть, а потом надо прежде чем добавлять его как часть URL заменить плюсы на пробелы. Что мы и делаем заменяя значение переменной @@ (которая есть неименованный буфер) на результат применения к ней же функции substitute().
Надо бы туда добавить вторую функцию substitute, чтобы эскейпила скобки. Но я сходу не соображу сколько бэкслэшей надо в этом месте ставить чтобы после выполнения всех раундов подстановки остался только один. Можно, конечно, на %28 и %29 менять, но процент тоже эскейпить надо правильно.
Еще бы исхитриться замэпить Enter чтобы он по ссылке переходил, как это сделано в vimwiki. Но я читать чужие продвинутые vimscript еще не научился, поэтому не понял, как там опознают ссылки.
Вчера в ходе обсуждения VOom задумался о том, почему у меня в своё время не пошёл vcscommand.
Казалось бы, работа с версиями является необходимым следствием работы с текстом и в значительной степени её включает. Тем более что если ты пользуешься разными привычками, а я пользуюсь git для работы с чужими проектами (включая рабочие) и fossil для собственых. Впрочем собственные в git тоже есть).
Почему-то даже в тех случаях, когда мне надо отрезолвить 250 однотипных конфликтов, не пропустив среди них 5 конфликтов другого типа, которые надо резолвить по-другому, я не пользуюсь каким-то стандартным инструментом, а пишу на ходу пару макросов, который мне проще воспроизвести из головы, чем вспоминать, на какие клавиши я их повесил в прошлый раз.
Форк vcscommand с поддержкой fossil я в своё время находил, так что запихнуть в единый интерфейс работу с git и fossil он позволяет.
Возможно, дело в том, что для меня работа с VCS это в первую очередь работа не с текстом, а с проектом. Запустить тесты и по их результатам решить, коммитить этот снапшот или нет.
Возможно, в том, что разные VCS предполагают настолько разный workflow, что загонять их в общую систему команд неудобно. Впрочем есть git, который внутри себя настолько разнообразный что поддерживает много разных workflow в рамках отдельно взятой vcs.
Ну и уже упоминавшийся эффект того, что команды собственно VCS все равно помнить надо (так как именно в их терминах описывается логика работы этой VCS и ее отличия от других). А раз так слой команд редактора, которые являются оберткой над ними, является лишней сущностью, которую оказалось лень запоминать.
Вообще интересно что с 2013 года (когда я пытался этот плагин освоить) развитие vcscommand.vim практически не идет. А что git, что fossil - активно развиваются. Так что, возможно, это не только у меня не сложилось работать с vcs из vim, а не наоборот.
X-Post to LJ
В процессе некоторых разбирательств с vim обнаружил что для него существует плагин VOom. В Debian запакетирован.
Делает он вот что:
Если вы редактируете большой текст, обладающий какой-то внутренней структурой (макдаун, LaTeX, html, да хоть питоновский скрипт с классами и методами) он создает слева узкое окошко в котором показывает дерево структуры этого текста. И в этом окошке можно перемещаться, можно менять элементы структуры местами, можно как-то (еще не разобрался как) в них искать.
По-моему must have. Надо еще разобраться получше с ним. И тогда можно будет отказаться от идеи резать крупные художественные произведения на кучу файлов, а потом писать какие-то наколеночные скрипты для сборки, и сразу держать каждое произведение в одном большом файле, благо и fossil, и vim ограничений на размер файла не имеют, и привычки глючить при работе с большими файлами тоже. Впрочем, по нынешним временам мегабайт - это очень небольшой файл. А мегабайт это 25 авторских листов, дальше всё равно на тома делить надо.
X-Post to LJ