Отображение клавиш KSH в режиме emacs: ctrl + стрелка

Поведение, которое вы видите, реализовано в archives.c в dpkg исходнике, строка 1030 (для версии 1.18. 1):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

Мне кажется, что вы можете справиться с отказом ссылки, вернувшись к поведению переименования, используемому в строках 1003 и последующих; что-то вроде (это не проверено):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

Я не эксперт по dpkg, хотя... (И в dpkg нет опции, доступной для такого поведения)

.

1
22.02.2018, 19:58
1 ответ

La trampa KEYBD documentada en la página del manual de ksh se llama para una secuencia de caracteres entrantes que comienza con escape. No se describe el final de esta secuencia, pero parece que ;la terminará.

Suponiendo que su función de combinación de teclas es como se indica en este artículo , entonces su vinculación falla porque el código trampa se llama primero para \e[1;, luego para 5y D.

Una solución es cambiar el código trampa para recordar la secuencia inicial y usarla más tarde, de la siguiente manera:

# original code from http://www.bolthole.com/solaris/ksh-oddthings.html
typeset -A Keytable
# trap 'eval "${Keytable[${.sh.edchar}]}"' KEYBD
function keybind # key action
{
    typeset key=$(print -f "%q" "$2")
    case $# in
    2)      Keytable[$1]='.sh.edchar=${.sh.edmode}'"$key" ;;
    1)      unset Keytable[$1] ;;
    *)      print -u2 "Usage: $0 key [action]" ;;
    esac
}

# new function to handle ";" causing end of sequence
# https://unix.stackexchange.com/a/425980/119298
function myfn {
    typeset -S state
    case "$state${.sh.edchar}" in
    $'\e[1;')   state=${.sh.edchar}
               .sh.edchar=
                return ;;
    $'\e[1;5')  state="$state${.sh.edchar}"
               .sh.edchar=
                return ;;
    $'\e[1;5'?) state=
               .sh.edchar=$'\e[1;5'"${.sh.edchar}" ;;
    esac
    eval "${Keytable[${.sh.edchar}]}"
}

trap myfn KEYBD

keybind $'\e[1;5D' $'\eb'
keybind $'\e[1;5C' $'\ef'
1
27.01.2020, 23:44

Теги

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