Большинство прочитавших это людей поймёт, что вы автоматизируете конвертацию в PDF, не задумываясь о технических деталях. Задумавшиеся будут либо полагать, что текст не говорит о технических деталях ничего (говорит только о задаче), либо (если будет заниматься буквоедством), что она исполняет эти три пункта буквально (а не через API) — т.е. используя какой‐либо вид имитации действий пользователя — чего вы не делаете.
О! А я ухитрился нарушить все, кроме третьего и последнего, пункты сразу, когда писал свои дополнения для Vim:
XML парсера на VimL я просто не нашёл. (Сейчас есть WebAPI.vim, но это сейчас. Да и WebAPI содержит не pull парсер, и даже не push. Ждать парсинга всего документа мне было не с руки).
То же самое про JSON парсер. Бо́льшая часть людей довольствовалась eval, что небезопасно. (Сейчас тоже есть WebAPI.vim).
Проверки адресов мне не были нужны.
Библиотеку с urlescape я даже не искал.
Тот примитив, что у меня (взять дату в одном формате и скормить её дальше в несколько другом, не пытаясь как‐либо обработать вещи вроде часовых поясов) нельзя назвать полноценной работой с датами. Но это всё же есть.
Библиотеку с шаблонами я тоже не искал: что‐то точно было, но вероятность найти библиотеку шаблонов, которая позволит без серьёзной доработки создать подсветку синтаксиса для результата использования шаблона, была весьма призрачна. Особенно учитывая отсутствие поддержки установки зависимостей в большинстве решений для установки дополнений Vim и, как следствие, малое число библиотек.
Логирование я у себя не делал.
Кстати, а почему в списке нет пункта про frawework’и для тестирования? Они, как и код для логирования, имеют тенденцию разрастаться от простого к сложному: сначала вам нужно просто сравнить две строки, затем вам уже хочется сравнивать строки параллельно (нечего второму/… ядру простаивать), потом ещё внятные сообщения о том, где и что сломалось, сводки, …
Вместо «макросов в vimrc» лучше иметь привязки. Привязки тоже можно вызывать рекурсивно и они тоже остановятся на провалившемся поиске.
Хотя лучше всё же освоить регулярные выражения и другие конструкции VimL и не добавлять в vimrc то, что зависит от привязок — и макросы, и привязки без nore обладают таким нехорошим свойством, потому их у меня в vimrc практически нет (редко, но иногда мне всё же нужна именно зависимость от других привязок). А макросов так вообще — их слишком легко перезаписать — хотя использую я макросы часто.
Суть в том, что работоспособность того, что у меня есть в vimrc, должна быть максимально независима. Иначе с некоторого момента вам придётся начать думать «а могу ли я добавить эту привязку/макрос/изменить эту настройку? Не сделает ли это прошлогоднюю, но используемую привязку/макрос, неработоспособной?»
Вообще‐то в zsh есть слой совместимости с bash, позволяющий использовать скрипты автодополнения bash из zsh. Но если у вас есть время, то лучше сделать автодополнение под zsh: возможности bash в этом плане довольно убоги, в том числе и из‐за readline.
Для включения слоя совместимости используйте autoload bashcompinit && bashcompinit.
Что в zsh настраивается через раскладку isearch. У меня в поиске работают <C-n> и <C-p> для предыдущего/следующего результата. <C-r>, впрочем, тоже работает.
$_ я уже упомянул. А ещё раньше — ivanko (http://habrahabr.ru/post/228999/#comment_7756763). Повторю здесь: с !$ и <A-.> в истории сохранится тот аргумент, с которым вы запустили команду. С $_ в истории сохранится $_. Иногда это именно то, что вы хотите, иногда нет.
Конкретно для переменных в zsh есть ${(l:2::0:)a} и typeset -i -Z2 a.
Первое добьёт строку нулями до данной ширины. В качестве ширины можно использовать $#max и вообще любое выражение, не содержащее разделители (в примере у меня и в документации — двоеточие, но разделители могут и не быть двоеточиями). Второе объявит, что, во‐первых, данная переменная является целочисленной, а, во‐вторых, что при подстановке её следует дополнять нулями до данной ширины.
С typeset дополнять можно только нулями или пробелами, с ${(l)} вы можете дополнять чем угодно, включая нулевые байты (используйте формат ${(pl:2::\0:)VAR} — обратить внимание на p).
В zsh этот вариант генерирует 01 02 …, а не 001 002 …. Не думаю, что такое поведение некорректно: в вашем случае вы лишаетесь возможности генерировать именно то, что генерирует zsh (я несколько раз видел номера серий в стиле 01 02 … 99 100 101 …).
grep 'text' /var/www/**/*^*.jpg(.) — zsh, с setopt extendedglob. В 99% случаях zsh позволяет записать то же быстрее. Только не используйте такой вариант если вам нужно быстро найти файлы или найти очень много файлов. Во втором случае если for или echo такой список сожрут как встроенные команды, получающие своё внутреннее представление списка аргументов, то внешние команды упрутся в ограничение на длину командной строки.
В первом случае учтите две вещи: во‐первых, zsh не настолько оптимизирован как find и при этом имеет много возможностей, которые пришлось учесть в коде. Во‐вторых, zsh сначала найдёт все файлы, а потом уже запустит что‐либо, а find будет выдавать результат по мере нахождения в соответствии со своим вводом (это я про рекомендованный + в конце — он не даст find запустить команду, пока не будет сформирован максимально длинный список аргументов).
В первом варианте тоже есть. Ценой использования zsh и дополнительного нажатия <Enter> — поэтому я использую что‐то вроде вашего варианта (вместо <C-a> у меня ,a, а остальное совпадает) (<C-a> занято в screen, ,a набирается так же быстро и всяко быстрее <C-a>a).
Вроде нигде <C-n>/<C-p> по‐умолчанию не производят поиск команды. У меня и в tcsh ни стрелочки, ни <C-n>/<C-p> не учитывают первые символы, в zsh по‐умолчанию так же, то же и в bash — нигде и ни стрелочки, ни <C-n>/<C-p>.
Для проверки используйте zsh -f и tcsh -f. Для bash уберите ~/.inputrc. Возможно вам придётся явно указать zsh, что вы хотите раскладку emacs («If one of the VISUAL or EDITOR environment variables contain the string `vi' when the shell starts up then it will be `viins', otherwise it will be `emacs'»). Вполне возможно, что вы используете умолчания FreeBSD (системный файл настроек), а не tcsh.
Лучше использовать <C-p>/<C-n>, а не стрелочки. До стрелочек долго тянуться. А <C-r> незаменим в сложных случаях (я помню, что что‐то такое писал, но что именно — вопрос).
В zsh тоже. А <A-.> у меня почему‐то подставляет всю предыдущую команду целиком, хотя я это сочетание не переопределял и в zsh -f … bindkey -e значение то же — подставить последний аргумент.
Учтите, что при использовании $_ в истории сохранится $_, а не сам аргумент.
Кстати, а почему в списке нет пункта про frawework’и для тестирования? Они, как и код для логирования, имеют тенденцию разрастаться от простого к сложному: сначала вам нужно просто сравнить две строки, затем вам уже хочется сравнивать строки параллельно (нечего второму/… ядру простаивать), потом ещё внятные сообщения о том, где и что сломалось, сводки, …
Хотя лучше всё же освоить регулярные выражения и другие конструкции VimL и не добавлять в vimrc то, что зависит от привязок — и макросы, и привязки без
nore
обладают таким нехорошим свойством, потому их у меня в vimrc практически нет (редко, но иногда мне всё же нужна именно зависимость от других привязок). А макросов так вообще — их слишком легко перезаписать — хотя использую я макросы часто.Суть в том, что работоспособность того, что у меня есть в vimrc, должна быть максимально независима. Иначе с некоторого момента вам придётся начать думать «а могу ли я добавить эту привязку/макрос/изменить эту настройку? Не сделает ли это прошлогоднюю, но используемую привязку/макрос, неработоспособной?»
Для включения слоя совместимости используйте
autoload bashcompinit && bashcompinit
.isearch
. У меня в поиске работают<C-n>
и<C-p>
для предыдущего/следующего результата.<C-r>
, впрочем, тоже работает.эффективнее царапать соседейотводить тепло от этих панелей. Энергия‐то не исчезает.$_
я уже упомянул. А ещё раньше — ivanko (http://habrahabr.ru/post/228999/#comment_7756763). Повторю здесь: с!$
и<A-.>
в истории сохранится тот аргумент, с которым вы запустили команду. С$_
в истории сохранится$_
. Иногда это именно то, что вы хотите, иногда нет.${(l:2::0:)a}
иtypeset -i -Z2 a
.Первое добьёт строку нулями до данной ширины. В качестве ширины можно использовать
$#max
и вообще любое выражение, не содержащее разделители (в примере у меня и в документации — двоеточие, но разделители могут и не быть двоеточиями). Второе объявит, что, во‐первых, данная переменная является целочисленной, а, во‐вторых, что при подстановке её следует дополнять нулями до данной ширины.С
typeset
дополнять можно только нулями или пробелами, с${(l)}
вы можете дополнять чем угодно, включая нулевые байты (используйте формат${(pl:2::\0:)VAR}
— обратить внимание наp
).01 02 …
, а не001 002 …
. Не думаю, что такое поведение некорректно: в вашем случае вы лишаетесь возможности генерировать именно то, что генерирует zsh (я несколько раз видел номера серий в стиле01 02 … 99 100 101 …
).for a in {01..10}; do echo $a; done
grep 'text' /var/www/**/*^*.jpg(.)
— zsh, сsetopt extendedglob
. В 99% случаях zsh позволяет записать то же быстрее. Только не используйте такой вариант если вам нужно быстро найти файлы или найти очень много файлов. Во втором случае еслиfor
илиecho
такой список сожрут как встроенные команды, получающие своё внутреннее представление списка аргументов, то внешние команды упрутся в ограничение на длину командной строки.В первом случае учтите две вещи: во‐первых, zsh не настолько оптимизирован как
find
и при этом имеет много возможностей, которые пришлось учесть в коде. Во‐вторых, zsh сначала найдёт все файлы, а потом уже запустит что‐либо, а find будет выдавать результат по мере нахождения в соответствии со своим вводом (это я про рекомендованный+
в конце — он не даст find запустить команду, пока не будет сформирован максимально длинный список аргументов).-s
на--max-depth=1
(почему‐то-s
я легко запомнил, а-d
— нет).,i
, а не,a
.<Enter>
— поэтому я использую что‐то вроде вашего варианта (вместо<C-a>
у меня,a
, а остальное совпадает) (<C-a>
занято вscreen
,,a
набирается так же быстро и всяко быстрее<C-a>a
).<C-n>
/<C-p>
по‐умолчанию не производят поиск команды. У меня и в tcsh ни стрелочки, ни<C-n>
/<C-p>
не учитывают первые символы, в zsh по‐умолчанию так же, то же и в bash — нигде и ни стрелочки, ни<C-n>
/<C-p>
.Для проверки используйте
zsh -f
иtcsh -f
. Для bash уберите ~/.inputrc. Возможно вам придётся явно указать zsh, что вы хотите раскладку emacs («If one of the VISUAL or EDITOR environment variables contain the string `vi' when the shell starts up then it will be `viins', otherwise it will be `emacs'»). Вполне возможно, что вы используете умолчания FreeBSD (системный файл настроек), а не tcsh.<C-p>
/<C-n>
, а не стрелочки. До стрелочек долго тянуться. А<C-r>
незаменим в сложных случаях (я помню, что что‐то такое писал, но что именно — вопрос).<A-.>
у меня почему‐то подставляет всю предыдущую команду целиком, хотя я это сочетание не переопределял и вzsh -f … bindkey -e
значение то же — подставить последний аргумент.Учтите, что при использовании
$_
в истории сохранится$_
, а не сам аргумент.du -hs
. Я обычно именно так и набираю.