Работаем в консоли быстро и эффективно

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


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


Сколько времени вам нужно, чтобы запустить терминал? А ещё один? Долгое время мой терминал запускался сочетанием Ctrl+Alt+T и я думал, что это быстро. Но когда я переехал с Openbox на i3, то стал запускать терминал через Win+Enter, это сочетание было в конфиге по умолчанию. И знаете что? Я больше не считаю, что Ctrl+Alt+T — это быстро.


Разумеется, прикол не в выигрыше миллисекунд, а в том, что вы открываете терминал на уровне рефлексов, совершенно не замечая этого.


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


Zsh вместо Bash


Это холиварная тема, знаю. Zsh стоит поставить хотя бы ради трёх фич: продвинутый автокомплит, коррекция опечаток и множественный pathname completition: когда один Tab превращает /u/s/d в /usr/share/doc. Arch Linux уже давно перешёл на zsh в своём установочном диске. Я надеюсь что однажды zsh станет дефолтным шеллом в Ubuntu. Это будет исторический момент.


Начать использовать zsh вообще не сложно. Установите его через менеджер пакетов и возьмите какой-нибудь готовый конфиг. Я рекомендую конфиг, который используется в Arch Linux:


wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc

Осталось только поменять "шелл по-умолчанию" на zsh и перелогиниться.


chsh -s $(which zsh)

Всё, продолжайте работать как будто ничего не произошло.


Каким должен быть shell prompt


Shell prompt (приглашение командной строки) — это тот маленький текст, который выводится в терминале перед вашей командой. Его нужно настроить под свой характер работы. Воспринимайте его как приборную панель автомобиля. Поместите туда полезную информацию, пусть он будет помогать ориентироваться. Сделайте его удобным, особенно если видите его каждый день!


Shell prompt должен показывать текущий каталог шелла. Если текущий каталог не выводится в shell prompt, вам придётся держать его в голове и периодически проверять командой pwd. Не надо так. Держите в голове более важные вещи и не тратьте время на команду pwd.


Если вы периодически переключаетесь со своего пользователя на рута, вам нужна индикация текущего пользователя. Зачастую важно не конкретное имя пользователя, а его статус (обычный или рут). Проще всего это сделать цветом: красный shell prompt у рута, зелёный у своего пользователя. Так вы ни за что не спутаете рутовый шелл с обычным.


Если вы подключаетесь к серверам по ssh, то вам нужно как-то отличать свой локальный шелл от серверного. Для этого shell prompt должен содержать имя хоста, а ещё лучше — индикатор ssh-соединения.


Shell prompt умеет показывать код возврата последней команды. Напомню, что нулевой код возврата означает, что команда завершилась успешно, ненулевой — команда завершилась неуспешно. Код возврата последней команды можно узнать командой echo $?, но набирать это всё на клавиатуре слишком долго. Пусть лучше shell prompt сообщит, если команда завершилась неуспешно.


Если вы работаете с git-репозиториями, то будет нелишним выводить в shell prompt статус репозитория: текущую ветку и состояние рабочей директории. Так вы сэкономите время на командах git status и git branch и не ошибётесь веткой при коммите.


Кто-то добавляет в свой shell prompt часы или имя виртуального терминала (tty), или какие-то произвольные закорючки. Это всё лишнее. Лучше оставить побольше места для команд.


Мой shell prompt в разных условиях выглядит так:



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


Как это всё реализовать в своём .zshrc? За левый prompt отвечает переменная PROMPT, за правый — RPROMPT. Определить статус пользователя (обычный или рут) поможет переменная EUID, а наличие ssh-соединения — SSH_CLIENT или SSH2_CLIENT. Получаем такую заготовку:


if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
  if [[ $EUID == 0 ]]; then
    PROMPT=...
  else
    PROMPT=...
  fi

else # not SSH
  if [[ $EUID == 0 ]]; then
    PROMPT=...
  else
    PROMPT=...
  fi
