Командная строка… Её можно любить или ненавидеть, но тому, кто пользуется Unix-подобными операционными системами, без неё не обойтись. Облегчить работу в командной строке можно с помощью утилиты marker. В её репозитории о ней говорят как о «панели команд для терминала». Полагаю, это — довольно полезная программа. Не могу подобрать точное сравнение для её описания. Не знаю, похожа ли она на продвинутую историю команд, или на систему управления закладками. Пожалуй, в ней есть немного и того и другого.



История работы с командами теряется, она содержит множество мелких команд (хотя, чтобы в историю не попадали бы определённые команды, можно воспользоваться переменной окружения HISTIGNORE). А при использовании marker можно сохранить определённые команды, после чего они уже не потеряются. В хранилище marker не попадает ничего лишнего, а то, что было сохранено, никуда не девается.

Конечно, можно просто написать скрипт, или создать псевдоним, и тем самым упростить работу с командами. Утилита marker позволяет добавлять к командам описания, среди сохранённых команд можно искать нужные, пользуясь инкрементальным нечётким поиском. Кроме того, в командах, сохранённых в marker, можно использовать местозаполнители, которые, при использовании команд, заменяются на реальные данные. В программе, сразу после установки, имеется встроенный список команд. Закладки marker можно использовать и в bash, и в zsh, что пригодится тому, кто применяет обе эти командные оболочки.

Установка marker


Marker — это самостоятельный проект, который можно установить из его GitHub-репозитория. Установка проста и не требует root-прав. Но надо будет кое-что добавить в файл инициализации оболочки. Программа, правда, даст подсказку об этом после установки. Если клавиатурные привязки, используемые по умолчанию, вам не подойдут, вам может понадобиться их перенастроить, приведя к подходящему виду, запуская marker с помощью команды source. Это может занять некоторое время. Затем надо внести изменения в файл инициализации оболочки. Другими словами, между моментом выполнения команды установки программы и моментом выполнения следующих двух команд может пройти некоторое время.

git clone --depth=1 https://github.com/pindexis/marker ~/.marker && ~/.marker/install.py
cp ~/.bashrc ~/.bashrc_backup
echo '[[ -s "$HOME/.local/share/marker/marker.sh" ]] && source "$HOME/.local/share/marker/marker.sh"' >> ~/.bashrc

Далее, вы можете столкнуться с небольшой неприятностью, возможность возникновений которой зависит от используемого дистрибутива Linux. А именно, если ввод части команды и нажатие сочетания клавиш CTRL + Пробел приводит к ошибке bash: bash_execute_unix_command: cannot find keymap for command, это значит, что вы столкнулись с уже известной проблемой. Для того чтобы её решить, отредактируйте файл ~/.marker/bin/marker.sh в соответствии с этими инструкциями. На самом деле, многие клавиатурные привязки способны вызывать проблемы в различных системах. Поэтому, прежде чем принимать решение о постоянном использовании marker, легче просто выполнить команду source в командной оболочке и активировать таким образом marker:

source ~/.local/share/marker/marker.sh

Затем, если что-то пошло не так, можно просто выйти из оболочки и открыть новое окно. После того, как окажется, что настройки программы вас устраивают, можно воспользоваться инструкциями по внесению изменений в файл .bashrc. Конечно, если вы следовали вышеприведённым инструкциям, вы всегда можете вернуть систему в прежнее состояние, скопировав содержимое .bashrc_backup в .bashrc.

Использование marker


Испытайте marker, использовав возможности программы для поиска команд в вашей истории команд. Если вы привыкли использовать для обратного поиска в истории сочетание клавиш CTRL + R, то вам будет удобно работать с marker. При использовании стандартных настроек можно ввести часть команды и нажать CTRL + Пробел для выполнения поиска команды. Вместо того, чтобы, просматривая по одной строке истории, постоянно нажимать на клавишу клавиатуры (как при обычной работе с историей), перед вами окажется приятно оформленный список, из которого можно выбрать то, что нужно.

