Как стать автором
Обновить

Комментарии 117

> Хм, куда бы припрятать текущий ввод? Вот сюда и припрятать.
alt+shift+3
Поясните пожалуйста в чём прикол.
Это «краткий алиас» для последовательности из ctrl-a, #, ctrl-e, ctrl-o. Сохраняет закомментированную строку в history.
Хм, не знал о таком. Ваш способ требует больше телодвижений для запуска: надо поднять команду из истории, перейти в начало строки, убрать начальный #. Но зато припрятанное точно не потеряется.
Ну в вашем способе буфер потрется при использовании ctrl-w, а это очень вероятно =)

А вообще можно ещё использовать ctrl+/ (undo в emacs-mode readline).
Поднять команду из истории легко Ctrl-p. Запустить её можно Ctrl-m.

Вообще-то в 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

Работает следующим образом:


  1. набираем (частично) команду
  2. понимаем, что перед её выполнением надо сначала запустить другую команду
  3. нажимаем Ctrl-q
  4. вводим забытую команду и Enter
  5. в командной строке автоматически появляется то, что было набрано перед Ctrl-q
Вот это вы раскопали! Круто!
Эта фича должна быть во всех современных мессенджерах :)
Я проще делаю: в конце введенной команды ставим обратный слеш, Enter, Ctrl+C. После этого все осядет в истории.

Странно что после


В оболочках fish и ipython такой поиск уже назначен на стрелочки. Я думаю что многие перешли на fish только ради такого поведения стрелочек.

не упомянуты zsh-autosuggestions и zsh-history-substring-search

Спасибо за ссылки. autosuggestions — это тема. Поиск произвольной подстроки в истории нужен намного реже, чем поиск с начала. Для него можно и Ctrl+R нажать (это про вторую ссылку).

но как же стрелочки! /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
Разумеется, можно переопределить стрелочки, если очень хочется.
Для readline (bash):
"\e[A":history-search-backward
"\e[B":history-search-forward

Из коробки уже ж забиндено на PgUp/PgDown.

Неожиданно полезная статья на, казалось бы, избитую тему. Спасибо!

Стоит упомянуть менеджеры консольных сессий: screen, tmux, byobu. Перегружать информацией PROMPT не стоит, гораздо удобнее использовать статусную строку менеджера сессий.
Да, кстати, как вы в Zsh без screen работаете?
* пардон, промахнулся, это автору.
Эмм… А в чём подвох? Я использую screen исключительно как замену nohup, а тайлинг обеспечивается оконным менеджером i3. Мне не лень открыть ещё один терминал (вы уже знаете что это быстро) и повторно подключиться к серверу по ssh, если возникла такая необходимость.
У меня zsh под screen не работает никак.
Mac + iTerm -> ssh на Ubuntu -> zsh + screen
Похоже где-то screen меняет $TERM принудительно…
Без screen все отлично…
Неплохо бы проверить каждое звено этой цепи, чтобы найти виновника.

  1. Попробовать другой терминал или Linux вместо Mac.
  2. Попробовать на другом сервере.
  3. Попробовать запустить bash под screen вместо zsh (screen bash).
  4. Попробовать другой zshrc, например по ссылке из статьи.
Скриншот покажете? Согласен, PROMPT не стоит перегружать. В каком именно ключе стоит упомянуть менеджеры консольных сессий? Я много о чём не написал :)
Вот хорошая статья на эту тему и со скриншотом: hackernoon.com/customizing-tmux-b3d2a5050207

Менеджер консольных сессий имхо удобнее использовать для работы на удаленных серверах, чем открывать новые коннекты в табах. Плюс при обрыве соединения сессия не теряется.
А не появился ли случайно хороший аналог PuntoSwitcher'a? Собственно, интересует не автопереключение раскладки, а только возможность сменить раскладку последнего набранного слова.
Лично мне такая фича очень много времени экономит при наборе текста.
К сожалению я о таком не знаю.

у меня вот такая команда повешена на хоткей


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

Заменяет "раскладку" текста в буфере обмена. в обе стороны