fi

Я специально не указываю готовый к копипасту код, потому что конкретная реализация — это дело вкуса. Если же вы не хотите заморачиваться и мой скриншот не вызывает у вас отвращения, можете взять конфиг с гитхаба.


Резюме:


  • Необходимый минимум — это текущий каталог.
  • Рутовый шелл должен быть хорошо заметен.
  • Имя пользователя не несёт полезной нагрузки, если вы всегда сидите под одним пользователем.
  • Хостнэйм полезен, если вы подключаетесь к серверам по SSH. Не обязателен, если всегда работаете на одной машине.
  • Неуспешное завершение последней команды полезно видеть сразу.
  • Статус git-репозитория экономит время на командах git status и git branch и является дополнительной защитой от дурака.

Активное использование истории команд


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


Возможно вы уже умеете копаться в истории сочетанием Ctrl+R. У него есть два существенных недостатка:


  1. Чтобы начать поиск, поле ввода должно быть пустым. Т.е. в случае "начал набирать команду — вспомнил про поиск" придётся стереть начатое, нажать Ctrl+R и повторить ввод. Это очень долго.
  2. Поиск "вперёд" по умолчанию не работает, т.к. Ctrl+S останавливает терминал.

Как работает самый быстрый и удобный поиск:


  1. вы начинаете набирать команду,
  2. вы вспоминаете про поиск,
  3. вы нажимаете хоткей и шелл предлагает команды из истории, которые начинались точно так же.

Например, вы хотите синхронизировать некий локальный каталог с удалённым с помощью rsync. Вы уже делали это пару часов назад и хотите вытащить команду из истории. Набираете rsync, один-два раза нажимате некую комбинацию, и вот заветная команда готова к запуску. Вам не надо предварительно включать режим поиска по истории, shell prompt не меняется на (reverse-i-search)':, ничего никуда не прыгает. Вы просто перебираете команды из истории. Так же, как и стрелочками ↑↓ вы перебираете ранее введённые команды, только с фильтром по началу комады. Это чертовски удобно и экономит уйму времени.


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


В bash и zsh по-умолчанию такой поиск не работает, его надо включить руками. Я настроил PgUp для поиска назад и PgDown для поиска вперёд. Далековато до них тянуться, но я уже привык. Возможно в будущем переназначу на что-нибудь поближе, например Ctrl+P и Ctrl+N.


Для bash надо добавить пару строк в /etc/inputrc или ~/.inputrc:


"\e[5~": history-search-backward
"\e[6~": history-search-forward

Если вы взяли готовый zshrc, то там поиск скорее всего уже назначен на PgUp и PgDown. Если нет, то добавьте в ~/.zshrc


bindkey "^[[5~" history-beginning-search-backward # pg up
bindkey "^[[6~" history-beginning-search-forward  # pg down

Любопытно, что со временем я стал писать команды из расчёта, что позже буду поднимать их из истории. Вот несколько приёмов:


Объединение команд, которые всегда выполняются друг за другом


ip link set eth1 up && dhclient eth1
mkdir /tmp/t && mount /dev/sdb1 /tmp/t

Абсолютные пути вместо относительных позволяют запускать команду, находясь в любом каталоге:
vim ~/.ssh/config вместо vim .ssh/config, systemd-nspawn /home/chroot/stretch вместо systemd-nspawn stretch и т.д.


Подстановка по маске (wildcard) делает команды более универсальными. Обычно использую с chmod и chown.


chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq

Горячие клавиши


Перечислю необходимый минимум.


