Как связать 'backward-kill-line' с Ctrl+Shift+Backspace?

Обычный верхний также может отображать последний использованный ЦП.

Вы должны нажать f при просмотре главного экрана, чтобы войти в экран управления полями, стрелку вниз к P = Последний использованный ЦП (SMP) и включить его с помощью ] d или пробел. Нажмите q или выйдите, чтобы вернуться на главный экран.

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

1
04.04.2019, 23:08
2 ответа

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

¹ Я выбрал эту последовательность для совместимости с режимом modifyOtherKeysxterm . Обычно я рекомендую включать modifyOtherKeys, что в основном обратно совместимо, но конкретный ключевой аккорд, который вы хотите, включается только на уровне 2, с которым трудно справиться с (, например. Ctrl+буква не отправляет соответствующий управляющий символ ).

2
27.01.2020, 23:22

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

1
27.01.2020, 23:22

Теги

Похожие вопросы