Вот это я понимаю linux-way! Спасибо!
Короткий вариант (работает под MacOS):
fixlayout() {
en="qwertyuiop\[]asdfghjkl;'\zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>\@№%%^&*"
ru="йцукенгшщз\хъфывапролджэёячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЁЯЧСМИТЬБЮ\"#$:,.;"
pbpaste | sed y=$en$ru=$ru$en= | pbcopy
}
xneur?
(Когда я его пробовал в последний раз, он был глючным: что-то автоматически переключал даже когда это было явно запрещено в настройках — но это было давно.)
gxneur
ИМХО правильный подход — отказ от циклического переключения раскладок (отдельные переключатели для кириллицы и латиницы), тогда не нужно помнить какая раскладка сейчас активна, просто включил нужную и начал печтать

По поводу алиасов, недавно задался вопросом какие команды я чаще всего использую, чтобы сдеалать им алиасы. В итоге написал вот эту команду, которая читает 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

В zsh по‐умолчанию нет никаких alias, кроме run-help=man и which-command=whence. Можете проверить с zsh -f. Вы говорите либо про какие‐то системные файлы настроек, либо про сборку вроде oh-my-zsh.

Да, вы правы, у меня как раз oh-my-zsh.

Для удобного поиска по истории команд, файлам и директориям(и перехода по ним), можно использовать FZF(Arch Wiki). А для ускорения самого поиска — прикрутить к этому ещё the_silver_searcher.

Пример из моего конфига:
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'

Да, FZF среди всех улучшателей консоли можно поставить на первое место.
Гифка для привлечения внимания:
image
Давным-давно был рабочий метод ускорения печати на клавиатуре — реалтайм игры в MUD'ы, особенно PVP. Потом телнет-клиенты стали продвинутыми, и игра превратилась в «нажми кнопку — пошли целую команду», и метод себя изжил. Но было интересно, а ещё было потрясающее по мощности подкрепление успехам и неудачам — пронимало почти любого, кто в это играл.
Интересная статья, но позволю себе споры и комментарии в нескольких участках:

Терминал должен запускаться мгновенно

Для этих целей я юзаю Yakuake (для KDE). Есть аналог guake для GNOME. Терминал и не закрывается, он прячется вверху экрана и быстро вызывается по горячей клавише.

Если вы периодически переключаетесь со своего пользователя на рута, вам нужна индикация текущего пользователя

Спасает стандартное приглашение командной строки. Если последний символ $ — вы обычный пользователь, если # — root. Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).

Неуспешное завершение последней команды полезно видеть сразу.

Насколько часто это нужно In real life? Если нужно запустить набор последовательных команд, их проще пускать через &&

Индикатор завершения процесса

Можно использовать конструкцию вида «команда; wall команда успешно завершилась»

Для этих целей я юзаю Yakuake (для KDE)

Ну, вы же всё равно согласны, что он должен открываться мгновенно :) Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем). Видимо вам для работы хватает. Я не критикую, это же дело вкуса.

Спасает стандартное приглашение командной строки.

У вас shell prompt не бесцветный случаем?

Сидеть под рутом или использовать sudo — холиварная тема. Ни в коем случае не хочу начинать спор, только приведу аргументы. Я сижу под рутом, потому что:

  1. Не встречал сильных аргументов в пользу sudo.
  2. Рутовые команды приходится писать часто.
  3. Лень набирать 5 лишних символов для каждой команды.
  4. Так «рутовые» команды попадают в свою историю, а не смешиваются с моей.
  5. Получаем полноценный автокомплит, а не урезанный.
  6. Хорошо различаю обычный и рутовый шелл, поэтому не промахиваюсь.


Давайте придумаем реальный сценарий, когда 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 (весь, если хотя бы одна программа завершилась с ошибкой), но пачка смайликов будет выглядеть как‐то странно.

Спасибо за замечание. Вы правы. Грустный смайлик у кого-то подглядел, мне идея понравилась. На практике конкретный код возврата не требовался. Главное — заметить, что что-то пошло не так.

В дефолтном конфиге Archlinux код возврата показывается цифрами, если он не нулевой.
Мне просто понравилась идея и я решил ее для себя развить. К тому же это решает проблемы с грустным смайликом :)



