LINUX.ORG.RU

BufUnload autocmd в vim, format=flow в thunderbird.

 , ,


0

1

Текущая проблема:

Хочу чтобы перед закрытием файла в Виме в него вносились изменения. Но только для определенного типа файлов. Наваял такое:

autocmd FileType mail autocmd BufUnload * :%s/ \n/ /

Ниработает =( Надо еще как-то сохранить изменения очевидно. как? функцией?

Контекст (возможно я вообще все не так делаю и есть способ получше?):

По определенным причинам мигрирую с mutt'а на thunderbird. сейчас стоит b43, официальный билд с моззиловского фтп. хочу редактировать текст в vim'е, интегрировать pgp, отправлять почту в plaintext, format=flow. с последним проблема.

Если набирать текст сразу в Thunderbird, то визуально он разбивается на строки с длиной <72, а при включенном mailnews.send_plaintext_flowed отправляется как положенно: заголовок f=f, строки в конце имеют «soft linebreak», т.е. пробел. Я форматирую всегда с пустой строкой между параграфами.

Настроил Enigmail для интеграции с gpg, настроил vim как external editor через плагин с globs.org (он просто запускает vim с временным файлом, через мой самодельный скрипт-обертку, потом помещает его содержимое в окно громоптицы). Но если заранее правильно отформатировать текст в vim'е, то при возвращении в TB он мало того что считает что переносы строк это именно hard linebreak (edit->rewrap не помогает), так еще и перед отправкой «сьедает» пробелы в конце строки! так что в итоге получается не валидный reflow текст. как это отключить я не знаю (может подскажет кто?). можно конечно вручную удалять \n и заменять его на пробел в окне ТБ, но это же печально. можно наверное написать плагин для этого, но я не брался пока так глобально. поэтому пока решил «кормить» тандерберду неформатированный текст, т.е. параграфы одной длинной строкой, без лайнбрейков вообще. так работает, но редактировать так мягко говоря неприятно. wrap я не люблю. в итоге оставляю автоматическое форматирование, и хочу в дополнение к нему чтобы а) при запуске редактора форматировать и б) при выходе из редактора склеивать строки одного параграфа в одну строку. на BufWrite кидать не хочу, потому что сохраняюсь помногу раз, а не только один раз перед выходом из редактора. Пока решил так, костыльно:
augroup emails
  autocmd!
  autocmd FileType mail setlocal textwidth=71 formatoptions=awn nomodeline
 "autocmd FileType mail autocmd BufRead * :!par w71qie
  autocmd FileType mail normal gggqG
 "autocmd FileType mail autocmd BufUnload * :%s/ \n/ /
  autocmd FileType mail autocmd BufWritePre * :%s/ \n/ /
  autocmd FileType mail autocmd BufWritePost * undo
augroup END

Так все работает, но хочется как минимум BufUnload. Помимо того что это через гланды, BufWritePost еще выводит дополнительные сообщения при сохранении что раздражает. Ну и вешается оно глобально; я обычно запускаю отдельный vim из TB, но что если а) случайно буду редактировать файл с ft=mail в обычном своем виме? б) открою что-то еще в новом буфере в этом виме, например чтобы скопировать текст откуда-то и вставить в письмо? Хотелось бы обезопасится и вешать эти ивенты как-то на максимально лимитированный набор условий, желательно только в этом буфере.

Может, это все можно как-то нормально делать а не так через жопу? Как люди TB пользуются?

★★★★★

Последнее исправление: val-amart (всего исправлений: 2)
Ответ на: комментарий от val-amart

Хочу чтобы перед закрытием файла в Виме в него вносились изменения. Но только для определенного типа файлов. Наваял такое:
autocmd FileType mail autocmd BufUnload * :%s/ \n/ /
Ниработает =( Надо еще как-то сохранить изменения очевидно. как? функцией?

Не уверен, что это хорошая практика, сохранять по BufUnload. Ведь освобождаемый буфер не обязательно должен быть текущим файлом. Может лучше проитерировать буферы(сделав нужные действия над нужными буферами) и повесить это на VimLeave*?

настроил vim как external editor через плагин с globs.org (он просто запускает vim с временным файлом, через мой самодельный скрипт-обертку, потом помещает его содержимое в окно громоптицы)

через мой самодельный скрипт-обертку

Почему в этом месте не выполнять пре/постпроцессинг?

BufWritePost еще выводит дополнительные сообщения при сохранении что раздражает

:silent?

Ну и вешается оно глобально; я обычно запускаю отдельный vim из TB, но что если а) случайно буду редактировать файл с ft=mail в обычном своем виме? б) открою что-то еще в новом буфере в этом виме, например чтобы скопировать текст откуда-то и вставить в письмо? Хотелось бы обезопасится и вешать эти ивенты как-то на максимально лимитированный набор условий, желательно только в этом буфере.

Можно создать новый файлотип, скажем, mail-TB, и сделать в нем :setlocal filetype=mail.

Алсо, нашелся плагин, решающий похожую задачу. Может в нем получится какие-нибудь идеи/код почерпнуть.

salsa
()
Ответ на: комментарий от salsa

Почему в этом месте не выполнять пре/постпроцессинг?

холи факинг шит, как это я не додумался? спасибо тебе, salsa! нет ни малейшей причины делать все это в виме, особенно так как это относится только к тандерберду, а не к ft=mail вообще. пошел перепиливать, но для проформы:

Может лучше проитерировать буферы(сделав нужные действия над нужными буферами) и повесить это на VimLeave*?

я думал об этом. а как промаркировать нужный буфер, локальную переменную-флаг создать и потом как-то ее проверить?

:silent?

да! забыл про нее. silent на undo надо.

val-amart ★★★★★
() автор топика
Ответ на: комментарий от val-amart

я думал об этом. а как промаркировать нужный буфер, локальную переменную-флаг создать и потом как-то ее проверить?

Можно так, да, например, в момент установки нового типа файла mail-TB или через аргументы командной строки «метить». Честно говоря, ни разу такого не делал, так что сложно сразу сказать, как будет лучше.

salsa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.