В сети можно встретить много советов по эффективной работе в консоли. В большинстве таких статей авторы рассказывают про банальности типа "выучите горячие клавиши" или "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)':, ничего никуда не прыгает. Вы просто перебираете команды из истории. Так же, как и стрелочками ^v вы перебираете ранее введённые команды, только с фильтром по началу комады. Это чертовски удобно и экономит уйму времени.


В оболочках 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. Известный тренажёр "Соло на клавиатуре" мне показался бестолковым.


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


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


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

Комментарии (109)


  1. inkvizitor68sl
    02.10.2018 18:49
    +1

    > Хм, куда бы припрятать текущий ввод? Вот сюда и припрятать.
    alt+shift+3


    1. laurvas Автор
      02.10.2018 20:00

      Поясните пожалуйста в чём прикол.


      1. inkvizitor68sl
        02.10.2018 20:06

        Это «краткий алиас» для последовательности из ctrl-a, #, ctrl-e, ctrl-o. Сохраняет закомментированную строку в history.


        1. laurvas Автор
          02.10.2018 20:25

          Хм, не знал о таком. Ваш способ требует больше телодвижений для запуска: надо поднять команду из истории, перейти в начало строки, убрать начальный #. Но зато припрятанное точно не потеряется.


          1. inkvizitor68sl
            02.10.2018 20:31

            Ну в вашем способе буфер потрется при использовании ctrl-w, а это очень вероятно =)

            А вообще можно ещё использовать ctrl+/ (undo в emacs-mode readline).


          1. ynikitenko
            03.10.2018 21:46

            Поднять команду из истории легко Ctrl-p. Запустить её можно Ctrl-m.


        1. powerman
          04.10.2018 02:44

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


          1. laurvas Автор
            04.10.2018 10:46

            Вот это вы раскопали! Круто!


          1. nlykl
            04.10.2018 13:01
            +1

            Эта фича должна быть во всех современных мессенджерах :)


    1. Pinkerton42
      03.10.2018 08:33

      Я проще делаю: в конце введенной команды ставим обратный слеш, Enter, Ctrl+C. После этого все осядет в истории.


  1. farcaller
    02.10.2018 18:51

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


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

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


    1. laurvas Автор
      02.10.2018 19:01

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


      1. farcaller
        02.10.2018 19:26

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


        1. laurvas Автор
          02.10.2018 19:46

          Разумеется, можно переопределить стрелочки, если очень хочется.
          Для 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


          1. gitKroz
            03.10.2018 09:11

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

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


  1. Gritsuk
    02.10.2018 19:06

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


  1. kt97679
    02.10.2018 19:39

    Стоит упомянуть менеджеры консольных сессий: screen, tmux, byobu. Перегружать информацией PROMPT не стоит, гораздо удобнее использовать статусную строку менеджера сессий.


    1. savostin
      02.10.2018 19:42

      Да, кстати, как вы в Zsh без screen работаете?
      * пардон, промахнулся, это автору.


      1. laurvas Автор
        02.10.2018 19:57

        Эмм… А в чём подвох? Я использую screen исключительно как замену nohup, а тайлинг обеспечивается оконным менеджером i3. Мне не лень открыть ещё один терминал (вы уже знаете что это быстро) и повторно подключиться к серверу по ssh, если возникла такая необходимость.


        1. savostin
          02.10.2018 20:02

          У меня zsh под screen не работает никак.
          Mac + iTerm -> ssh на Ubuntu -> zsh + screen
          Похоже где-то screen меняет $TERM принудительно…
          Без screen все отлично…


          1. laurvas Автор
            02.10.2018 20:33

            Неплохо бы проверить каждое звено этой цепи, чтобы найти виновника.

            1. Попробовать другой терминал или Linux вместо Mac.
            2. Попробовать на другом сервере.
            3. Попробовать запустить bash под screen вместо zsh (screen bash).
            4. Попробовать другой zshrc, например по ссылке из статьи.


    1. laurvas Автор
      02.10.2018 19:52

      Скриншот покажете? Согласен, PROMPT не стоит перегружать. В каком именно ключе стоит упомянуть менеджеры консольных сессий? Я много о чём не написал :)


      1. kt97679
        02.10.2018 20:30

        Вот хорошая статья на эту тему и со скриншотом: hackernoon.com/customizing-tmux-b3d2a5050207

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


  1. Amomum
    02.10.2018 20:20
    +1

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


    1. laurvas Автор
      02.10.2018 20:25

      К сожалению я о таком не знаю.


    1. rotor
      02.10.2018 20:36
      +4

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


      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

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


      1. Amomum
        02.10.2018 20:49

        Вот это я понимаю linux-way! Спасибо!


      1. Daemonic
        03.10.2018 17:26

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


    1. ainoneko
      02.10.2018 21:34

      xneur?
      (Когда я его пробовал в последний раз, он был глючным: что-то автоматически переключал даже когда это было явно запрещено в настройках — но это было давно.)


    1. DS2
      03.10.2018 05:13

      gxneur


  1. streetturtle
    02.10.2018 21:50
    +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 -> ~


    1. sabio
      03.10.2018 00:03

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


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


    1. ZyXI
      03.10.2018 01:27

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


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


    1. kost
      03.10.2018 07:35

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

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


      1. ZyXI
        03.10.2018 11:41

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


        1. streetturtle
          04.10.2018 16:53

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


  1. Zenker
    03.10.2018 03:53

    Для удобного поиска по истории команд, файлам и директориям(и перехода по ним), можно использовать 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. nlykl
      03.10.2018 15:08

      Да, FZF среди всех улучшателей консоли можно поставить на первое место.
      Гифка для привлечения внимания:
      image


  1. vesper-bot
    03.10.2018 07:26

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


  1. Germanjon
    03.10.2018 07:45

    Интересная статья, но позволю себе споры и комментарии в нескольких участках:

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

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

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

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

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

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

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

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


    1. laurvas Автор
      03.10.2018 10:00
      +1

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

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

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

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

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

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


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

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

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

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

      Ценное замечание, спасибо!


      1. AgentSIB
        03.10.2018 11:22

        А если так:
        /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 или подобное


        1. laurvas Автор
          03.10.2018 11:33

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

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

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


          1. ZyXI
            03.10.2018 11:53
            +1

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


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


            1. laurvas Автор
              03.10.2018 12:12

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

              В дефолтном конфиге Archlinux код возврата показывается цифрами, если он не нулевой.


          1. AgentSIB
            03.10.2018 11:57

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



            ./test.sh ; wake 'My Test Command'; echo $?
            3
            


            1. laurvas Автор
              03.10.2018 12:06
              +1

              Красиво! Могу только предложить переписать wake как обёртку, чтобы запускать
              wake ./test.sh

              Имя команды, которая завершилась, он может определить сам как $(basename $1).


      1. Germanjon
        03.10.2018 13:01

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

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

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

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

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

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


      1. Magn
        03.10.2018 13:53

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


      1. sasha1024
        03.10.2018 17:13

        Что подразумевается под «сидеть под рутом»?


        1. laurvas Автор
          03.10.2018 21:54

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

          Я не имел в виду запускать от рута X-сессию и всё остальное.


          1. sasha1024
            04.10.2018 10:43

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


            1. powerman
              04.10.2018 13:38

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


      1. shoorick
        03.10.2018 22:45

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

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


      1. artemisia_borealis
        03.10.2018 22:51
        +1

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

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

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

        А на локалхосте тоже по-моему ничего зазорного в root'е нет.


        1. Germanjon
          04.10.2018 07:20

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

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

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


          1. laurvas Автор
            04.10.2018 10:49

            Вот это сильно!


    1. artemisia_borealis
      03.10.2018 22:31
      +2

      Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).

      Тогда уж doas. Автор sudo Todd C. Miller не возражал, когда его детище выпилили из системы три года назад. Пришедший ему на смену doas существенно легковесней и проще в настройках.


  1. 9660
    03.10.2018 08:19
    +3

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

    Обычно подобное мнение несколько меняется когда грохнешь важное и сильно вложенное.


    1. laurvas Автор
      03.10.2018 10:03

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


      1. 9660
        03.10.2018 10:06

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


        1. laurvas Автор
          03.10.2018 10:29

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

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

          и тд…

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

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

          for i in *; do test -f $i && rm $i; done
          find -maxdepth 1 -type f -delete
          \rm *


          1. 9660
            03.10.2018 11:52

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

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

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


            1. laurvas Автор
              05.10.2018 10:28

              И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.


              1. 9660
                05.10.2018 10:59

                И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.

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


              1. Sirikid
                05.10.2018 11:44
                +1

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


          1. Argentalas
            03.10.2018 21:54
            +1

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


            1. Crystal_HMR
              04.10.2018 09:19

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


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


              1. Argentalas
                04.10.2018 13:39

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


              1. powerman
                04.10.2018 13:46

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


                1. legolegs
                  04.10.2018 14:25

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


  1. bockor
    03.10.2018 09:38

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


  1. rkh
    03.10.2018 10:03

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


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


  1. miffo
    03.10.2018 10:07

    Без упоминания Antigen и Oh-my-zsh статья не полная.
    Так же ленивым любителям готового «изкаробки» — советую заглянуть в CI к камраду Станиславу Попову, который сделал готовый вариант установки ZSH + Antigen + Плагины с помощью Ansible. Удобнейшая штука получилась — указал список хостов в плейбуке и получил рабочее окружение в консоли со всеми своими плагинами и алиасами. Меня часто выручает при деплое виртуалок и новых серверов.


  1. ne_zabudka
    03.10.2018 11:47

    Примерная структура организации, в моем понимании, быстрой системы, которая прошла проверку временем:
    Обязательное умение слепого набора на клавиатуре. Тайлинговый оконный менеджер (в моем случае тоже 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. Перекладываем всю рутину на мышечную память пальцев. После этого действительно чувствуешь настоящую свободу работы на компьютере. Со временем мысленная концентрация только над текущей задачей, а пальцы помимо твоего сознания делают свою работу.


    1. Sirikid
      03.10.2018 12:12

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


      1. ne_zabudka
        03.10.2018 14:02

        Да, встречаются и конфликты, а порой курьезы. Например во время актуальности федора25 повесили на правую Alt модификатор помойму для вывода знака рубля. Я тогда тайлинг накатывала поверх гнома


    1. Cheater
      03.10.2018 13:10

      s/evince/zathura/ :)


      1. ne_zabudka
        03.10.2018 14:40

        Много программ имеют в настройках управление в стиле vim в явной форме или возможность конфигурирования. На мой взгляд засура не только имеет управление в стиле вим но ближе к туи программам с дополнительным набором нативных команд, таких как mocp, newsbeuter, tig но в данном случае я не об этом, а о необходимости держать руки на стартовой позиции клавиатуры и без лишних движений иметь возможность как перемещаться по окнам, рабочим столам так и иметь такой же функционал находясь в окне программы. Выражаясь термином скорости работы алгоритмов, хотелось бы иметь доступ к любому API равный постоянному времени O(1).


    1. yar0Sl0ve
      03.10.2018 21:55

      В bashrc опция set -o vim

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


      Что вы имеете ввиду?


      1. ne_zabudka
        03.10.2018 22:38

        Дико извиняюсь set -o vi


  1. konchok
    03.10.2018 14:21

    вы открываете терминал на уровне рефлексов

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


    1. Zraza
      05.10.2018 10:13

      Недавно перевёл вызов терминала на F1 — ещё удобней


  1. bykvaadm
    03.10.2018 15:18

    Ctrl+W — стирает не слово, а до разделителя по-умолчанию, который обычно пробел.
    $ some words /on/the/screen -> $ some words
    Чтобы стереть одно слово используется комбинация Alt+Backspace
    $ some words /on/the/screen -> $ some words /on/the/


  1. punkkk
    03.10.2018 15:20
    +1

    По поводу shell prompt — очень удобно, на мой взлгяд, иметь перенос строки после него, всегда больше места для команды + при копипасте можно не париться о промпте.


  1. balexa
    03.10.2018 15:28

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

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


    1. powerman
      04.10.2018 04:12

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


    1. laurvas Автор
      05.10.2018 10:47

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

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

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

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


  1. ctacka
    03.10.2018 17:12

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


    1. sasha1024
      03.10.2018 17:14

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


      1. kt97679
        03.10.2018 20:10
        +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'


      1. vovafit161
        03.10.2018 21:56

        так выше ведь уже ответили на это )


        1. sasha1024
          04.10.2018 10:46

          Где?


  1. susnake
    03.10.2018 17:12

    Если честно, то вывод полного пути в консоли неудобен, ну лично для меня. Т.к. часто оказываешься в каких-то местах и путь занимет всю строку. Например, я сейчас работаю в директории:
    /vz/pva/agent/tmp/vzl.40500.4.xxxxxxxx-2f7a-744e-xxxx-xxxxxxxxxxxx.xxxxxxxx-2f7a-xxxx-b359-xxxxxxxxxxxx.oj4cj1apaaaaqay2izvadlyxxxxxxxxx/local-data/
    и если бы это херь отображаась бы у меня постоянно в пути — это было бы дико неудобно. Уж лучше несколько раз освежить память и набрать pwd


    1. Sirikid
      04.10.2018 03:41

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


      1. powerman
        04.10.2018 04:16

        В zsh тоже есть:


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


    1. ivlad
      04.10.2018 06:31

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


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


      PS1='%(?..[%{^[[31m%}%B%?%{^[[0m%}%b])%(#.%{^[[1;31m%}.%{^[[32m%})%n%{^[[0m%}@%m %B%25<..<%~%b %h%# '


  1. edo1h
    03.10.2018 19:16

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

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

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


    1. powerman
      04.10.2018 04:26

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


  1. Paran01d
    03.10.2018 21:57
    +1

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


    1. Crystal_HMR
      04.10.2018 09:09

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


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


  1. FTOH
    03.10.2018 21:57

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

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


    1. ZyXI
      04.10.2018 03:54

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


      1. FTOH
        04.10.2018 17:12

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


        1. powerman
          05.10.2018 02:28

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


  1. Vitos85
    03.10.2018 21:57
    +1

    Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы.
    — лично я зажимаю Ctrl+Shift+Left если хочу удалить несколько предыдущих слов или Shift+Home если хочу удалить полностью строку, а потом уже Backspace. Удалять посимвольно Backspace-ом давно перестал.


    1. laurvas Автор
      05.10.2018 10:13

      На примере Backspace я объяснял задержку и частоту автоповтора. Эти два значения влияют на всю клавиатуру, а не только на Backspace. Неужели вы никогда не используете автоповтор? Может быть хотя бы стрелочки ^v для скролла?


  1. legolegs
    03.10.2018 23:56

    Если кто-то проникся статьёй, но с баша на zsh перелезать не готов, то предлагаю свой PROMPT c путём и кодом возврата, но на двух строках, чтобы длинные пути не мешали набирать команды. Выглядит так (только малость по-попугайски расцвечен):
    -[legolegs@host ~/path] :)
    L>

    код для ~/.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\]L\[\e[0m\]\[\e[36m\]\[\e[0m\]\[\e[34;1m\]>\[\e[0m\] '


  1. ivlad
    04.10.2018 05:58

    Пусть лучше shell prompt сообщит, если команда завершилась неуспешно.

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