./test.sh ; wake 'My Test Command'; echo $?
3
Красиво! Могу только предложить переписать wake как обёртку, чтобы запускать
wake ./test.sh

Имя команды, которая завершилась, он может определить сам как $(basename $1).
Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем)

При помощи вкладок (переименованных по желанию) запускаю много виртуальных терминалов. Принципиальных отличий от голой консоли не замечено.

У вас shell prompt не бесцветный случаем?

Из-за природной лени бесцветный.

Я сижу под рутом, потому что

В своей жизни я или как обычный пользователь и пользуюсь изредка sudo для разовых операций. Или работаю root-ом для чего-то сложного, после чего разлогиниваюсь.
Возможно, это тоже зависит от специфики работы.

Почему это вкладки не считаем? это очень удобно. Плюс Yakuake поддерживает разделение области на несколько терминалов, то есть в каждой вкладке у вас может быть несколько терминалов ( Случайный пример изинтернета https://onstartup.ru/wp-content/uploads/2018/05/yakuake-768x432.jpg ). Хоткеи на открытие, закрытие и переключение между вкладками и терминалами дополняют всё это до полного удобства и ускоряют процесс работы.

Что подразумевается под «сидеть под рутом»?
Иметь открытый терминал с рутовым шеллом. Поднять свой шелл до рутового можно командами su, sudo -s, sudo su.

Я не имел в виду запускать от рута X-сессию и всё остальное.
Ясно. Просто суть с том, что в какой-то момент мы по-любому включаем рута: или при запуске X-сессии, или при запуске терминала, или потом sudo -s / sudo -i — т.е. в какой-то момент включение рута происходит, и я пытался понять, про какой момент речь (Вы ответили). И ещё, извиняюсь, я неправильно прочитал ветку сообщений, мне почему-то показалось, что «сидеть под рутом или использовать sudo — холиварная тема» — это возражение к «спасает стандартное приглашение командной строки [# vs. $]», а не к «сидеть под root'ом грех, лучше использовать sudo» (уже понял, что неправильно прочитал).

Суть не в том, что мы рано или поздно включаем рута, а в том, чтобы не выполнять от рута "случайных" команд. Для этого нужно во-первых всегда чётко осознавать что текущая команда выполняется от рута (что можно достигать разными способами — sudo, явная визуальная индикация что это рутовый шелл, отдельный хоткей для вызова рутового терминала, etc.), и во-вторых стараться не выполнять от рута то, что не требует рута (здесь только sudo спасает из-за лени).
Я тоже предпочитаю индикацию вместо sudo, но при этом нередко запускаю от рута man и т.п. — то, что можно было бы запустить и под юзером… вреда от этого пока не было, но по факту от рута запускается немного больше, чем необходимо.

Я сижу под рутом, потому что

в отдельной вкладке терминала — sudo bash или sudo mc плюс отличающийся от обычного внешний вид. Работать — в других вкладках, переключаясь в рутовую только при необходимости.

Давайте придумаем реальный сценарий, когда sudo спасёт вас. Мне в голову приходит только rm -rf /. Но если человек в принципе готов запускать такую команду, то что ему помешает ввести эту команду под sudo?

На самом деле это не сложно придумать. Например, рестрикты sudo/doas помогают ограничить действия других пользователей, в том числе пользователей-автоматов (типа позволить пользователю www одну-две команды «не от себя» или пользователю svn/git/hg, под которым обычно даже залогиниться нельзя, позволить исполнить post-commit hook). Но это конечно, не случай «сидеть под».

Но вот если вы работаете на нескольких терминалах локальных (в широком смысле: с локальных машин, которые физически быстро доступны) и на нескольких удалённых, то довольно легко ребутнуть или захалтить комп, к которому нет физического дуступа, или что-то там необратимо улучшить в файерволле. Тогда doas (sudo) с соответствующими правами/запретами ох как поможет.

А на локалхосте тоже по-моему ничего зазорного в root'е нет.
То, что sudo ограничивают действия других пользователей — это понятно. Речь идёт об ограничении себя на локальной машинке.

sudo немного может спасти от неадекватных или ошибочных действий (типа, подумай ещё раз). В данном случае sudo действует как инкапсуляция в объектно-ориентированном программировании, «на всякий пожарный закрою прямой доступ к опасным функциям».

Хотя, в реальной жизни это не всегда помогает. Как-то вернулся домой жутко нетрезвым (не помню, что было между очередной рюмкой в кафе и следующим утром) — а потом обнаружилось, что установил на домашний компьютер другой дистрибутив и даже пароли не забыл.
Вот это сильно!
Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).

Тогда уж 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. Но это так, просто к слову.
НЛО прилетело и опубликовало эту надпись здесь
Когда в конторе 100500 человек и 100500 машин, которые нынче одноразовые AMI и контейнеры, любые алиасы отпадают, и особенно изменение дефолтного поведения rm

Если какие-то алиасы и подобное действительно нужны везде — то я бы задумался о пересмотре дефолтной конфигурации контейнера :)


