vitus_wagner: My photo 2005 (Default)

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

Вот теперь думаю что бы из них попробовать.

vitus_wagner: My photo 2005 (Default)

https://news.slashdot.org/story/23/08/05/1632219/vims-creator-bram-moolenaar-dies-at-age-62

Автор вима Брам Мооленаар умер в возрасте 62 лет. Кстати интерес голландские программисты в ЖЖ у меня и у [livejournal.com profile] slobin был обязан своим возникновением в том числе и ему.

vitus_wagner: My photo 2005 (Default)

Попробовал iris - почтновый клиент встроенный в vim. Как то он меня не впечатлил. Странная схема работы с паролями, неудобный интерфейс навигации по папкам. Почему-то не включились биндинги для навигации по сообщениям, и соответствнено попробовать как там работает цитирование не получилось.

vitus_wagner: My photo 2005 (Default)

Попытался тут освоить 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 не записвываю. Мне проще назначить его заново, чем вспоминать на какую клавишу я его повесил три месяца назад.

vitus_wagner: My photo 2005 (Default)

Нет, fugitive это счастье с большой буквы Щ. Как я раньше без него жил... Когда у тебя в jira задачи в статус Waiting For Merge в экран не влазят, фугитивовские :Git merge и :Git diff неоценимы.

Теперь еще научитсья тесты не в отдельных окнах screen, а в term-буферах vim запускать..

А то в screen я что-то не вижу как можно изнутри screen (в смысле из скрипта, запущенного в нём) сделать две вещи

  1. Поменять название текущего окна, которое показыватся в статуслайне
  2. Запустить скрипт в новом окне текущего screen.
vitus_wagner: My photo 2005 (Default)

Кажется, я составил список плагинов и встроенной функциональнсоти vim, про которые надо написать.

Встроенная функциональность:

  • Почему надо приучиться работать в normal mode
  • autoindent и дополнение
  • спеллинг
  • фолдинг
  • буфер терминала (а вы не знали, что это бывает не только в Emacs)
  • quickfix
  • простые макрокоманды

Плагины:

На самом деле я еще не всё из этого сам освоил в совершенстве.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Обнаружил сущестование в 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-тэги, пришлось везде после < пробелов навставлять, так как почему-то &lt; он понимает в обычном тексте, но не в преформаттед блоке. А на тэги ругается и в нём тоже.

vitus_wagner: My photo 2005 (Default)

Вот такие я себе завел макросы в 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 еще не научился, поэтому не понял, как там опознают ссылки.

vitus_wagner: My photo 2005 (Default)

Вчера в ходе обсуждения 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

Voom

Jul. 12th, 2022 09:27 pm
vitus_wagner: My photo 2005 (Default)

В процессе некоторых разбирательств с vim обнаружил что для него существует плагин VOom. В Debian запакетирован.

Делает он вот что:

Если вы редактируете большой текст, обладающий какой-то внутренней структурой (макдаун, LaTeX, html, да хоть питоновский скрипт с классами и методами) он создает слева узкое окошко в котором показывает дерево структуры этого текста. И в этом окошке можно перемещаться, можно менять элементы структуры местами, можно как-то (еще не разобрался как) в них искать.

скриншот

По-моему must have. Надо еще разобраться получше с ним. И тогда можно будет отказаться от идеи резать крупные художественные произведения на кучу файлов, а потом писать какие-то наколеночные скрипты для сборки, и сразу держать каждое произведение в одном большом файле, благо и fossil, и vim ограничений на размер файла не имеют, и привычки глючить при работе с большими файлами тоже. Впрочем, по нынешним временам мегабайт - это очень небольшой файл. А мегабайт это 25 авторских листов, дальше всё равно на тома делить надо.

X-Post to LJ

про vim

May. 31st, 2016 05:08 pm
vitus_wagner: My photo 2005 (Default)
Сегодня я узнал, что в vim-е есть понятие filename-modifiers.

То есть в частности, если вам нужно открыть файл лежащий в той же директории, что и текущий (и эта директория ни разу не cwd), то :e %:h/filename сработает.

Еще может оказаться полезным действие :cd %:h (или даже cd %:p:h). Хоть на кнопку его вешай. Но я хронически не в состоянии запомнить самостоятельно созданных макросов и алиасов.

Соответственно, полезной идиомой может оказаться :w %:t - это если вы сказали vim /some/unwritable/path, а cwd writable.

Еще интересный модификатор :S.


А все потому, что пришел [livejournal.com profile] shaplov и спросил про то как открыть файл соседний с открытым. Я не знал. Мне никогда до сих пор не было надо. Пришлось немного почитать хелп. Но в виме есть всё.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

August 2025

S M T W T F S
     1 2
3456789
10111213141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 3rd, 2025 07:27 pm
Powered by Dreamwidth Studios