vitus_wagner: My photo 2005 (Default)

Решил написать в vim макрос для вставки текущей даты в текст.

Первый вариант в стиле vim 3.0 в unix окружении получился такой

map ,d :r !date +'%d.%m.%Y' < CR>

Вполне работает, единственный недостаток - вставляет дату новой строкой. Но вообще ради такой ерунды как дата порождать целый новый процесс. Решил подумать, а как это сделать средствами vimscript. То что в vimscript есть функции strftime и localtime разобрался быстро. Но вот как вставить результат функции в текст... Получилось

 map ,d  :put =strftime('%d.%m.%Y',localtime())< CR>

То есть в vim есть псевдо-регистр =, который "содержит" результат вычисления указанного выражения.

vitus_wagner: My photo 2005 (Default)

Когда-то давно я тестировал почтовый клиент iris для vim. Оно меня тогда совершенно не впечатлило. Впрочем, прошло два с половиной года. Если столько времени назад чего-то в мире opensource не было, стоит поискать еще раз.

Поискал и нашел himalaya-vim. Это как-то имеет по-моему более вменяемый дизайн - базируется на командно-строчном почтовом клиенте, который запускает в фоне. Это по-моему гораздо логичнее, чем писать всю обработку протоколов и форматов на встроенном скриптовом языке, даже если у него в стандартной библиотеке есть соответствующие модули (а это уже требует недефолтного языка. iris был на питоне).

Сам по себе почтовый клиент, на который это опирается himalaya, тоже штука довольно интересная. Написан на Rust, поддержиивает спеециальный микроязычок разметки для описания мультипарт-MIME сообщений. Но как-то он мне не глянулся.

Я подумал, а может поискать командно-строчный почтовый клиент поприличние и самому вокруг него вимовский плагин накрутить?

Правда, от современной почты требуется как минимум поддердка smtp и imap, а также аттачментов (у himalaya все это есть).

Первый попавшийся в дистрибутиве клиент оказался s-nail. Вроде он все что надо умеет. И даже такая замечательная фишка как поддержка .netrc там есть, чтобы пароли не хранить по куче конфигурационных файлов. Единственное что мне в нем не понравилось, так это то, что он не умеет сообщать о приходе новой почты, ежели запущен и ждет команды от пользователя. Традиционный mailx, который без аттачментов сетевых протоколов и юникода, по-моему это умел. Но тут вообще у автора отношение к imap какое-то странное. Он, судя по документации даже выпилить его хотел, но пользователи очень попросили так не делать.

Зато автор в курсе что такое line-buffered stdio. И это оченьу упростит управление его программой из другой программы. например vim. В общем, возможно, правильный подход - написатьт плагин вокрут s-nail, потом для этого плагина написать свой mailx, с поддержкой IDLE и прочих imap-вкусностей (например на базе c-client от alpine).

Кстати, на сайте у автора есть еще его собственные реализации грейлистинга и dkim для postfix. Посмотреть на них что ли. Все равно собирался dkim у себя поднимать.

vitus_wagner: My photo 2005 (Default)

Изучаю как в vim-е работать c Language Server Protocol с помощью плагина ale

Попутно выяснил, что, оказыватеся, кроме общего для всего редактора quickfix list, по которому перемещеются с помощью команд :cn, :cp, :cc, :cfirst, :cbefore и :cafter есть аналогичный location list, локальный для окна. И у него те же команды, но с префиксом не c, а l. А заполняют его командами lgrep, lmake и lfile.

А еще есть команда :cq N вызывающая выход из редактора без сохранения с кодом завершения N. Говорят, очень полезна для прерывания гитовых коммитов. Кто git commit из командной строки зовет. Хотя лучшие вимоводы в моем лице рекомендут fugitive.

А еще оказывается, если в командной строке vim набрать vim это будет почти то же самое. что grep, только с другим синтаксисом и с учетом некоторых переменных заданных с помощью :set. То есть полное имя команды - vimgrep.

А еще оказывается, что quickfix листы образуют стэк. Можно сделать новый посиск, новую компиляцию, а потом вернуться к результатом предыдущего с помощью команды :colder (кстати :lolder сокращается почему-то до :lol)

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

January 2026

S M T W T F S
     1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 11:28 pm
Powered by Dreamwidth Studios