Но ключ -r по дефолту — очень плохая идея, это правда.

безусловно, в идеальном мире в контейнер/disposable VM никогда логиниться не надо, и скоро (тм) мы к этому придем =)
но пока…

Скажем так. Изменять alias-ами команды, которые отвечают за вывод информации (ls, ну grep) — это одно. Изменять команды, которые изменяют/удаляют файлы — это уже совсем другое. Напр. mkdir -p это относительно безобидно, максимум возможного ущерба — создаст не те каталоги из-за опечатки в середине пути, что и маловероятно, и вряд ли станет реальной проблемой. Но вот уже cp -r это другая тема — я согласен с автором насчёт того, что это легаси и сейчас не актуально, но привыкнув запускать cp без -r рано или поздно можно скопировать намного меньше данных, чем рассчитывал (на машине без этого алиаса), и заметить это через месяц, когда уже поздно будет.

mkdir -p не возвращает ошибки, если директория существует. Это может запутать, если паттерн работы "создать пустую директорию и что-то в ней делать". Если директория не пуста, то в ней можно что-то затереть, или какая-то автоматическая утилита может обработать что-то, что давно там лежит и быть обработано не должно и т.д.

Спасибо за статью!


Я пришел в комменты сказать, что сохранять что-либо wget-ом прямо в .zshrc — это, скорее всего, плохая практика (bad practice). Вообще отдельное спасибо за ссылку на арчевый конфиг. Чувствую, что его разбор тянет на отдельную статью, если не на цикл.

Без упоминания Antigen и Oh-my-zsh статья не полная.
Так же ленивым любителям готового «изкаробки» — советую заглянуть в 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. Перекладываем всю рутину на мышечную память пальцев. После этого действительно чувствуешь настоящую свободу работы на компьютере. Со временем мысленная концентрация только над текущей задачей, а пальцы помимо твоего сознания делают свою работу.
НЛО прилетело и опубликовало эту надпись здесь
Да, встречаются и конфликты, а порой курьезы. Например во время актуальности федора25 повесили на правую Alt модификатор помойму для вывода знака рубля. Я тогда тайлинг накатывала «поверх» гнома
s/evince/zathura/ :)
Много программ имеют в настройках управление в стиле vim в явной форме или возможность конфигурирования. На мой взгляд засура не только имеет управление в стиле вим но ближе к туи программам с дополнительным набором нативных команд, таких как mocp, newsbeuter, tig но в данном случае я не об этом, а о необходимости держать руки на стартовой позиции клавиатуры и без лишних движений иметь возможность как перемещаться по окнам, рабочим столам так и иметь такой же функционал находясь в окне программы. Выражаясь термином скорости работы алгоритмов, хотелось бы иметь доступ к любому API равный постоянному времени O(1).
В bashrc опция set -o vim

$ set -o vim
bash: set: vim: недопустимое название параметра


