Обычный верхний
также может отображать последний использованный ЦП.
Вы должны нажать f
при просмотре главного экрана, чтобы войти в экран управления полями, стрелку вниз к P = Последний использованный ЦП (SMP)
и включить его с помощью ] d
или пробел. Нажмите q
или выйдите, чтобы вернуться на главный экран.
Вы можете переместить столбец P вверх на экране управления полями, если вам не нравится столбец P в крайнем правом углу вывода.
Ваш терминал отправляет ту же escape-последовательность для Ctrl + Shift + Backspace , что и для Ctrl + Backspace . ], поэтому zsh не может их различить. Единственное решение — настроить терминал на отправку различных escape-последовательностей. Не все терминалы позволяют это.
Некоторые терминалы, такие как xterm, rxvt, iTerm2 и Emacs term, позволяют вручную настраивать escape-последовательности для каждой комбинации клавиш. Обратитесь к документации вашего терминала.
Например, для xterm вы можете поместить приведенный ниже фрагмент в свой .Xresources
. Загрузите его с помощью xrdb -merge ~/.Xresources
. Многие среды загружают это при входе в систему; если у вас нет, добавьте эту команду в файл запуска X11.
XTerm.VT100.translations: #override \
Ctrl Shift <Key>BackSpace: string("\033[27;6;8~") \n
Затем вы можете использовать эту управляющую последовательность¹:
bindkey -M emacs '^[[27;6;8~' backward-kill-word
С терминалами на базе vte , включая терминал Gnome -, Guake и Terminator, вам не повезло. У них нет возможности настроить привязки клавиш. Тем не менее, они могут захотеть добавить специальную поддержку для определенного ключа .
¹ Я выбрал эту последовательность для совместимости с режимом modifyOtherKeys
xterm . Обычно я рекомендую включать modifyOtherKeys
, что в основном обратно совместимо, но конкретный ключевой аккорд, который вы хотите, включается только на уровне 2, с которым трудно справиться с (, например. Ctrl+буква не отправляет соответствующий управляющий символ ).
С эмуляторами терминала X11, где Ctrl+Shift+Backspace отправляет то же самое, что и Backspace и не дает возможности изменить его (, и если вы В отчаянии ), как грязный хак, вы можете перехватить связь между эмулятором терминала и X-сервером и, например, заменить Backspace(код клавиши 22 )на F12(код клавиши 96. )в сообщении о событии X11, отправляемом эмулятору терминала при нажатии Backspace при удерживаемых Shift и Ctrl .
Между прочим, zsh
делает это относительно легко, так как имеет встроенный домен Unix и API сокетов TCP. Запустите приведенный ниже скрипт как:
that-script guake
И добавь к своему~/.zshrc
if [ -n "$WRAPPED_DISPLAY" ]; then
export DISPLAY="$WRAPPED_DISPLAY"
unset DISPLAY
fi
(, чтобы другие приложения, запущенные в этом терминале, не проходили через эту оболочку ).
И связать:
bindkey -M emacs '^[[24;6~' backward-kill-word
, где \e[24;6~
— последовательность, отправляемая при нажатии Ctrl+Shift+F12 в VTE и не менее xterm
.
#! /bin/zsh -
die() {
(($# == 0)) || print -ru2 -- "$@"
exit 1
}
case $DISPLAY in
(:<->(.<->|))
mode=unix;;
((localhost|127.0.0.1|"[::1]"):<->(.<->|))
mode=tcp
zmodload zsh/net/tcp || die;;
(*)
die "Unsupported display: $DISPLAY";;
esac
conn=${DISPLAY##*:}
port=${conn%%.*}
screennumber=${conn#$port}
(($# > 0)) || argv=(gnome-terminal --wait)
unset -v listen_fd
typeset -A clients
tcp_connect() ztcp -v localhost $((port + 6000))
unix_connect() zsocket /tmp/.X11-unix/X$port
zmodload zsh/net/socket || die
zmodload zsh/system || die
zmodload zsh/zselect || die
new_port=20
until
new_socket_path=/tmp/.X11-unix/X$new_port
zsocket -l $new_socket_path 2> /dev/null
do
((new_port++))
done
listen_fd=$REPLY
unset -v pid
trap '
kill "$pid" 2> /dev/null
wait "$pid"; ret=$?
rm -f $new_socket_path
exit "$ret"' EXIT INT TERM HUP
{
coproc {
export WRAPPED_DISPLAY=$DISPLAY DISPLAY=:$new_port$screennumber
xauth list "$WRAPPED_DISPLAY" |
awk '{$1 = "add " ENVIRON["DISPLAY"];print}' |
xauth -q -
"$@" <&3 3>&1 >&4 4>&- {listen_fd}<&-
}
} 3<&0 4>&1
pid=$!
exec {child_monitor}<&p
coproc :
LC_ALL=C
set -o extendedglob
tear() {
exec {1}>&- {2}>&-
unset "clients[$1]"
}
typeset -A ready
while zselect -A ready -r $listen_fd $child_monitor ${(kv)clients}; do
[[ $ready[$child_monitor] ]] && exit
if [[ $ready[$listen_fd] ]]; then
zsocket -a $listen_fd || die
fd=$REPLY
${mode}_connect || die
clients[$fd]=$REPLY
fi
for client server (${(kv)clients}) {
for from fdin fdout (
client $client $server
server $server $client
) if [[ $ready[$fdin] ]]; then
if sysread -s 65536 -i $fdin buf; then
if [[ $from = server ]]; then
if [[ $buf[1,2] = $'\x23\x83' ]]; then
offsets=(9 17 73) # Generic XInputExtension Event
else
offsets=(1 2 29) # Normal Event
fi
if
[[ $buf[offsets[1]] = ($'\x2'|$'\x3') ]] && # KeyPress or KeyRelease
[[ $buf[offsets[2]] = $'\x16' ]] && # keycode 22, Backspace
printf -v modifiers %d "'$buf[offsets[3]]" &&
((modifiers & 5 == 5)) # Shift+Ctrl
then
buf[offsets[2]]=$'\x60' # keycode 96, F12
fi
fi
syswrite -o $fdout -- $buf || tear $client $server
else
tear $client $server
fi
fi
}
done
Обратите внимание, что здесь мы не делаем полную интерпретацию протокола X11 и предполагаем, что события нажатия клавиш отображаются как полные сообщения. Если вы нажмете эту комбинацию клавиш, когда терминал уже занят общением с X-сервером, он может ее пропустить. Это также оказывает влияние на производительность, поскольку весь трафик X11 должен проходить через эту оболочку, написанную наzsh
(оболочке, а не на языке, ориентированном на производительность ).