As teclas do cursor no bash no dtterm não funcionam como esperado

2

Estou tentando remapear alguns dos meus atalhos de teclado no bash. O problema é que quando tento exibir o código da chave usando Ctrl-V , nem todas as teclas funcionam. Por exemplo, Digitando Ctrl-V , então Home move o terminal para o topo, como sempre. Digitando Ctrl-V , então Ctrl não mostra nada. Digitando Ctrl-V , então left arrow mostra ^[OD , digitando Ctrl-V , então Ctrl-left arrow mostra a mesma coisa.

Eu estou tentando remapear Home e End para mover o cursor para o começo ou fim de linha, e Ctrl-setas para pular palavras. Eu estou no Solaris, usando DtTerm.

SOLUÇÃO:

.Xdefaults:

Dtterm*DtTerm*Translations: #override \n\
<KeyPress>osfBeginLine: string("0x1B")string("[1~") \n\
<KeyPress>osfEndLine:   string("0x1B")string("[4~") \n\
Ctrl<KeyPress>osfLeft:  string("0x1B")string("OC") \n\
Ctrl<KeyPress>osfRight: string("0x1B")string("OD")

.inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\eOD": forward-word
"\eOC": backward-word
    
por Jakub Zaverka 19.08.2013 / 11:33

2 respostas

2

Eu não usei o dtTerm em muitos anos. Você pode ser capaz de fazê-lo funcionar configurando o modo de teclado e o modo de chave de cursor para "Modo de aplicativo" (encontrado em Terminal - > Opções).

Se isso não funcionar, você provavelmente terá que descer a rota Xresources, mas me parece que a tecla Home (como a tecla escape ) tem um significado especial para DtTerm (ala OSF / Motif), e isso requer trabalho extra para que ela funcione bem .

Aparentemente, usar o #override no Translations não é "oficialmente suportado", mas, como um hack, funciona.

Você precisará descobrir quais keymapping estão no lugar executando dtTerm a partir do shell e, em seguida, emitindo um Shift Ctrl * para obter dtTerm para descarregar seu mapa de chaves (que aparecerá no stdout no shell que executou o dtTerm). * é a chave do seu numpad (às vezes conhecido como KP_Multiply) quando se fala em termos de ligações de teclas X.

Eu imagino que o keymapping que o dtTerm irá atribuir será algo como osfBeginLine .

Em seguida, você precisa obter a sequência de teclas real que deseja obter (chave inicial) usando algo como xev . Como exemplo, minha chave home sob minha configuração é keysym 0xff50 .

KeyPress event, serial 30, synthetic NO, window 0x3600001,
    root 0x102, subw 0x0, time 643678606, (78,90), root:(1578,578),
    state 0x0, keycode 110 (keysym 0xff50, Home), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

Em seguida, você precisará editar seu ~/.Xdefaults e adicionar algo como:

Dtterm*DtTerm*translations:#override\n\
:<KeyPress>osfBeginLine: string("0xff50")

Em seguida, execute dtaction ReloadResources , que deve fornecer o arquivo .Xdefaults .

Com um pouco de sorte, você deve obter o mapeamento e, em seguida, ser capaz de fazer a sua ligação de chaves, como de costume. Se não, você pode ter que se meter na terra da ligação virtual da Motif, que eu me lembro de ser uma gigantesca pilha de espaguete.

Referências:

manual do dtTerm, página de opções do terminal dtTerm

por 19.08.2013 / 22:16

2

Os terminais físicos não geraram sequências de código diferentes para o CTRL usado com as setas. Os emuladores de terminais seguiram o mesmo caminho que eles estão tentando se comportar da mesma maneira que seus ancestrais físicos. Dependendo do emulador de terminal que você está usando, você poderá definir suas próprias seqüências. Por exemplo, eu tenho

XTerm*VT100*Translations:   #override \
    Ctrl<Key>Prior:scroll-back(1,halfpage)\n\
        <Key>Prior:string(0x1B)string([5~)\n\
    Ctrl<Key> Next:scroll-forw(1,halfpage)\n\
        <Key>Next:string(0x1B)string([6~)\n\
    <Key>Delete:string(0x1B)string([3~)\n\
    Ctrl<Key>Home:string(0x1B)string(CH~)\n\
    Ctrl<Key>End:string(0x1B)string(CE~)\n\
    <Key>Home:string(0x1B)string(H~)\n\
    <Key>End:string(0x1B)string(E~)\n\
    <Key>BackSpace:string(0x7F)\n\
    Ctrl<Key>Left:string(0x1B)string(CL~)\n\
    Ctrl<Key>Right:string(0x1B)string(CR~)\n\
    Ctrl<Key>Up:string(0x1B)string(CU~)\n\
    Ctrl<Key>Down:string(0x1B)string(CD~)\n

no meu arquivo de recursos para o XTerm.

    
por 19.08.2013 / 11:45