Что вы имеете ввиду?
Дико извиняюсь set -o vi
НЛО прилетело и опубликовало эту надпись здесь
Недавно перевёл вызов терминала на F1 — ещё удобней
Ctrl+W — стирает не слово, а до разделителя по-умолчанию, который обычно пробел.
$ some words /on/the/screen -> $ some words
Чтобы стереть одно слово используется комбинация Alt+Backspace
$ some words /on/the/screen -> $ some words /on/the/
По поводу shell prompt — очень удобно, на мой взлгяд, иметь перенос строки после него, всегда больше места для команды + при копипасте можно не париться о промпте.
НЛО прилетело и опубликовало эту надпись здесь

Есть разные реализации, разные оптимизации. Подлагивают далеко не все. Опять же, от детальности выводимой информации зависит то, удастся ли использовать некоторые оптимизации. При адекватном подходе в случае git всё летает, исключая гигантские репо вроде ядра линуха, но их можно исключать в индивидуальном порядке.

Тоже долгое время сдерживал себя этим аргументом, но в итоге удобство победило. Раньше, оказавшись в локальном git-репозитории, первым делом я вводил команду git status, и если он толстый, то всё равно приходилось ждать.

Лаги бывают, но только один раз, когда заходишь в каталог. Если шелл задумался, вычисляя git status для промта, а мы спешим, то можно его остановить, нажав Ctrl+C.

Можно убрать статус из shell prompt, оставив только ветку. Так лагов не будет, насколько я помню.

Мне не приходилось работать с git-репозиториями на примонтированных сетевых ресурсах, возможно там действительно всё плохо.
НЛО прилетело и опубликовало эту надпись здесь

Учитывая, что работать с гит-репо находящимся на сетевом ресурсе смысла нет в принципе (более того, это противоречит самой идее гита), надо поискать способ отключить вывод информации о репозитории для каталогов начинающихся на /external — это позволит получить плюсы обоих подходов.

Рабочее место может быть тонким клиентом с домашней директорией монтируемой из сети.

Да, при условии, что эта сеть не тормозит настолько, как описывает balexa.

Вот чего мне не хватает, так это видеть в history папку, в которой команда запускалась. Может кто-нибудь что-нибудь подскажет?

Мне тоже интересно.

У меня это сделано так:


[[ "$PROMPT_COMMAND" == *bash_eternal_history* ]] || export PROMPT_COMMAND+="${PROMPT_COMMAND:+ ;} history -a ; "'echo -e $USER\\t$HOSTNAME\\t$PWD\\t"$(history 1)" >> ~/.bash_eternal_history'
так выше ведь уже ответили на это )
Где?
Если честно, то вывод полного пути в консоли неудобен, ну лично для меня. Т.к. часто оказываешься в каких-то местах и путь занимет всю строку. Например, я сейчас работаю в директории:
/vz/pva/agent/tmp/vzl.40500.4.xxxxxxxx-2f7a-744e-xxxx-xxxxxxxxxxxx.xxxxxxxx-2f7a-xxxx-b359-xxxxxxxxxxxx.oj4cj1apaaaaqay2izvadlyxxxxxxxxx/local-data/
и если бы это херь отображаась бы у меня постоянно в пути — это было бы дико неудобно. Уж лучше несколько раз освежить память и набрать pwd
НЛО прилетело и опубликовало эту надпись здесь

В zsh тоже есть:


hash -d MyProj=~/proj/some/long/path/to/my/project

в zsh можно ограничивать размер PS1 (см. man zshmisc про %<string<). Например, у меня это сделано так: %25<..<%~.


Вот весь PS1, кстати:


PS1='%(?..[%{^[[31m%}%B%?%{^[[0m%}%b])%(#.%{^[[1;31m%}.%{^[[32m%})%n%{^[[0m%}@%m %B%25<..<%~%b %h%# '
Не забывайте, что алиасы не работают в скриптах! Там надо указывать все ключи.

Для меня это достаточная причина не использовать подобные алиасы.

Не затронута и ещё одна проблема агрессивного тюнинга под себя: дискомфорт при необходимости работать в «чужой» системе, а эта проблема есть.