При повторном использовании некоей команды обычно нужно отредактировать ту её часть, которая относится к её входным и выходным данным. Marker позволяет решить эту задачу с использованием сочетания клавиш CTRL + T. Каждый раз, когда нажимают это сочетание клавиш, курсор будет перемещаться к следующему местозаполнителю, оформляемому с помощью пары фигурных скобок. При этом местозаполнитель автоматически удаляется, что позволяет просто перейти в нужное место команды и ввести там необходимые данные.

Кроме того, можно писать и собственные команды, пользуясь местозаполнителями, после чего добавлять их в программу с помощью сочетания клавиш CTRL + K. Работа с закладками — это возможность marker, которая выгодно отличает эту программу от обычного поиска по истории.


Работа с marker

На вышеприведённом анимированном рисунке можно видеть пример работы с местозаполнителями (вроде {{url}}). По умолчанию при работе с программой используются сочетания клавиш CTRL + Пробел, CTRL + K и CTRL + T, но, например, в моей системе они конфликтуют с другими клавиатурными привязками. Поэтому я поменял их на Alt-., Alt-M и Alt-P (подробнее об этом я расскажу ниже). Кроме того, переназначить их можно, установив переменные окружения перед использованием команды source ~/.local/share/marker/marker.sh.

Проблемы


Управлять marker можно с помощью собственных команд утилиты, а не с использованием клавиатурных сокращений. Но иногда это вызывает определённые сложности. Например, я не пользовался командой marker update. Если говорить о других командах, то удалять команды можно с помощью marker remove.

Единственной серьёзной проблемой, которую я обнаружил, стало то, что в marker имеется множество правил, которые мне не нужны. Но простого способа их удаления программа не даёт. Уверен, можно залезть в код программы и вручную от этих правил избавиться, но хорошо было бы, если бы их можно было удалить так же легко, как и собственные правила.

Хочу дать совет. Обратите внимание на то, что код загружает файл ~/.marker/tldr/common.txt и ещё один файл, ориентированный на конкретную операционную систему (например — linux.txt). Редактирование этих файлов позволяет без труда менять стандартные правила. А ещё лучше — скопируйте то, что вам нужно, в ~/.local/share/marker/user_commands.txt, а потом уберите куда-нибудь старые файлы. В результате настройки, используемые по умолчанию, будут в вашем распоряжении. Вы сможете их изменить или удалить.

Выше я говорил о том, что настройки клавиатурных сокращений marker не подходят пользователям, которые используют клавиатурные привязки в духе emacs. К программе подготовлена не особенно подробная документация. Но в верхней части кода marker.sh выполняется установка трёх клавиатурных привязок на основе переменных окружения и задаются значения, применяемые по умолчанию. Именно тут я и изменил стандартные привязки. Можно, конечно, просто задать переменные окружения. Вот код, о котором я говорю (с моими правками):

# клавиатурные привязки, применяемые по умолчанию
marker_key_mark="${MARKER_KEY_MARK:-\em}"
marker_key_get="${MARKER_KEY_GET:-\e.}"
marker_key_next_placeholder="${MARKER_KEY_NEXT_PLACEHOLDER:-\ep}"

Имена клавиш представлены в формате, который понимает команда bind. Это — как раз то, что, в целом, плохо документировано. Легче всего в этом разобраться, выполнив команду bind -P и посмотрев на то, как устроены другие привязки. Клавиша CTRL выглядит здесь как \C-t, клавиши с префиксом \e (обычно — ALT) выглядят так, как сделано в моём коде. Вы можете воспользоваться этими знаниями при настройке собственных привязок. Если вам нужна документация по клавиатурным привязкам — загляните сюда.

Итоги


Если вы пользуетесь командной оболочкой нечасто, или если работаете с очень сложными командами, то marker может вам пригодиться. Но работу с командной строкой можно упростить и другими способами. А если вы очень сильно перенастроили bash, и при этом пользуетесь несколькими компьютерами, то вам, возможно, пригодится моя система для управления настройками, основанная на Git.

Пользуетесь ли вы какими-нибудь утилитами, облегчающими работу в командной строке Linux?