Вksh93
:
PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _
PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _
Если вы хотите, чтобы он также заменял $HOME
на ~
, нужно что-то более противное:
PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _
PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _
Все это также должно работать в bash
, хотя bash
имеет свои собственные побеги (, например. \h
для${HOSTNAME%%.*}
)и механизм сокращения пути (дляPROMPT_DIRTRIM
).
Кроме того, более неприятный вариант будет действительно неприятным, потому что bash
, в отличие от ksh93
, будет fork()
отдельным процессом для каждой $(...; printf...)
подстановки команд, даже если он содержит только встроенные команды. Это также верно для производных оболочек pdksh
, таких как mksh
.
zsh
имеет быстрые побеги, очень похожие, но не идентичныеtcsh
:
zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _
Примечание:
Переменная $HOSTNAME
не установлена по умолчанию в ksh93
; вместо этого вы можете использовать встроенный uname
(после включения его с помощью PATH=/opt/ast/bin:$PATH
; путь /opt/ast/bin
может не существовать):
PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
В отличие от escape-последовательности \h
в bash или escape-последовательности %m
в zsh
или tcsh
, этот будет отслеживать изменения имени хоста.
Для клавиш, которые обычно отправляют один символ, Alt+клавиша обычно отправляет escape-символ, за которым следует этот символ. В частности, Alt + Backspace отправляет \e\177
, где \e
— escape-символ (, визуально представленный как ^[
), а \177
— символ возврата (. визуально представлено как ^?
— точнее, это символ удаления, но в этом ответе я буду использовать название «возврат» ). (В зависимости от вашей конфигурации символ возврата может быть вместо \b
, визуально представленным как ^H
.)
При нажатии Ctrl + VAlt + Backspace символ Ctrl+V сообщает терминалу (или приложению, в зависимости в терминальном режиме )для буквальной интерпретации следующего символа, поэтому вставляется escape-символ, который визуально представлен как ^[
.Затем терминалу нужно прочитать еще один символ — клавишу возврата, которая стирает только что введенный escape-символ.
Чтобы увидеть полную строку символов, отправленную клавишей, вы можете использовать эту команду и ввести клавишу в течение 2 секунд:
stty raw; sleep 2; echo; stty cooked
stty raw
переключает терминал в необработанный режим, в котором управляющие символы просто вставляются, как -, а stty cooked
переключает его обратно. На практике Alt + Backspace — один из очень немногих случаев, когда это необходимо, хотя :большинство клавишных аккордов отправляют только один управляющий символ или escape-символ, за которым следует печатаемый персонажи.
В .inputrc
, чтобы охватить оба распространенных случая (с символом удаления или возврата):
"\e\177": backward-kill-word
"\e\b": backward-kill-word
Обратите внимание, что управляющая последовательность зависит от вашего терминала. Некоторые терминалы не отправляют escape-последовательность для некоторых клавишных аккордов или отправляют нестандартные escape-последовательности -, возможно, одинаковые для нескольких клавишных аккордов. Но если вы на короткое время видите ^[
при нажатии Ctrl + VAlt + Backspace , это показывает, что ваш терминал делает стандартную вещь для этого определенный ключевой аккорд.