Есть. Я тоже опасался при переходе на zsh, что это будет критично. На самом деле, неудобства, те или иные, есть всегда.
Раньше их было больше на рабочем компе, сейчас на рабочем компе почти всё (времени нормально разобраться в настройке автокомплита zsh у меня не хватило, так что он иногда работает странно — будет время, допилю) стало намного лучше. Раньше на удалённых компах их было меньше, сейчас их немного больше.
По факту — от перехода на zsh я не забыл bash и как работать в нём на удалённых компах. Отличия есть, но не настолько критичные. Так что новые неудобства совершенно однозначно не перевешивают новые удобства — по факту в результате (если брать в среднем по всем местам где набираются команды) стало таки заметно лучше. Кое-где на удалённых машинах я добавил алиасов в bash. Кое-где поставил zsh, но это скорее в качестве эксперимента, пытался понять насколько он мне там реально нужен — по факту оказалось, что не особо.

Поделюсь своим опытом овладения методом слепой печати. Как и автору статьи «Сало на клавиатуре» не дало практически никакого результата. Наилучший результат дало набирание реальных текстов (в моем случае крылатых выражений и цитат) в Stamina. Возможно несколько десятков часов проведенных перед этим в Солло, тоже повлияли на результат. В общем я поступил радикально, просто заклеил все буквы на клавиатуре наклейками, что бы отучиться от рефлекторного подсматривания. Так же сделал распечатку раскладки и установил ее между монитором и клавиатурой. Она нужна что бы подглядывать за забытым расположением клавиш, особенно не алфавитных (собаки, шарпы, тильды и т.д.), так как они запоминаются гораздо дольше. Проделал я это (каюсь) и на работе и дома. Момент был выбран не нагруженный, что бы не сильно вредить рабочему процессу. Первая неделя это был ад. Т. к. работать было практически невозможно. Во обще то я и занимался в основном не работой, а клавиатурным тренажером, с перерывами на почитать что нибудь профильное. Ко второй неделе я уже вполне сносно (практически не доставляло дискомфорта) освоил ЙЦУКЕН раскладку (150-200 с/м, в зависимости от сложности текста), к концу месяца и QWERTY.
Текущий итог:
-На некоторые символы (;%:?*) мышечная память не появилась до сих пор (за 10 лет), видимо довольно редко ими пользуюсь.
— Текущая скорость около 250с/м, больше не растет, видимо это особенность моего мозга, я и читаю довольно таки медленно, порядка 100-120 слов/мин., проговариваю все прочитанное и написанное про себя.
— Понял, что пишу, как и читаю, по слогам, точнее наверное не слогам, а небольшими блоками, характерными для языка. Если текст состоит не из таких блоков, скорость падает катастрофически, в несколько раз.
— Не разу не пожалел о потраченном времени, как минимум глаза устают гораздо меньше, не нужно постоянно переводить фокус с экрана на клавиатуру и обратно.
А потом я узнал про VIM, но это уже другая история.))

Посчастливилось мне в 7-8 классе попасть в местный Лицей Инф.Технологий на дополнительные. Одно из занятий была "Информатика", которая была похожа на любую школьную программу по этому предмету (уныло и не информативно), за исключением одного: один из их выпускников написал на делфи клавиатурный тренажер, используя все те же методики, что и в большинстве популярных программ (начинаем с "ао", потом растем до горизонтального ряда "фывапролджэ", и т.д.), но в более красивой оберточке, с экранной клавиатурой с подсветкой положений каждого пальца, текущего символа и следующего за ним.
А еще они наколотили П-образных закрывалок, которые ставились над руками. И каждое занятие заставляли минут 10-15 (из полутора часов) провести за тренажером.
С латиницей у меня проблем не было (с детства был subor, только китайский. На клавиатуре был англ и иероглифы. На одном из стоковых картриджей было два клавотренажера), а вот с кирилицей я тогда намучался знатно. Но, вероятно, скорость набора моя тогда выросла знаков до 120, что являлось советской нормой для машинистки, и я успешно сдал "зачет" по этому делу.
Спустя лет пять мне пришлось переучиваться, потому что коллега кинул линк на тогда только появившиеся "клавогонки", адово перегнал в заезде, сайт показал мне чуть меньше 100 символов, и кучу советов. Я начал следовать советам и уже через пару месяцев печатал 230 символов в минуту. Забил, через пару лет пришел, еще за пару месяцев сделал почти 300. И так, забивая на год-два, потом возвращаясь я догнал до 400-500 символов в минуту (это при переписываемом тексте). Замерял TypeStatistic'сом в момент жаркого форумного спора (это когда мысли формируются очень быстро, только записывать успевай) — получилось почти 800 сим/мин при 1.5% ошибок. Сейчас работаю над безошибочным вводом :)