Alt+. — подставляет последний аргумент предыдущей команды. Также можно набрать последовательность !$.
Ctrl+A, Ctrl+E — переход к началу и концу редактируемой команды соответственно.
Ctrl+U, Ctrl+Y — вырезать всё в буфер обмена, вставить из буфера. Выручает, когда печатаешь сложную команду, а потом понимаешь, что перед ней надо выполнить другую. Хм, куда бы припрятать текущий ввод? Вот сюда и припрятать.
Ctrl+W — стирает одно слово слева от курсора. Если зажать и удерживать, быстро очищает командную строку. По умолчанию текст не удаляется, а помещается в буфер (который для Ctrl+Y).
Ctrl+K — удаляет от курсора и до конца строки. Ctrl+A, Ctrl+K быстро очищает командную строку.
PgUp, PgDown, Ctrl+R — поиск по истории.
Ctrl+L — очистить терминал.


Отзывчивость клавиатуры


Расскажу про маленькую настройку, которая позволяет быстрее скроллить, перемещаться по тексту или стирать. Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы. Что при этом происходит? При нажатии Backspace стирается один символ, затем идёт небольшая задержка, затем срабатывает автоповтор: Backspace убирает символы один за другим, как будто по нему постоянно стучат.


Я рекомендую отрегулировать задержку и частоту работы автоповтора под скорость своих пальцев. Задержка перед срабатыванием автоповтора нужна когда вы хотите удалить только один символ — она даёт вам время отпустить клавишу. Слишком долгая задержка заставляет ждать автоповтора. Не настолько долго, чтобы раздражать, но достаточно, чтобы тормозить перенос мыслей из головы в компьютер. Чем выше частота повтора, тем быстрее стирается текст, и тем сложнее вовремя остановить этот процесс. Суть настройки заключается в поиске золотой середины.


Итак, волшебная команда:


xset r rate 190 20

190 — длительность задержки в миллисекундах,
20 — частота в количестве повторений в секунду.


Я рекомендую начать с этих значений и понемногу уменьшать задержку до появления ложных срабатываний, затем чуть-чуть вернуть назад. Если установить очень короткую задержку, то клавиатурой станет невозможно пользоваться. Придётся перезагружать X-сервер или компьютер целиком. Так что будьте аккуратнее.


Чтобы сохранить параметры, добавьте эту команду куда-нибудь в автостарт иксов.


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


Мне довольно часто приходится запускать долгие процессы: какой-нибудь жирный бэкап, копирование по сети, распаковку/запаковку архивов, сборку пакетов и т.д. Обычно я запускаю такой процесс, переключаюсь на другую задачу и периодически поглядываю не завершился ли мой долгий процесс. Бывает, что я сильно погружаюсь в работу и забываю о нём. Решение — добавить нотификацию завершения процесса, которая выведет меня из транса.


Для этого можно использовать разные средства: notify-send, dzen2, beep, aplay. Все они по-своему хороши, но не работают по ssh. Поэтому я использую terminal beep:


long-running-command; echo $'\a'

В кодировке ASCII есть символ 0x7, именуемый bell. Он предназначен для того, чтобы пищать PC-спикером. PC-спикер — это несовременно, он не везде есть, а ещё его не слышно в наушниках. Поэтому некоторые терминалы применяют так называемый visual bell. Я использую urxvt, и он делает visual bell включением флага urgency. Это когда окно сообщает вам, что оно требует внимания.


Вы можете прямо сейчас проверить как ваш терминал реагирует на символ bell:


sleep 3; echo $'\a'

Три секунды даётся, чтобы вы успели переключиться на другое окно, иначе может не сработать.


К сожалению, visual bell через urgency есть не во всех терминалах. Я проверил самые популярные.


терминал visual bell через urgency
konsole включается в настройках
urxvt есть
xfce4-terminal включается в настройках
xterm нет
cool-retro-term нет
lxterminal нет
gnome-terminal нет

Писать echo $'\a' слишком долго, поэтому я сделал алиас wake.


Алиасы


Команды cp, scp и rm всегда должны работать рекурсивно. Аргумент -r — это просто дурное легаси! У cp ещё можно найти оправдание:


cp * foodir

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


У rm и scp вообще нет оправданий, они просто зануды! Похожая ситуация с ключом -p у команды mkdir. Так что смело добавляем в ~/.zshrc


