AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 444214
Accepted
Zackary
Zackary
Asked: 2018-05-17 09:48:05 +0800 CST2018-05-17 09:48:05 +0800 CST 2018-05-17 09:48:05 +0800 CST

bash: Shift+teclas de seta fazem A,B,C,D

  • 772

Ao usar o shell bash, tentei usar Shift+ LEFTpara destacar e copiar o comando que digitei (em vez de usar o mouse). No entanto, consegui muitos C's. Mais tarde, percebi que Shift+ UPfaz A, Shift+ DOWNfaz Be Shift+ RIGHTtambém faz D.

Por que isso acontece?

Acho que é dos dados brutos de pressionamento de tecla ( ^[[A, ^[[B, ^[[Ce ^[[D), mas é apenas uma letra maiúscula (não ^[[no início).

bash arrow-keys
  • 2 2 respostas
  • 9993 Views

2 respostas

  • Voted
  1. JdeBP
    2018-05-17T17:23:36+08:002018-05-17T17:23:36+08:00

    Este é um protocolo de entrada de teclado que remonta à década de 1980, e seu shell, não seu "driver de terminal" (seja lá o que for) como na resposta de M. Vazquez-Abrams, não está lidando com ele corretamente. Além disso, é uma sequência de controle perfeitamente válida.

    Fundo

    Os terminais emitem sequências de controle para teclas de função e teclas estendidas. Eles podem emitir sequências de controle DECFNK, que são sequências de controle introduzidas por CSI; Sequências de controle de teclas de função do Linux, que são um tipo diferente de sequência introduzida por CSI; Sequências de controle de tecla de função do console SCO, que são um terceiro tipo de sequência introduzida por CSI; caracteres únicos deslocados, prefixados com SS3; ou, como neste caso, sequências padrão ECMA-48 para várias coisas.

    (SS3 e CSI são caracteres de controle, na faixa C1. Single Shift 3 e Control Sequence Introducer.)

    Você tem dois teclados específicos em seu teclado (semelhante ao IBM Modelo M ou similar), um teclado de calculadora e um teclado de cursor. O modelo empregado pelos emuladores de terminal estilo DEC VT (que é a maioria dos emuladores de terminal que você provavelmente encontrará, desde aquele em seu kernel até o unicode-rxvt) é que ambos os teclados têm modos de aplicativo/normal selecionáveis ​​separadamente. Um aplicativo TUI de tela inteira, algo que usa as bibliotecas libedit ou GNU readline (ou ZLE), como seu shell, e alguns outros tipos de aplicativos especificam qual modo eles desejam e, em seguida, ouvem as sequências de controle vindas do terminal lendo rajadas de caracteres (com base no fato de que um humano não pode digitar uma sequência de controle ECMA-48 completa em qualquer lugar tão rápido quanto um terminal ou um emulador de terminal envia sequências de controle,Escchave do emulador de terminal enviando uma sequência de controle começando com o caractere ␛).

    • No modo de aplicativo, as teclas de seta em cada teclado produzem caracteres simples deslocados prefixados com SS3. Modificadores não podem realmente ter nenhum efeito (apesar de XTerm ter estragado isso) porque ECMA-35 e ECMA-48 definem SS2 e SS3 como agindo apenas em um único caractere seguinte. Mas, por outro lado, os teclados da calculadora e do cursor geram diferentes caracteres com deslocamento SS3, permitindo que os dois teclados sejam diferenciados um do outro.
    • No modo normal, as teclas de seta em cada teclado produzem as mesmas sequências de controle introduzidas pelo CSI, e são aquelas do ECMA-48 com aprimoramentos dos DEC VTs . Em particular, as teclas de cursor enviam as sequências de controle ECMA-48 CUU, CUD, CUR e CUL (CUrsor Up, CUrsor Down, CUrsor Right e CUrsor Left). Os aumentos de DEC para as sequências de controle ECMA-48 são que a sequência de controle inclui o estado modificador atual.

    Portanto, pode-se escolher entre o modo de aplicativo, onde não se pode saber quais modificadores estão pressionados, mas pode-se distinguir as duas teclas de seta para a esquerda, e o modo normal, onde não se pode distinguir entre duas teclas de seta, mas pode-se saber quais modificadores estão pressionados.

    Em mais detalhes: Os aumentos de DEC para as sequências de controle ECMA-48 são que a sequência de controle tem dois parâmetros:

    • O primeiro parâmetro é análogo ao primeiro parâmetro que um CUU, CUD, CUR ou CUL pode realmente ter, por ECMA-48. É a contagem de ocorrências e, portanto, é sempre 1.
    • O segundo parâmetro é o interessante. Ele contém o estado da chave modificadora, que (por motivos que envolvem como os parâmetros nas sequências de controle introduzidas por CSI funcionam quando omitidos) é um conjunto de bitflags para várias chaves modificadoras, mais 1, codificado como um número decimal.

    É assim que os terminais DEC VT têm feito as coisas desde os anos 80. Nos últimos anos, vários emuladores de terminal finalmente introduziram a mesma funcionalidade (embora, como mencionado, o XTerm tenha entendido errado).

    O que está acontecendo.

    O problema é que sua biblioteca GNU readline, libedit, ZLE e assim por diante não lidam com o protocolo adequadamente . Eles não são totalmente culpados. Eles contam com os sistemas termcap e terminfo, que simplesmente não estão à altura do trabalho aqui. termcap e terminfo realmente não têm a noção de uma sequência de controle de entrada que pode variar , muito menos teclados de modo múltiplo.

    Para isso, você deve olhar para o Vim, que pode ser programado com substituições especiais para terminfo para especificar sequências de controle que seguem o protocolo acima (cf. :help xterm-modifier-keysVim), ou NeoVIM, que usa libtermkey de Paul Evans e seu driver CSI . O driver CSI da libtermkey é como alguém deve lidar com a entrada do teclado adequadamente a partir de emuladores de terminal semelhantes ao DEC VT. É um analisador de máquina de estado ECMA-48 real que decodifica sequências de controle corretamente.

    Mas o que seu shell está fazendo é procurar entradas para as teclas de seta em terminfo e apenas corresponder a essas sequências de controle específicas .

    Especificamente:

    • Seu shell está procurando a kcub1capacidade de seu terminal em seu registro terminfo. Aqui está o do registro teken, por exemplo:
      % tput -T teken kcub1|hexdump -C
      00000000 1b 5b 44 |.[D|
      00000003
      %
    • Está apenas correspondendo a essa sequência de entrada específica como ← Left Arrow.
    • Quando você pressiona ⇧ Level 2 Shift+ ← Left Arrow, seu emulador de terminal está enviando a sequência de controle CSI 1 ; 2 D. Em vez disso, está usando as alternativas de 7 bits e enviando ␛ [ 1 ; 2 D, onde ␛ [é a maneira de codificar CSI em caracteres de 7 bits.
    • Seu shell falha em corresponder a qualquer sequência de entrada fixa conhecida de terminfo e interrompe o processamento. No meu shell Bourne Again aqui, ele acaba engolindo os dois primeiros caracteres e age como se eu tivesse pressionado ; 2 D. No seu shell Bourne Again, ele acaba engolindo os quatro primeiros caracteres e age como se você tivesse pressionado D.

      Qual é o modo de falha depende exatamente de qual conjunto de sequências de entrada ele está tentando corresponder ao padrão, pois isso determina quantos caracteres ele engole antes de determinar que possui uma sequência sem correspondências possíveis. É claro que isso, por sua vez, depende do que o registro terminfo/termcap do seu terminal realmente contém e de qual tipo de terminal você disse ao seu shell que seu terminal é.

    Conserta

    A correção local para esse tipo de coisa é ser criativo com as combinações de teclas em seu shell. É por isso que, por exemplo, você encontrará pessoas fazendo esse tipo de coisa com o shell Z em seus .zshrcs:

    bindkey "\e[1;5D" palavra inversa
    palavra de encaminhamento "\e[1;5C" bindkey

    Infelizmente, não há correção não local. Isso envolveria a rearquitetura do tratamento de entrada do seu shell de forma bastante significativa. Tal rearquitetura está muito atrasada. (Testemunha NeoVIM.) Mas ninguém o abordou ainda.

    Leitura adicional

    • Estrutura de Código de Caracteres e Técnicas de Extensão . ECMA-35. 6ª edição. 1994. ECMA Internacional.
    • Funções de controle para conjuntos de caracteres codificados . ECMA-48. 5ª edição. 1991. ECMA Internacional.
    • "ANSI, ANSI curto e códigos de teclado de PC". Manual de referência do programador VT420 . EK-VT420-RM-002. Fevereiro de 1992. Digital.
    • DECFNK. "Funções de controle ANSI". Informações do Programador de Terminal VT510 . EK-VT510-RM. Novembro de 1993. Digital.
    • Informações do programador do terminal de vídeo VT520/VT525 . EK-VT520-RM. Julho 1994. Digital.
    • https://github.com/fish-shell/fish-shell/issues/2139#issuecomment-388706768
    • https://unix.stackexchange.com/a/238932/5132
    • 13
  2. Best Answer
    Ignacio Vazquez-Abrams
    2018-05-17T09:53:48+08:002018-05-17T09:53:48+08:00

    Pressionar Ctrl+ Vfará com que o próximo pressionamento de tecla seja inserido literalmente. Para Shift+ ↑isso resulta em "^[[1;2A". O driver do terminal consome o "^[[1;2" como uma sequência de escape inválida, deixando apenas o "A".

    • 3

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve