Por que não posso destacar texto em um emulador de terminal linux com teclas shift + seta?

14

Estes são os atalhos de teclado padrão de edição de texto que eu uso constantemente sempre que edito texto em, literalmente, qualquer aplicativo linux que não seja emuladores de terminal:

  • setas para esquerda + direita para mover para a esquerda + direita
  • ctrl + arrow para mover uma palavra inteira
  • início / fim para passar para o início / fim da linha
  • ctrl + c / ctrl + v para copiar / colar [alguns terminais podem usar shift-ctrl-C / shift-ctrl-V; este é um bom substituto]
  • shift + seta para destacar o texto
  • shift + ctrl + arrow para destacar uma palavra inteira

Eu nunca encontrei uma combinação de shell + emulador de terminal que permita os dois últimos itens nesta lista, e isso me deixa louca. Obviamente, os emuladores de terminal suportam destaque (o mouse pode fazer isso), e eles suportam o uso das teclas ctrl e shift como modificadores (eles podem ser usados para mover o cursor uma palavra inteira e para capitalizar letras, respectivamente); eles podem até mesmo ser usados juntos para copiar / colar com shift-ctrl-C e shift-ctrl-V), então qual é o problema que impede essa funcionalidade? Eu tenho várias perguntas:

  • Isso é um problema com meu emulador de terminal ou com meu shell (bash, embora eu esteja disposto a mudar)?
  • Por que os emuladores / invólucros do terminal não estão em conformidade com esse padrão universal?
  • Se houver um motivo real, ele é antigo e obsoleto ou ainda é relevante para um número significativo de usuários do desktop linux?
  • Existe algum tipo de solução alternativa?
  • Existe algum programa obscuro que eu possa usar para suportar isso?
  • É possível modificar a fonte de, digamos, o gnome-terminal para suportar isso?

Eu sei que o texto pode ser copiado / colado com o mouse, não é isso que estou perguntando. Estou perguntando por que não consigo fazer essas coisas com o teclado em um emulador de terminal.

    
por monguin 22.02.2013 / 18:22

4 respostas

2

Eu acho que seria mais útil se eu levasse isso um pedaço de cada vez. O problema geral é: para quem é a imprensa chave pretendida? O terminal ou o programa rodando dentro do terminal?

Como exemplo, "screen", que é um terminal tipo, usa Ctrl + A como um prefixo para seus comandos, para distingui-los das coisas que vão para o executando o próprio programa. (E fornece uma maneira de enviar Ctrl + A .)

gnome-terminal tem várias chaves que captura para fazer várias coisas, incluindo algumas das quais você pergunta.

Lembre-se também que o "destaque" do terminal é separado da posição do cursor do terminal . Alguns terminais não têm capacidade de destacar nada.

Agora, use essas combinações de teclas por vez:

left+right arrows to move left+right ctrl+arrow to move an entire word home/end to move to start/end of line

Mover o que resta e para a direita? Bash pode ser configurado para fazer isso e normalmente é por padrão. Normalmente, eles movem a posição do cursor.

ctrl+c/ctrl+v to copy/paste

Primeiro: copiar / colar até faz sentido? Se você está em um VT, você não tem uma área de transferência, especialmente se o X não estiver em execução.

Alguns terminais podem copiar texto na saída, e alguns também "colam", simulando a digitação do conteúdo da área de transferência. Ctrl + Deslocamento + V , por exemplo, é colado em gnome-terminal , o que pode ajudar. (E Ctrl + Shift + C é copy.) Como discutido anteriormente, o grande problema com Ctrl + < kbd> C e Ctrl + V é que eles se sobrepõem aos comandos comuns do terminal / programa. ( Ctrl + C é send interrupt (SIGINT) e Ctrl + V é textual.)

Alguns terminais também suportam dois modos de cópia de dados: uma "cópia justa" mais normal e o que é conhecido como "seleção de bloco" ou "cópia de bloco". (Segure Ctrl e arraste enquanto em gnome-terminal , por exemplo).

Além disso, xsel -b pode ser usado para canalizar o conteúdo da área de transferência. Depende da situação exata se xsel ou a versão do terminal da pasta é mais útil. Veja man xsel .

shift+arrow to highlight text shift+ctrl+arrow to highlight an entire word