alias cp='cp -r'
alias scp='scp -r'
alias rm='rm -r'
alias mkdir='mkdir -p'

Ух, как же я раньше без этого жил! Можно пойти ещё дальше и добавить -f у rm, но на свой страх и риск. Я пока себя сдерживаю.


Разные вариации ls вы скорее всего уже используете, ведь это самые популярные алиасы.


alias ls='ls -F --color=auto'
alias la='ls -A --color=auto'
alias ll='ls -l --color=auto -h'
alias lla='ll -A --color=auto -h'

Ну и цветной grep намного приятнее бесцветного:


alias grep='grep --colour=auto'

Не забывайте, что алиасы не работают в скриптах! Там надо указывать все ключи.


Слепой метод печати


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


Осваивать слепой метод печати лучше всего на каникулах или в отпуске, когда вас никто не торопит. В процессе обучения ни в коем случае нельзя спешить. Ваша задача — запомнить где какая буква находится. Причём не столько мозгом, сколько мышцами. Лучше набирать медленно, но без ошибок, чем быстро с ошибками. Помните: мастера добиваются высоких скоростей не за счёт быстрых пальцев, а потому что не делают ошибок.


Не стоит поначалу увлекаться клавогонками. Психологически тяжело оставаться хладнокровным во время соревнований. Учитесь на тренажёрах. Хорошо, когда тренажёр предлагает слова, которые можно мысленно произнести. Я учился на онлайн-тренажёрах vse10 и typingstudy. Известный тренажёр "Соло на клавиатуре" мне показался бестолковым.


Начинать стоит с центрального ряда "фывапролджэ". Только после того, как вы запомните где какая клавиша расположена, стоит двигаться дальше. Только после этого.


Делайте перерывы. Давайте отдых мозгу и пальцам. Чувствуете, что посыпались ошибки — пора делать перерыв.


Сначала я освоил слепой метод печати на русском языке и прифигел от ускорения. Сейчас совершенствую навык в английской раскладке.

Поделиться публикацией

