Klawisz Delete nie działa w wierszu poleceń

10

** Uwaga: zadałem to samo pytanie na SuperUser, ale nie otrzymałem żadnej odpowiedzi. Teraz zdaję sobie sprawę, że jest to bardziej odpowiednie forum dla tego konkretnego pytania. *

W powłoce ksh klawisz Delete nie działa poprawnie w wierszu poleceń. Dostaję ~ po naciśnięciu Usuń.

Jak ja:

  1. powiązać funkcję „Usuń znak pod kursorem” z przyciskiem Usuń klawiaturę? (Control-D zachowuje się tak, jakbym oczekiwał działania przycisku usuwania, a moje próby użycia aliasu były nieudane i prawdopodobnie naiwne).
  2. powiązać funkcjonalność „ Przenieś do pierwszego wiersza” z przyciskiem klawiatury domowej? (Kontrola A robi to teraz, ale chcę, aby Home to zrobił).
  3. powiązać funkcjonalność „ Przenieś na koniec linii ” z przyciskiem Koniec klawiatury? (Control E robi to teraz, ale chcę, żeby to koniec.)

Ostatnia (?) Aktualizacja

Natknąłem się na coś, co działa, ale nie do końca rozumiem, dlaczego. To działa:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Według http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind ,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

Więc moje zaktualizowane pytanie brzmi: dlaczego muszę z tego korzystać prefix-2? Przetłumacz dla mnie, abym mógł zrozumieć, żebym nie musiał ponownie wszystkich o to wkurzać.

OBSERWATORY STARYCH OBSERWATORÓW

AKTUALIZACJA