O destaque do seu terminal (se tiver esse recurso) é separado da posição do cursor. Mais uma vez, a falta de combos de teclas disponíveis é provavelmente um fator. Lembre-se de que um destaque tem duas posições: o início e o final ou os cantos superiores esquerdo e inferior direito. Como você gerencia os dois?

Finalmente, observe que muitos terminais GUI, clicando duas vezes em uma palavra, a destacam. (E no X, copie para a seleção principal.)

screen , como exemplo, possui chaves para alternar para um modo de movimentação pelo buffer (saída anterior) e cópia / colagem.

Acho que se você usar adequadamente o xsel e a seleção principal, verá que as operações da área de transferência são raras e complexas o suficiente para merecer o uso do mouse.

    
por 22.02.2013 / 22:32
1

Eu não sou especialista em emuladores de terminal, mas ...

aplicativos como bash (readline) rodando em um emulador de terminal não sabem nada sobre o sistema X window em execução e a janela X em que estão, eles sabem stdin e stdout em um dispositivo terminal (ttyS / ttyUSB / tty / pts no linux) .

O problema não é mostrar algum texto em destaque mas como informar ao aplicativo X window (o emulador de terminal) que o texto foi selecionado, através desses dispositivos terminais.

Eu acho que o aplicativo do terminal X abre um desses dispositivos na entrada e saída e então traduz os eventos chave X para a saída (do lado X) (do lado bash). Viceversa o fluxo bash output para o terminal X como entrada , aqui o terminal X processa esta entrada para mover o cursor, preenche o backround com alguma cor, de acordo com a aplicação bash saída.

Para meu conhecimento, os códigos de escape podem ser usados para controlar comportamentos especiais, como limpar, preencher o plano de fundo, mover o cursor e talvez alguns códigos de escape personalizados podem ser adicionados para informar ao terminal X que um texto da linha, col a linha, col foi selecionado, apenas um exemplo, talvez o texto selecionado possa ser retornado (um detalhe de implementação).

Eu acho que não é uma definição padrão, você terá que corrigir todas as aplicações que você queira que ele saiba sobre a combinação de teclas pressionada e exibir o código de escape apropriado, se você quiser no bash, o emulador de terminal X no outro lado para processar adequadamente o código de escape (e finalmente enviar as informações para a área de transferência). Provavelmente implementando isso como uma capacidade de terminal você economizaria de patch em cada aplicação. Espero (e adivinhe) que os drivers de dispositivo de terminal no kernel desejem saber o menos possível sobre códigos de escape, portanto, se você tiver sorte, nenhum patch será necessário.

O terminal X desenha a saída, então é fácil saber, quando você usa o mouse, que texto / caracteres você está selecionando.

Um widget de texto gráfico sabe tudo sobre a janela do X que explica porque é tão fácil implementar a seleção e a cópia.

EDITAR

Aqui, este patch de exibição de imagens do urxvt-9.16 pode ser um bom ponto de partida para entender o que é necessário para suportar novos códigos de escape. link

    
por 05.08.2013 / 15:17
1

As respostas são dadas são boas explicações de por que isso é difícil. Aqui está algo que você pode fazer no gnome-terminal para configurar ctrl-c e ctrl-v para copiar e colar, enquanto religa outras chaves na disciplina terminal com stty para enviar SIGINT e inserir um caractere literalmente. Esta não é uma solução completa porque alguns programas desabilitam a disciplina de terminal e você não poderá enviá-los '^ C' e '^ V'. Mais informações aqui .

Em seu script de inicialização do shell (por exemplo, ~/.bashrc , ~/.zshrc , ~/.rcrc ), faça

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Em seguida, no gnome-terminal, clique em Editar > Preferências > Atalhos que você pode ligar Copiar e Colar para ctrl-c e ctrl-v. Note que o terminal irá obter os eventos chave antes de qualquer coisa ser enviada para o dispositivo terminal, então a partir de então você não poderá enviar '^ C' e '^ V' para qualquer processo em execução no terminal.

Eu só fiz isso e vou ver como funciona e quais os problemas que isso causa. Eu fiz o stty's condicionalmente para aplicá-los somente quando estou executando o X.

    
por 29.08.2016 / 17:02
0

Eu apenas ajudei um amigo através de um problema semelhante a este e descobri que o gerenciador da área de transferência era o culpado.

sudo apt-get remove o clipit

conseguiu que tudo voltasse a funcionar bem para ele. Espero que possa ajudar alguém lá fora.

    
por 07.09.2018 / 02:27