Похожие публикации

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

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

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

              Вообще-то в 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
                0
                Вот это вы раскопали! Круто!
                  +1
                  Эта фича должна быть во всех современных мессенджерах :)
              +1
              Я проще делаю: в конце введенной команды ставим обратный слеш, Enter, Ctrl+C. После этого все осядет в истории.
              +1

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


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

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

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

                  но как же стрелочки! /s

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

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

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

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

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

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

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


                          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

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

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

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

                                    mvn clean install — это архаизм
                                    У mvn verify перед ним сплошные плюсы: набирать короче, работает быстрее, локальный репозиторий SNAPSHOT-ами почём зря не забивает


                                    Ещё про Maven: https://habr.com/company/jugru/blog/424505/

                                      0

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


                                      PS: Для zsh нужно использовать не history, а history -- $[-2**31]; вместо $[-2**31] нужно использовать отрицательное число по модулю не менее длины истории (но влезающее в (?)int поскольку наименьшее число на моей 64‐битной системе — $[2**63], только его использование вызывает ошибку как если бы я использовал положительное число). (Обычно можно просто написать history -- -10000000 и не парится.) Просто history по‐умолчанию выдаст только последние несколько команд (у меня 16).

                                        0
                                        к трём из которых в zsh уже есть алиасы о которых я не знал:
                                        ll -> l

                                        В zsh по-умолчанию:
                                        ll -> ls -l
                                        l -> ls -la
                                        
                                          +1

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

                                            0

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

                                        +1
                                        Для удобного поиска по истории команд, файлам и директориям(и перехода по ним), можно использовать 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'
                                        
                                        
                                          +1
                                          Да, FZF среди всех улучшателей консоли можно поставить на первое место.
                                          Гифка для привлечения внимания:
                                          image
                                          0
                                          Давным-давно был рабочий метод ускорения печати на клавиатуре — реалтайм игры в MUD'ы, особенно PVP. Потом телнет-клиенты стали продвинутыми, и игра превратилась в «нажми кнопку — пошли целую команду», и метод себя изжил. Но было интересно, а ещё было потрясающее по мощности подкрепление успехам и неудачам — пронимало почти любого, кто в это играл.
                                            +3
                                            Интересная статья, но позволю себе споры и комментарии в нескольких участках:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

                                              Насколько часто это нужно In real life?

                                              Хороший вопрос. Пожалуй, это зависит от специфики работы. Скрипт на bash может молча остановиться, если по ходу выполнения возникла ошибка. Без кода возврата вы не поймёте по какой причине он остановился.

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

                                              Ценное замечание, спасибо!
                                                0
                                                А если так:
                                                /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 или подобное
                                                  0
                                                  Простите, я не совсем понял какую задачу вы решаете. Вы хотите сказать, что в моей конструкции

                                                  long-running-command; echo $'\a'

                                                  не будет грустного смайлика, если long-running-command завершится неудачно? Действительно, это упущение.
                                                    +1

                                                    Кстати, а почему «грустный смайлик», а не собственно код? Код завершения иногда предоставляет дополнительные данные: во‐первых, у некоторых программ они задокументированы. Во‐вторых, при завершении по (необработанному) сигналу код будет иметь определённое значение.


                                                    В‐третьих, если только последняя команда из цепочки вида a | b | c завершилась с ошибкой, то код завершения будет ненулевым. Нужно показывать $pipestatus (весь, если хотя бы одна программа завершилась с ошибкой), но пачка смайликов будет выглядеть как‐то странно.

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                                            Тогда уж doas. Автор sudo Todd C. Miller не возражал, когда его детище выпилили из системы три года назад. Пришедший ему на смену doas существенно легковесней и проще в настройках.
                                                            +5
                                                            Команды cp, scp и rm всегда должны работать рекурсивно. Аргумент -r — это просто дурное легаси!

                                                            Обычно подобное мнение несколько меняется когда грохнешь важное и сильно вложенное.
                                                              0
                                                              А каким образом от ошибки спасает именно ключ -r? Вы любите делать rm *, чтобы удалить файлы в каталоге, который содержит подкаталоги?

                                                                0
                                                                Да, удаление по маске, удаление каталога в котором оказался другой вложенный и тд…
                                                                  0
                                                                  удаление каталога в котором оказался другой вложенный

                                                                  Без -r у вас не получится это сделать.

                                                                  и тд…

                                                                  Какое именно? :)

                                                                  По-моему безопаснее считать, что rm относится к каталогам так же, как и к файлам. Поэтому я не стану делать rm *, чтобы удалить все файлы, но оставить каталоги. Если файлов настолько много, что перечислять их замучаешься, то я поступлю одним из следующих способов:

                                                                  for i in *; do test -f $i && rm $i; done
                                                                  find -maxdepth 1 -type f -delete
                                                                  \rm *
                                                                    0
                                                                    Без -r у вас не получится это сделать.

                                                                    О чем и речь. Предлагается же сделать такое поведение по умолчанию.
                                                                    По-моему безопаснее считать, что rm относится к каталогам так же, как и к файлам.

                                                                    Кто спорит. Просто удаляют рекурсивно нужное обычно не от зловещих замыслов а от глупых ошибок.
                                                                    Поэтому, на мой взгляд, не стоит команде без параметров давать больше возможностей деструкции.
                                                                      0
                                                                      И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.
                                                                        0
                                                                        И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.

                                                                        О чем и речь. Для того что бы удалить каталог нужно параметр указать явно.
                                                                        А вы предлагаете такое по умолчанию.
                                                                        ЗЫ Кроме -r есть еще -d. Но это так, просто к слову.
                                                                          +1

                                                                          Так уж вышло, что я часто удаляю симлинки на директории (ещё и от рута), а rm -r спокойно удаляет все файлы и только потом пишет что не может удалить сам симлинк. Ситуации бывают разные и я рад, что перестал пользоваться такими алиасами.

                                                                        +1
                                                                        Когда в конторе 100500 человек и 100500 машин, которые нынче одноразовые AMI и контейнеры, любые алиасы отпадают, и особенно изменение дефолтного поведения rm
                                                                          0

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


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

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

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

                                                                                0

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

                                                                    +1
                                                                    Сижу в oh-my-zsh, мне нравится github.com/robbyrussell/oh-my-zsh
                                                                      0

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


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

                                                                        0
                                                                        Без упоминания Antigen и Oh-my-zsh статья не полная.
                                                                        Так же ленивым любителям готового «изкаробки» — советую заглянуть в CI к камраду Станиславу Попову, который сделал готовый вариант установки ZSH + Antigen + Плагины с помощью Ansible. Удобнейшая штука получилась — указал список хостов в плейбуке и получил рабочее окружение в консоли со всеми своими плагинами и алиасами. Меня часто выручает при деплое виртуалок и новых серверов.
                                                                          0
                                                                          Примерная структура организации, в моем понимании, быстрой системы, которая прошла проверку временем:
                                                                          Обязательное умение слепого набора на клавиатуре. Тайлинговый оконный менеджер (в моем случае тоже 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. Перекладываем всю рутину на мышечную память пальцев. После этого действительно чувствуешь настоящую свободу работы на компьютере. Со временем мысленная концентрация только над текущей задачей, а пальцы помимо твоего сознания делают свою работу.
                                                                            0

                                                                            Про бинды звучит разумно, но как использовать те же привязки в программах? У меня большая часть команд по управлению wm повешена на super именно поэтому.

                                                                              0
                                                                              Да, встречаются и конфликты, а порой курьезы. Например во время актуальности федора25 повесили на правую Alt модификатор помойму для вывода знака рубля. Я тогда тайлинг накатывала «поверх» гнома
                                                                              0
                                                                              s/evince/zathura/ :)
                                                                                +1
                                                                                Много программ имеют в настройках управление в стиле vim в явной форме или возможность конфигурирования. На мой взгляд засура не только имеет управление в стиле вим но ближе к туи программам с дополнительным набором нативных команд, таких как mocp, newsbeuter, tig но в данном случае я не об этом, а о необходимости держать руки на стартовой позиции клавиатуры и без лишних движений иметь возможность как перемещаться по окнам, рабочим столам так и иметь такой же функционал находясь в окне программы. Выражаясь термином скорости работы алгоритмов, хотелось бы иметь доступ к любому API равный постоянному времени O(1).
                                                                                0
                                                                                В bashrc опция set -o vim

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


                                                                                Что вы имеете ввиду?
                                                                                  0
                                                                                  Дико извиняюсь set -o vi
                                                                                +1
                                                                                вы открываете терминал на уровне рефлексов

                                                                                Поэтому только Ctrl-~ и терминал выезжает сверху как консоль в первой Кваке

                                                                                  0
                                                                                  Недавно перевёл вызов терминала на F1 — ещё удобней
                                                                                  +1
                                                                                  Ctrl+W — стирает не слово, а до разделителя по-умолчанию, который обычно пробел.
                                                                                  $ some words /on/the/screen -> $ some words
                                                                                  Чтобы стереть одно слово используется комбинация Alt+Backspace
                                                                                  $ some words /on/the/screen -> $ some words /on/the/
                                                                                    +2
                                                                                    По поводу shell prompt — очень удобно, на мой взлгяд, иметь перенос строки после него, всегда больше места для команды + при копипасте можно не париться о промпте.
                                                                                      +2
                                                                                      Если вы работаете с git-репозиториями, то будет нелишним выводить в shell prompt статус репозитория: текущую ветку и состояние рабочей директории. Так вы сэкономите время на командах git status и git branch и не ошибётесь веткой при коммите.

                                                                                      Это весьма спорно. Вы конечно сэкономите время на git status, зато получите постоянные подлагивания на все остальные команды — требуется обойти все директории вверх на предмет наличия .git и прочитать текущий статус, прежде чем вывести prompt. Особенно это неприятно при работе на примонтированных сетевых ресурсах.

                                                                                        0

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

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

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

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

                                                                                          Мне не приходилось работать с git-репозиториями на примонтированных сетевых ресурсах, возможно там действительно всё плохо.
                                                                                            0
                                                                                            отвечу вам и powerman
                                                                                            Для того, чтобы определить, находится ли текущая директория (скажем это пусть будет
                                                                                            /external/netresource1/q/w/e/r/t/y
                                                                                            под гитом, надо пройти все директории вверх до / и проверить — нет ли директории
                                                                                            /external/netresource1/q/w/e/r/t/.git, затем /external/netresource1/q/w/e/r/.git
                                                                                            и так далее. Даже если никакого гита там и в помине нет. И если сетка подлагивает, то это сильно раздражает. Вы делаете cd -, пальцы уже автоматом вбили следующую команду, а на экране ее нет. Лично меня бесит неимоверно. Проще git status набрать. Ради справедливости, я делаю не больше десятка коммитов в день.
                                                                                              0

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

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

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

                                                                                          +1

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

                                                                                            0
                                                                                            Мне тоже интересно.
                                                                                              +1

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


                                                                                              [[ "$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'
                                                                                                0
                                                                                                так выше ведь уже ответили на это )
                                                                                            +1
                                                                                            Если честно, то вывод полного пути в консоли неудобен, ну лично для меня. Т.к. часто оказываешься в каких-то местах и путь занимет всю строку. Например, я сейчас работаю в директории:
                                                                                            /vz/pva/agent/tmp/vzl.40500.4.xxxxxxxx-2f7a-744e-xxxx-xxxxxxxxxxxx.xxxxxxxx-2f7a-xxxx-b359-xxxxxxxxxxxx.oj4cj1apaaaaqay2izvadlyxxxxxxxxx/local-data/
                                                                                            и если бы это херь отображаась бы у меня постоянно в пути — это было бы дико неудобно. Уж лучше несколько раз освежить память и набрать pwd
                                                                                              0

                                                                                              Обычно путь сокращают, посмотрите как это сделано в fish, например.

                                                                                                0

                                                                                                В zsh тоже есть:


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

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


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


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

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

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

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

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

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


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

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

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

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

                                                                                                        0
                                                                                                        Не знаете, как отключить это поведение при открытии терминала?
                                                                                                          0

                                                                                                          В zsh выводимое значение задаётся в $PROMPT_EOL_MARK. Думаю, если установить её в пустую строку или перевод строки — сработает как отключение фичи.

                                                                                                            0

                                                                                                            Документация на $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 на предмет «зачем и откуда» может оказаться кошмаром. Но тут должно быть возможно отключение плагинов блоками до того момента, как процент при запуске не перестанет показываться.
                                                                                                      +1
                                                                                                      Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы.
                                                                                                      — лично я зажимаю Ctrl+Shift+Left если хочу удалить несколько предыдущих слов или Shift+Home если хочу удалить полностью строку, а потом уже Backspace. Удалять посимвольно Backspace-ом давно перестал.
                                                                                                        0
                                                                                                        На примере Backspace я объяснял задержку и частоту автоповтора. Эти два значения влияют на всю клавиатуру, а не только на Backspace. Неужели вы никогда не используете автоповтор? Может быть хотя бы стрелочки ↑↓ для скролла?
                                                                                                        0
                                                                                                        Если кто-то проникся статьёй, но с баша на 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' # регулярно сохранять историю

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

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

                                                                                                            0

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

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

                                                                                                            Самое читаемое