Ну и да, я ни разу не пожалел о потраченном времени. И с Vim'ом тоже :) Вчера очень удивился, но один из коллег сказал "ты вимом пользуешься? Запомнил все хоткеи что-ли?" (вроде бы все давно знают, что я упорот), на что я сказал, что за весь его просмотр я воспользовался от силы десятком, но это было настолько быстро, что он восхитился и ушел читать мануал (это не поможет, ему станет лениво, но это уже не мои проблемы)

Спасибо! Всегда нравился терманал в установщике Arch Linux, но как то не приходило в голову загуглить конфиг.

Не знаете, почему иногда при открытии терминала появляется знак прочента на пустой строке?
image

Если команда не вывела в конце новую строку, то эта возможность 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 явно указывает на то, какие настройки отвечают за это поведение. Установка в пустую строку не является отключением, просто не будет визуальной индикации, что команда завершилась без новой строки, но новая строка будет добавляться, знака процента только не будет.


Но мне кажется, вопрос не в том «как отключить», а «отключить при открытии терминала». При открытии терминала этот процент показываться не должен, потому что ещё не введены никакие команды. Я не имею ни малейшего понятия, как можно случайно вывести этот процент в файлах настроек, но, возможно, терминал при открытии что‐то шлёт, что воспринимается как команда. Отключение показа просто лишит человека удобной возможности и спрячет какую‐то проблему, не решив её.


Сказать что за проблема сложно, я бы предложил


  1. Сначала удалить (переименовать так, чтобы zsh не нашёл) файлы настроек. Если процент останется, то виноват терминал. Если нет, то дело в каких‐то плагинах.
  2. Добавить 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.


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


  3. Если вы используете что‐то вроде oh-my-zsh, то просмотр вывода после set -x на предмет «зачем и откуда» может оказаться кошмаром. Но тут должно быть возможно отключение плагинов блоками до того момента, как процент при запуске не перестанет показываться.
Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы.
— лично я зажимаю Ctrl+Shift+Left если хочу удалить несколько предыдущих слов или Shift+Home если хочу удалить полностью строку, а потом уже Backspace. Удалять посимвольно Backspace-ом давно перестал.
На примере Backspace я объяснял задержку и частоту автоповтора. Эти два значения влияют на всю клавиатуру, а не только на Backspace. Неужели вы никогда не используете автоповтор? Может быть хотя бы стрелочки ↑↓ для скролла?
Если кто-то проникся статьёй, но с баша на zsh перелезать не готов, то предлагаю свой PROMPT c путём и кодом возврата, но на двух строках, чтобы длинные пути не мешали набирать команды. Выглядит так (только малость по-попугайски расцвечен):
┌[legolegs@host ~/path] :)
└>

код для ~/.bashrc
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' # регулярно сохранять историю

Для малинки, кстати, я пришел к тому, что держал некий “базовый” хистори, кидал его на виртуальный диск и оттуда использовал как текущий. Если надо, обновляя оттуда “базовый”.
Но у меня работа в консоли на самой малине была редко-отладочной, возможно если постоянно — будет неудобно.
Пусть лучше shell prompt сообщит, если команда завершилась неуспешно.

У меня это место оформлено несколько иначе: если код возврата ненулевой, zsh выведет его в приглашение, иначе ничего выводить не будет. Достигается вот так: %(?..[%{^[[31m%}%B%?%{^[[0m%}%b]), выглядит сложно, но если убрать Esc-последовательности, станет понятнее: %(?..[%?]).

Отличная статья, спасибо!
Странно что не упомянули ещё один популярный терминал "terminator". Все мои коллеги пользуются только им. Особенно удобно когда нужно параллельно вводить одно и то же в несколько ssh сессий. Visual bell настраивается.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.