Comments 117
alt+shift+3
Вообще-то в zsh есть штатный механизм для этой фичи: push-input
. Судя по быстрому взгляду на используемый автором конфиг у него он может срабатывать по Ctrl-z
. Я себе настроил на Ctrl-q
и Esc-q
вот так:
zbindkey '^Q' push-input # отложить текущую команду
zbindkey '^[q' push-input # use ^[Q to push single line while at PS2
Работает следующим образом:
- набираем (частично) команду
- понимаем, что перед её выполнением надо сначала запустить другую команду
- нажимаем Ctrl-q
- вводим забытую команду и Enter
- в командной строке автоматически появляется то, что было набрано перед Ctrl-q
Странно что после
В оболочках fish и ipython такой поиск уже назначен на стрелочки. Я думаю что многие перешли на fish только ради такого поведения стрелочек.
не упомянуты zsh-autosuggestions и zsh-history-substring-search
но как же стрелочки! /s
Для readline (bash):
"\e[A":history-search-backward
"\e[B":history-search-forward
Для zsh:
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
Неожиданно полезная статья на, казалось бы, избитую тему. Спасибо!
* пардон, промахнулся, это автору.
Mac + iTerm -> ssh на Ubuntu -> zsh + screen
Похоже где-то screen меняет $TERM принудительно…
Без screen все отлично…
Менеджер консольных сессий имхо удобнее использовать для работы на удаленных серверах, чем открывать новые коннекты в табах. Плюс при обрыве соединения сессия не теряется.
Лично мне такая фича очень много времени экономит при наборе текста.
у меня вот такая команда повешена на хоткей
xclip -selection clipboard -o | perl -CS -Mutf8 -pe "tr/\`&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/~QWERTYUIOP{}ASDFGHJKL;'ZXCVBNM,.\/ё?йцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ./ё?йцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.\`&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/~QWERTYUIOP{}]ASDFGHJKL;'ZXCVBNM,./;" | xclip -selection clipboard -i
Заменяет "раскладку" текста в буфере обмена. в обе стороны
(Когда я его пробовал в последний раз, он был глючным: что-то автоматически переключал даже когда это было явно запрещено в настройках — но это было давно.)
По поводу алиасов, недавно задался вопросом какие команды я чаще всего использую, чтобы сдеалать им алиасы. В итоге написал вот эту команду, которая читает history, группирует по имени команды и показывает количество вызовов:
history \
| sed 's/^\s*[[:digit:]]\+\*\?\s*//g' \
| sort \
| uniq -c \
| sed 's/^\s*//g' \
| sort -k1 -n -r \
| head
В моём случае результат оказался интересный, топ 5 команд:
1158 ll
182 cd
152 mvn clean install
80 pwd
69 cd ..
к трём из которых в zsh уже есть алиасы о которых я не знал:
ll -> l
cd .. -> ..
cd -> ~
mvn clean install
— это архаизм
У mvn verify
перед ним сплошные плюсы: набирать короче, работает быстрее, локальный репозиторий SNAPSHOT-ами почём зря не забивает
Ещё про Maven: https://habr.com/company/jugru/blog/424505/
Зачем хранить в истории дубликаты команд? Если не ошибаюсь, то это не даст нормально использовать поиск по началу строки. И в любом случае ограничит число различных команд, которые вы могли бы хранить в истории. И всё это с единственным сомнительным плюсом возможности получить статистику использования, что можно организовать отдельно, не замусоривая историю.
PS: Для zsh нужно использовать не history
, а history -- $[-2**31]
; вместо $[-2**31]
нужно использовать отрицательное число по модулю не менее длины истории (но влезающее в (?)int
поскольку наименьшее число на моей 64‐битной системе — $[2**63]
, только его использование вызывает ошибку как если бы я использовал положительное число). (Обычно можно просто написать history -- -10000000
и не парится.) Просто history
по‐умолчанию выдаст только последние несколько команд (у меня 16).
к трём из которых в zsh уже есть алиасы о которых я не знал:
ll -> l
В zsh по-умолчанию:
ll -> ls -l
l -> ls -la
Пример из моего конфига:
export FZF_DEFAULT_COMMAND='ag --hidden --nocolor -g ""'
export FZF_DEFAULT_OPTS='
--color fg:242,bg:236,hl:65,fg+:15,bg+:239,hl+:108
--color info:108,prompt:109,spinner:108,pointer:168,marker:168
'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='tree -iafd'
Терминал должен запускаться мгновенно
Для этих целей я юзаю Yakuake (для KDE). Есть аналог guake для GNOME. Терминал и не закрывается, он прячется вверху экрана и быстро вызывается по горячей клавише.
Если вы периодически переключаетесь со своего пользователя на рута, вам нужна индикация текущего пользователя
Спасает стандартное приглашение командной строки. Если последний символ $ — вы обычный пользователь, если # — root. Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).
Неуспешное завершение последней команды полезно видеть сразу.
Насколько часто это нужно In real life? Если нужно запустить набор последовательных команд, их проще пускать через &&
Индикатор завершения процесса
Можно использовать конструкцию вида «команда; wall команда успешно завершилась»
Для этих целей я юзаю Yakuake (для KDE)
Ну, вы же всё равно согласны, что он должен открываться мгновенно :) Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем). Видимо вам для работы хватает. Я не критикую, это же дело вкуса.
Спасает стандартное приглашение командной строки.
У вас shell prompt не бесцветный случаем?
Сидеть под рутом или использовать sudo — холиварная тема. Ни в коем случае не хочу начинать спор, только приведу аргументы. Я сижу под рутом, потому что:
- Не встречал сильных аргументов в пользу sudo.
- Рутовые команды приходится писать часто.
- Лень набирать 5 лишних символов для каждой команды.
- Так «рутовые» команды попадают в свою историю, а не смешиваются с моей.
- Получаем полноценный автокомплит, а не урезанный.
- Хорошо различаю обычный и рутовый шелл, поэтому не промахиваюсь.
Давайте придумаем реальный сценарий, когда sudo спасёт вас. Мне в голову приходит только
rm -rf /
. Но если человек в принципе готов запускать такую команду, то что ему помешает ввести эту команду под sudo?Насколько часто это нужно In real life?
Хороший вопрос. Пожалуй, это зависит от специфики работы. Скрипт на bash может молча остановиться, если по ходу выполнения возникла ошибка. Без кода возврата вы не поймёте по какой причине он остановился.
Можно использовать конструкцию вида «команда; wall команда успешно завершилась»
Ценное замечание, спасибо!
/usr/local/bin/wake.sh
#!/bin/sh
_CODE=$1
echo $'\a'
exit $_CODE
alias wake='/usr/local/bin/wake.sh $?'
Пример:
# ./test.sh ; echo $?
3
#./test.sh ; wake ; echo $?
3
PS. К тому же в скрипте можно указать условие, что если это X сессия, использовать notify-send или подобное
long-running-command; echo $'\a'
не будет грустного смайлика, если
long-running-command
завершится неудачно? Действительно, это упущение.Кстати, а почему «грустный смайлик», а не собственно код? Код завершения иногда предоставляет дополнительные данные: во‐первых, у некоторых программ они задокументированы. Во‐вторых, при завершении по (необработанному) сигналу код будет иметь определённое значение.
В‐третьих, если только последняя команда из цепочки вида a | b | c
завершилась с ошибкой, то код завершения будет ненулевым. Нужно показывать $pipestatus
(весь, если хотя бы одна программа завершилась с ошибкой), но пачка смайликов будет выглядеть как‐то странно.
./test.sh ; wake 'My Test Command'; echo $?
3
Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем)
При помощи вкладок (переименованных по желанию) запускаю много виртуальных терминалов. Принципиальных отличий от голой консоли не замечено.
У вас shell prompt не бесцветный случаем?
Из-за природной лени бесцветный.
Я сижу под рутом, потому что
В своей жизни я или как обычный пользователь и пользуюсь изредка sudo для разовых операций. Или работаю root-ом для чего-то сложного, после чего разлогиниваюсь.
Возможно, это тоже зависит от специфики работы.
Почему это вкладки не считаем? это очень удобно. Плюс Yakuake поддерживает разделение области на несколько терминалов, то есть в каждой вкладке у вас может быть несколько терминалов ( Случайный пример изинтернета https://onstartup.ru/wp-content/uploads/2018/05/yakuake-768x432.jpg ). Хоткеи на открытие, закрытие и переключение между вкладками и терминалами дополняют всё это до полного удобства и ускоряют процесс работы.
su
, sudo -s
, sudo su
.Я не имел в виду запускать от рута X-сессию и всё остальное.
sudo -s
/ sudo -i
— т.е. в какой-то момент включение рута происходит, и я пытался понять, про какой момент речь (Вы ответили). И ещё, извиняюсь, я неправильно прочитал ветку сообщений, мне почему-то показалось, что «сидеть под рутом или использовать sudo — холиварная тема» — это возражение к «спасает стандартное приглашение командной строки [# vs. $]», а не к «сидеть под root'ом грех, лучше использовать sudo» (уже понял, что неправильно прочитал).Суть не в том, что мы рано или поздно включаем рута, а в том, чтобы не выполнять от рута "случайных" команд. Для этого нужно во-первых всегда чётко осознавать что текущая команда выполняется от рута (что можно достигать разными способами — sudo, явная визуальная индикация что это рутовый шелл, отдельный хоткей для вызова рутового терминала, etc.), и во-вторых стараться не выполнять от рута то, что не требует рута (здесь только sudo спасает из-за лени).
Я тоже предпочитаю индикацию вместо sudo, но при этом нередко запускаю от рута man и т.п. — то, что можно было бы запустить и под юзером… вреда от этого пока не было, но по факту от рута запускается немного больше, чем необходимо.
Я сижу под рутом, потому что
в отдельной вкладке терминала — sudo bash
или sudo mc
плюс отличающийся от обычного внешний вид. Работать — в других вкладках, переключаясь в рутовую только при необходимости.
На самом деле это не сложно придумать. Например, рестрикты sudo/doas помогают ограничить действия других пользователей, в том числе пользователей-автоматов (типа позволить пользователю www одну-две команды «не от себя» или пользователю svn/git/hg, под которым обычно даже залогиниться нельзя, позволить исполнить post-commit hook). Но это конечно, не случай «сидеть под».
Но вот если вы работаете на нескольких терминалах локальных (в широком смысле: с локальных машин, которые физически быстро доступны) и на нескольких удалённых, то довольно легко ребутнуть или захалтить комп, к которому нет физического дуступа, или что-то там необратимо улучшить в файерволле. Тогда doas (sudo) с соответствующими правами/запретами ох как поможет.
А на локалхосте тоже по-моему ничего зазорного в root'е нет.
sudo немного может спасти от неадекватных или ошибочных действий (типа, подумай ещё раз). В данном случае sudo действует как инкапсуляция в объектно-ориентированном программировании, «на всякий пожарный закрою прямой доступ к опасным функциям».
Хотя, в реальной жизни это не всегда помогает. Как-то вернулся домой жутко нетрезвым (не помню, что было между очередной рюмкой в кафе и следующим утром) — а потом обнаружилось, что установил на домашний компьютер другой дистрибутив и даже пароли не забыл.
Тогда уж doas. Автор sudo Todd C. Miller не возражал, когда его детище выпилили из системы три года назад. Пришедший ему на смену doas существенно легковесней и проще в настройках.
Команды cp, scp и rm всегда должны работать рекурсивно. Аргумент -r — это просто дурное легаси!
Обычно подобное мнение несколько меняется когда грохнешь важное и сильно вложенное.
-r
? Вы любите делать rm *
, чтобы удалить файлы в каталоге, который содержит подкаталоги?удаление каталога в котором оказался другой вложенный
Без
-r
у вас не получится это сделать.и тд…
Какое именно? :)
По-моему безопаснее считать, что
rm
относится к каталогам так же, как и к файлам. Поэтому я не стану делать rm *
, чтобы удалить все файлы, но оставить каталоги. Если файлов настолько много, что перечислять их замучаешься, то я поступлю одним из следующих способов:for i in *; do test -f $i && rm $i; done
find -maxdepth 1 -type f -delete
\rm *
Без -r у вас не получится это сделать.
О чем и речь. Предлагается же сделать такое поведение по умолчанию.
По-моему безопаснее считать, что rm относится к каталогам так же, как и к файлам.
Кто спорит. Просто удаляют рекурсивно нужное обычно не от зловещих замыслов а от глупых ошибок.
Поэтому, на мой взгляд, не стоит команде без параметров давать больше возможностей деструкции.
rm
без -r
удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.
О чем и речь. Для того что бы удалить каталог нужно параметр указать явно.
А вы предлагаете такое по умолчанию.
ЗЫ Кроме -r есть еще -d. Но это так, просто к слову.
Если какие-то алиасы и подобное действительно нужны везде — то я бы задумался о пересмотре дефолтной конфигурации контейнера :)
Но ключ -r по дефолту — очень плохая идея, это правда.
но пока…
Скажем так. Изменять alias-ами команды, которые отвечают за вывод информации (ls, ну grep) — это одно. Изменять команды, которые изменяют/удаляют файлы — это уже совсем другое. Напр. mkdir -p
это относительно безобидно, максимум возможного ущерба — создаст не те каталоги из-за опечатки в середине пути, что и маловероятно, и вряд ли станет реальной проблемой. Но вот уже cp -r
это другая тема — я согласен с автором насчёт того, что это легаси и сейчас не актуально, но привыкнув запускать cp
без -r
рано или поздно можно скопировать намного меньше данных, чем рассчитывал (на машине без этого алиаса), и заметить это через месяц, когда уже поздно будет.
mkdir -p
не возвращает ошибки, если директория существует. Это может запутать, если паттерн работы "создать пустую директорию и что-то в ней делать". Если директория не пуста, то в ней можно что-то затереть, или какая-то автоматическая утилита может обработать что-то, что давно там лежит и быть обработано не должно и т.д.
Спасибо за статью!
Я пришел в комменты сказать, что сохранять что-либо wget
-ом прямо в .zshrc
— это, скорее всего, плохая практика (bad practice). Вообще отдельное спасибо за ссылку на арчевый конфиг. Чувствую, что его разбор тянет на отдельную статью, если не на цикл.
Так же ленивым любителям готового «изкаробки» — советую заглянуть в CI к камраду Станиславу Попову, который сделал готовый вариант установки ZSH + Antigen + Плагины с помощью Ansible. Удобнейшая штука получилась — указал список хостов в плейбуке и получил рабочее окружение в консоли со всеми своими плагинами и алиасами. Меня часто выручает при деплое виртуалок и новых серверов.
Обязательное умение слепого набора на клавиатуре. Тайлинговый оконный менеджер (в моем случае тоже i3). Работа с оконной системой в стиле emacs. Все трех клавишные хоткеи в топку. Клавиши F1-F12 Win и Fn туда же (по моему опыту, пальцам находить их неудобно). Основное правило — «Ctrl — перемещение, Alt — переключение». Например Alt+1 — переключится на первый рабочий стол(in), Ctrl+5 — переместить выделенное окно на 5 рабочий стол(out). Работа с приложениями в стиле vim. Вместо Esc — Ctrl+[. Браузер с вимоподобным плагином (раньше была лиса с vimperator, сейчас хром с cVim), evince, vim, обязательный файловый менеджер ranger дающий поразительную гибкость работы с клавиатуры и позволяющий более комфортно работать чем с некоторыми вим плагинами. В bashrc опция set -o vim. Перекладываем всю рутину на мышечную память пальцев. После этого действительно чувствуешь настоящую свободу работы на компьютере. Со временем мысленная концентрация только над текущей задачей, а пальцы помимо твоего сознания делают свою работу.
В bashrc опция set -o vim
$ set -o vim
bash: set: vim: недопустимое название параметра
Что вы имеете ввиду?
$ some words /on/the/screen -> $ some words
Чтобы стереть одно слово используется комбинация Alt+Backspace
$ some words /on/the/screen -> $ some words /on/the/
Есть разные реализации, разные оптимизации. Подлагивают далеко не все. Опять же, от детальности выводимой информации зависит то, удастся ли использовать некоторые оптимизации. При адекватном подходе в случае git всё летает, исключая гигантские репо вроде ядра линуха, но их можно исключать в индивидуальном порядке.
git status
, и если он толстый, то всё равно приходилось ждать.Лаги бывают, но только один раз, когда заходишь в каталог. Если шелл задумался, вычисляя
git status
для промта, а мы спешим, то можно его остановить, нажав Ctrl+C.Можно убрать статус из shell prompt, оставив только ветку. Так лагов не будет, насколько я помню.
Мне не приходилось работать с git-репозиториями на примонтированных сетевых ресурсах, возможно там действительно всё плохо.
Вот чего мне не хватает, так это видеть в history папку, в которой команда запускалась. Может кто-нибудь что-нибудь подскажет?
/vz/pva/agent/tmp/vzl.40500.4.xxxxxxxx-2f7a-744e-xxxx-xxxxxxxxxxxx.xxxxxxxx-2f7a-xxxx-b359-xxxxxxxxxxxx.oj4cj1apaaaaqay2izvadlyxxxxxxxxx/local-data/
и если бы это херь отображаась бы у меня постоянно в пути — это было бы дико неудобно. Уж лучше несколько раз освежить память и набрать pwd
Не забывайте, что алиасы не работают в скриптах! Там надо указывать все ключи.
Для меня это достаточная причина не использовать подобные алиасы.
Не затронута и ещё одна проблема агрессивного тюнинга под себя: дискомфорт при необходимости работать в «чужой» системе, а эта проблема есть.
Есть. Я тоже опасался при переходе на zsh, что это будет критично. На самом деле, неудобства, те или иные, есть всегда.
Раньше их было больше на рабочем компе, сейчас на рабочем компе почти всё (времени нормально разобраться в настройке автокомплита zsh у меня не хватило, так что он иногда работает странно — будет время, допилю) стало намного лучше. Раньше на удалённых компах их было меньше, сейчас их немного больше.
По факту — от перехода на zsh я не забыл bash и как работать в нём на удалённых компах. Отличия есть, но не настолько критичные. Так что новые неудобства совершенно однозначно не перевешивают новые удобства — по факту в результате (если брать в среднем по всем местам где набираются команды) стало таки заметно лучше. Кое-где на удалённых машинах я добавил алиасов в bash. Кое-где поставил zsh, но это скорее в качестве эксперимента, пытался понять насколько он мне там реально нужен — по факту оказалось, что не особо.
Текущий итог:
-На некоторые символы (;%:?*) мышечная память не появилась до сих пор (за 10 лет), видимо довольно редко ими пользуюсь.
— Текущая скорость около 250с/м, больше не растет, видимо это особенность моего мозга, я и читаю довольно таки медленно, порядка 100-120 слов/мин., проговариваю все прочитанное и написанное про себя.
— Понял, что пишу, как и читаю, по слогам, точнее наверное не слогам, а небольшими блоками, характерными для языка. Если текст состоит не из таких блоков, скорость падает катастрофически, в несколько раз.
— Не разу не пожалел о потраченном времени, как минимум глаза устают гораздо меньше, не нужно постоянно переводить фокус с экрана на клавиатуру и обратно.
А потом я узнал про VIM, но это уже другая история.))
Посчастливилось мне в 7-8 классе попасть в местный Лицей Инф.Технологий на дополнительные. Одно из занятий была "Информатика", которая была похожа на любую школьную программу по этому предмету (уныло и не информативно), за исключением одного: один из их выпускников написал на делфи клавиатурный тренажер, используя все те же методики, что и в большинстве популярных программ (начинаем с "ао", потом растем до горизонтального ряда "фывапролджэ", и т.д.), но в более красивой оберточке, с экранной клавиатурой с подсветкой положений каждого пальца, текущего символа и следующего за ним.
А еще они наколотили П-образных закрывалок, которые ставились над руками. И каждое занятие заставляли минут 10-15 (из полутора часов) провести за тренажером.
С латиницей у меня проблем не было (с детства был subor, только китайский. На клавиатуре был англ и иероглифы. На одном из стоковых картриджей было два клавотренажера), а вот с кирилицей я тогда намучался знатно. Но, вероятно, скорость набора моя тогда выросла знаков до 120, что являлось советской нормой для машинистки, и я успешно сдал "зачет" по этому делу.
Спустя лет пять мне пришлось переучиваться, потому что коллега кинул линк на тогда только появившиеся "клавогонки", адово перегнал в заезде, сайт показал мне чуть меньше 100 символов, и кучу советов. Я начал следовать советам и уже через пару месяцев печатал 230 символов в минуту. Забил, через пару лет пришел, еще за пару месяцев сделал почти 300. И так, забивая на год-два, потом возвращаясь я догнал до 400-500 символов в минуту (это при переписываемом тексте). Замерял TypeStatistic'сом в момент жаркого форумного спора (это когда мысли формируются очень быстро, только записывать успевай) — получилось почти 800 сим/мин при 1.5% ошибок. Сейчас работаю над безошибочным вводом :)
Ну и да, я ни разу не пожалел о потраченном времени. И с Vim'ом тоже :) Вчера очень удивился, но один из коллег сказал "ты вимом пользуешься? Запомнил все хоткеи что-ли?" (вроде бы все давно знают, что я упорот), на что я сказал, что за весь его просмотр я воспользовался от силы десятком, но это было настолько быстро, что он восхитился и ушел читать мануал (это не поможет, ему станет лениво, но это уже не мои проблемы)
Не знаете, почему иногда при открытии терминала появляется знак прочента на пустой строке?
Если команда не вывела в конце новую строку, то эта возможность zsh предотвратит слияние вывода команды с приглашением ко вводу.
Это лучше объяснить на примере: запустите zsh -f
и наберите там echo -n abc
. Получите что‐то вроде
# zsh -f
zyx-desktop% echo -n abc
abc%
zyx-desktop%
(процент после abc нарисован инвертированно) (кстати, хочу заметить, что при копировании между подсвеченным %
и z
нет символа новой строки, только много пробелов).
Если попробовать эквивалентный вариант с bash
, то получите что‐то вроде
# bash --norc --noprofile
bash-4.4$ echo -n abc
abcbash-4.4$
С неподсвеченными приглашениями ко вводу это особенно заметно: попробуйте быстро найти где заканчивается abc
и начинается приглашение. И это не всё: нажмите t
и дождитесь, пока символов не станет много (для гарантии — пока «команда» не перейдёт на новую строку). Когда у вас набралась команда вида tttttttttttttttttttttttttttttttttttttttttttttttttttt
нажмите <C-u>
. В нормальной ситуации вы получите bash-4.4$
. С abcbash-4.4$
вы получите abcbash-4.
: bash не понимает, где реально находится ваш ввод и все возможности, которые должны знать позицию курсора, будут работать некорректно.
В zsh выводимое значение задаётся в $PROMPT_EOL_MARK. Думаю, если установить её в пустую строку или перевод строки — сработает как отключение фичи.
Документация на $PROMPT_EOL_MARK явно указывает на то, какие настройки отвечают за это поведение. Установка в пустую строку не является отключением, просто не будет визуальной индикации, что команда завершилась без новой строки, но новая строка будет добавляться, знака процента только не будет.
Но мне кажется, вопрос не в том «как отключить», а «отключить при открытии терминала». При открытии терминала этот процент показываться не должен, потому что ещё не введены никакие команды. Я не имею ни малейшего понятия, как можно случайно вывести этот процент в файлах настроек, но, возможно, терминал при открытии что‐то шлёт, что воспринимается как команда. Отключение показа просто лишит человека удобной возможности и спрячет какую‐то проблему, не решив её.
Сказать что за проблема сложно, я бы предложил
- Сначала удалить (переименовать так, чтобы zsh не нашёл) файлы настроек. Если процент останется, то виноват терминал. Если нет, то дело в каких‐то плагинах.
Добавить
set -x
в начало какого‐либо файла настроекzsh
. Например,zshrc
, но лучше в/etc[/zsh]/zshenv
(по‐умолчанию в/etc/zshenv
, но, к примеру, в Gentoo zsh компилируется так, чтобы он искал этот файл в/etc/zsh/zshenv
). После получения в начале терминала кучи строк вроде+_zsh_highlight_preexec_hook:3> typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=0
вместо процента нужно убедиться, что вы видите начало вывода (следующую заset -x
строку с какой‐либо командой, рекомендую просто добавить послеset -x
что‐то вродеtrue start
:true
ничего не делает с аргументом и ничего не выводит, но в трассировке появится), скопировать весь вывод в какой‐либо текстовый редактор и поискать для начала там/bin/zsh
: запускаемые пользователем команды в выводеset -x
выглядят как+/bin/zsh:4> foo
.
Если таким образом нашлась какая‐то команда, которую вы не печатали, то попытайтесь по окружению определить, откуда она взялась. Как гарантированно найти проблему, если такой команды нет, я не знаю, но я бы просто просмотрел вывод на предмет того, понимаю ли я что там происходит и откуда берутся команды.
- Если вы используете что‐то вроде oh-my-zsh, то просмотр вывода после
set -x
на предмет «зачем и откуда» может оказаться кошмаром. Но тут должно быть возможно отключение плагинов блоками до того момента, как процент при запуске не перестанет показываться.
Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы.— лично я зажимаю Ctrl+Shift+Left если хочу удалить несколько предыдущих слов или Shift+Home если хочу удалить полностью строку, а потом уже Backspace. Удалять посимвольно Backspace-ом давно перестал.
┌[legolegs@host ~/path] :)
└>
export PS1='\[\e[36;1m\]┌\[\e[0m\]\[\e[36m\]\[\e[30;1m\][\[\e[0m\]\
\u\[\e[47;1m\]@\[\e[0m\]\h \[\e[35;1m\]\w\[\e[0m\]\[\e[30;1m\]] $(erco=$?;[ $erco == 0 ] && echo -n "\[\e[32;1m\]:)\[\e[0m\]" || echo -n "\[\e[31;1m\]:(\[\e[0m\] \$?=$erco" )\[\e[0m\]\n\
\[\e[36;1m\]└\[\e[0m\]\[\e[36m\]\[\e[0m\]\
\[\e[34;1m\]>\[\e[0m\] '
Использую много лет.
shopt -s histappend # не затирать изменения, сделанные другими копиями терминала
export HISTSIZE=20000 HISTFILESIZE=500000 # диски нынче большие
export PROMPT_COMMAND='history -a' # регулярно сохранять историю
Отличная статья, спасибо!
Странно что не упомянули ещё один популярный терминал "terminator". Все мои коллеги пользуются только им. Особенно удобно когда нужно параллельно вводить одно и то же в несколько ssh сессий. Visual bell настраивается.
Работаем в консоли быстро и эффективно