Okazuje się, że ESC w QNX jest ^[. Za pomocą polecenia bind '^[[3~'='delete-char-backward'mogę uzyskać kursor, aby zastąpić znak pod kursorem za pomocą ~. To przynajmniej pewien postęp - teraz wiem, jak przeliterować klawisz Delete dla powłoki. Większość rzeczy, które widziałem w Internecie, mówią, że klucz do usuwania jest ^?, ale wydaje mi się, że to nie działa. Powinienem również wspomnieć, że uzyskuję do tego dostęp za pośrednictwem PuTTy.

Nie rozumiem, ponieważ Control D robi to, co chcę, aby klawisz usuwania. Próbowałem związać to eot-or-deleteponownie bezskutecznie.

To powinno być proste, prawda?

AKTUALIZACJA 2:

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

AKTUALIZACJA 3: Więcej moich ustawień

Ustawienie ENV

 echo $ENV
/etc/kshrc

BIND Complete Output

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/ etc / kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

Ustawienia PuTTy:

wprowadź opis zdjęcia tutaj

Uwagi, które mogą mieć znaczenie, ale mogą nie stanowić tła:

Powłoka to „PD KSH v5.2.14 99/07 / 13.2”. Tak, nie mam opcji aktualizacji ... to system wbudowany. „Zdobądź nowoczesną powłokę” nie jest realną odpowiedzią. System operacyjny to QNX Neutrino 6.4.1.

bind pokazuje następujące:

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp pokazuje:

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty pokazuje:

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59
kmort
źródło
Czy unix.stackexchange.com/questions/23041/... lub unix.stackexchange.com/questions/42753/… pomaga?
Gilles „SO- przestań być zły”
Widziałem już oba te linki i próbowałem je zmodyfikować kshrcbezskutecznie. Rozumiem, sh: /etc/kshrc[21]: trap: bad signal KEYBDże niestety nie mam innej opcji powłoki. Nie wiem, czy jest to problem z PDKSH, z QNX czy z obydwoma. Wiem, jakie kombinacje klawiszy spowodują to, czego chcę. Muszę tylko znać składnię, aby zamapować je na odpowiednie klucze.
kmort
Klawisz Delete działa dla mnie z Pdksh (ta sama wersja, nie był utrzymywany od ubiegłego wieku) pod Linuksem. Co ci bind | grep prefixpokazuje? I bind | grep '[^ -~]'?
Gilles „SO- przestań być zły”
@Gilles Zaktualizowałem z wynikami poleceń wiązania. Czy to mogą być moje ustawienia PuTTy? Doceniam twoją pomoc. :-)
kmort
AFAIK bind '^[[3~'='delete-char-forward'powinien był działać. Nie rozumiem, skąd pochodzą te znaki spoza ASCII (nie są to sekwencje ESC + foo z 8-bitowym zestawem, ani ich zamieszanie latin1 / utf8). Czy `bind '^ X3 ~ = delete-char-forward' działa?
Gilles „SO- przestań być zły”

Odpowiedzi:

6

Dla Googlersów:

Uff Było to trudne dla czegoś, co powinno być tak proste.

Krótki rozwiązaniem jest użyć następujących ustawić klawisz Delete (w kshrclub gdziekolwiek),

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

I ustaw ustawienia terminala PuTTy na rxvtzamiast Standard.

Ustawienia PuTTy

Rzeczą, która naprawdę pomogła mi zacząć działać, było: http://www.mail-archive.com/[email protected]/msg81796.html

ksh robi głupie rzeczy z klawiszami home i end. Zasadniczo, nie mogłem sprawić, by odróżniał jednocześnie Home, End i Delete. Bez względu na to, co było ostatnio związane, wystarczyłyby wszystkie trzy klucze. Ogromna zmiana pomogła w wysłaniu PuTTy do tych kluczy.

Uwaga: niektórzy sugerują, czy chcesz zobaczyć, jaki kod otrzymuje powłoka po naciśnięciu klawisza, wpisz cat, naciśnij klawisz Enter, a następnie naciśnij klawisz. Dla mojej powłoki to nie zadziałało. Mam ~wszystkie klawisze sterujące. Zamiast tego nacisnąłem Escraz, a następnie klawisz. Kod kontrolny pojawi się, a następnie pojawi. Użyj tego kodu kontrolnego bindi gotowe.

kmort
źródło
Mogę potwierdzić, że działa to również w Conemu + Cygwin.
Janac Meena
2

[Chociaż mamy nieco inną konfigurację, mam nadzieję, że poniższe informacje mogą być dla kogoś przydatne, ponieważ uważam, że mają zastosowanie te same ogólne zasady. Okazało się to dla mnie dobrym doświadczeniem edukacyjnym na temat tego, jak Linux obsługuje podstawowe terminale we / wy.]

Jeśli powłoka działa w oknie terminala gnome , to w obszarze Preferences| Profileswybierz profil, a następnie wybierz Edit, a następnie Compatibilitykartę, a zmienił Delete key generatessię Automatic. (Lub jeśli to się nie powiedzie, wypróbuj inne dostępne opcje).

[Jestem na odcinku Debian.]


Nie wiem jak, a nawet kiedy dokładnie moje Del zostało zepsute, ale zaczęło się kasować w lewo niż w prawo!

Ten artykuł był dla mnie bardzo pomocny, aby zrozumieć, jak to działa.


Użyłem sugerowanych strategii debugowania w powiązanym artykule powyżej:

Wpisz ^v Deli ^v Backspace, [control-v, a następnie usuń klucz ...], aby znaleźć zwrócone kody sekwencji terminali.

I wykorzystanie showkey -s, showkey -k, showkey -aa następnie Deli Backspaceklucze do kontroli trzech warstw (RAW z klawiatury, jak wyjście z kierowcą tty, a jako ciąg znaków danego celu terminalu).

Z tego zauważyłem, że podczas używania stty (np. Stty1) moje zachowanie powłoki było inne niż podczas używania xterm (z graficznego terminala X). Del usunięte poprawnie do przodu (po prawej) w stty1, ale do tyłu (po lewej) w moim xterm.

Widok eliptyczny
źródło
Artykuł jest martwym ogniwem
Milk
1

Istniejące dwie odpowiedzi nie działały dla mnie, przechodząc od bash Linux (Ubuntu 18.10), przez SSH do bash Solaris 11.3, używając terminala gnome.

Stwierdziłem, że muszę użyć bindpolecenia, ale z obejściem, ponieważ nie mogłem uzyskać funkcji natywnej Delete.

Tak więc obejście polega na tym, że po Deletenaciśnięciu symuluje się usuwanie poprzez mapowanie naciśnięcia klawisza usuwania na i Backspace.

bind '"^[[3~":"^[[C^?"'

Aby wpisać to, użyj klawiszy:

CTRL-vDeletedla pierwszej części
i CTRL-vCTRL-vBackspacedla drugiej.
(lub użyj \ezamiast tego ucieczki, np . "\e[3~":)

To nie jest idealne, jeśli jesteś Deletena końcu linii, wciąż jest na zapleczu. Ale oszczędza mi to konieczności cofania ~znaku kilka razy dziennie.

Kingsley
źródło