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


19

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

  • setas esquerda + direita para mover esquerda + direita
  • ctrl + seta para mover uma palavra inteira
  • home / end para mover 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 + Seta para destacar uma palavra inteira

Eu nunca encontrei uma combinação de emulador de terminal shell que permita os dois últimos itens desta lista, e isso me deixa louco. Obviamente, os emuladores de terminal suportam realce (o mouse pode fazê-lo) e suportam o uso das teclas ctrl e shift como modificadores (eles podem ser usados ​​para mover o cursor uma palavra inteira e colocar letras maiúsculas em maiúsculas, respectivamente; [editar:] eles podem até 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 no meu emulador de terminal ou no meu shell (bash, embora eu esteja disposto a mudar)?
  • Por que os emuladores / invólucros terminais não estão em conformidade com este padrão universal?
  • Se existe um motivo real, é antigo e obsoleto, ou ainda é relevante para um número significativo de usuários de desktop linux?
  • Existe algum tipo de solução alternativa?
  • Existe algum programa obscuro que eu possa usar que suporte isso?
  • É possível modificar a fonte do, digamos, terminal-gnome para suportar isso?

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


Observe que a seleção de texto com o mouse não altera a posição do cursor. Se você misturasse a seleção de texto com a digitação de comandos regulares no teclado, seria realmente muito confuso além dos limites do comando que você digitou e ainda não foi executado. Você é capaz de selecionar texto além dos limites da caixa de texto em uma página da web com o teclado? Observe também que existem programas como a tela que permitem entrar em um modo diferente que possui seleção de texto para todo o terminal, mas é claro que não permite mais a inserção de comandos.
Daniel Beck

1
Daniel: o console do Matlab, por exemplo, é uma CLI que permite realçar o texto com o teclado. Funciona perfeitamente na minha experiência; Ele permite a seleção além do comando atual ainda não executado, se desejado; pessoalmente, tenho pouco uso para isso.
monguin


Respostas:


5

Eu acho que seria mais útil se eu pegasse esse pedaço de cada vez. O problema geral é: a quem se destina o pressionamento de tecla? O terminal ou o programa em execução dentro do terminal?

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

gnome-terminal possui várias chaves capturadas para fazer várias coisas, incluindo algumas das quais você pergunta.

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

Agora, usando essas combinações de teclas de cada vez:

esquerda + direita para mover para a esquerda + direita ctrl + seta para mover uma palavra inteira home / end para mover para o início / fim da linha

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

ctrl + c / ctrl + v para copiar / colar

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

Alguns terminais podem copiar texto na saída e outros também "colam" simulando a digitação do conteúdo da área de transferência. Ctrl+ Shift+ V, por exemplo, é colado gnome-terminal, o que pode ajudar. (E Ctrl+ Shift+ Cé uma cópia.) Como discutido anteriormente, o grande problema com Ctrl+ Ce Ctrl+ Vé que eles se sobrepõem aos comandos comuns de terminal / programa. ( Ctrl+ Cé enviar interrupção (SIGINT) e Ctrl+ Vé literalmente.)

Alguns terminais também suportam dois modos de cópia de dados: uma "cópia apenas" mais normal e o que é conhecido como "seleção de bloco" ou "cópia de bloco". (Mantenha pressionado Ctrle arraste enquanto estiver, gnome-terminalpor exemplo.)

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

shift + seta para destacar texto shift + ctrl + seta para destacar uma palavra inteira

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

Por fim, observe que em muitos terminais da GUI, clicar duas vezes em uma palavra a destacará. (E em X, copie para a seleção principal.)

screen, por exemplo, possui teclas para alternar para um modo para mover-se pelo buffer (saída anterior) e copiar / colar.

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


5
Aprecio o tempo que você levou para escrever sua resposta, mas, de alguma forma, não acho que compreenda melhor por que esse não é um recurso disponível nos emuladores de terminal. Você apontou uma nova idéia para mim - que um emulador de terminal é único por executar outros programas - mas não entendo por que apenas um subconjunto selecionado de combinações de teclas é impossível disponibilizar para o usuário.
monguin

2
Emuladores de terminal emulam terminais físicos . Eles não foram criados do zero para fornecer uma interface de linha de comando. Coisas como o Control-C estabeleceram significados muito antes da Microsoft decidir cooptá-los como atalhos de teclado, e os emuladores de terminal devem aderir a eles.
chepner

2
Eu acho que o diabo está nos detalhes aqui. Não é impossível: a tela tem um modo de fazer o que você quer, eu acho. Mas, para conseguir isso, você precisa mudar para o modo "Eu quero selecionar coisas". gnome-terminalteria problemas semelhantes: eles provavelmente não o implementaram porque não é exatamente algo que você está fazendo. Lembre-se de que o shell não é o único programa em execução: qualquer programa pode estar em execução e pode querer usar qualquer sequência de teclas que você possa usar para copiar / colar para seus próprios fins. A tela tem maneiras de enviar as teclas que substitui e o gnome-terminal tenta não pisar no pé.
Thanatos

1
A seleção de bloco é um meio de selecionar um retângulo: mantenha o controle pressionado e arraste no terminal gnome, e você deve ver imediatamente como é diferente. A maioria dos emuladores de terminal da GUI possui esse recurso e os editores de texto mais avançados também. (Veja Bloco visual no vim, por exemplo.)
Thanatos

1
Ah, então eu estou familiarizado com a seleção de blocos, mas não sabia o nome. Também não estou ciente de um atalho de teclado da GUI para essa ação, por isso parece desnecessário inventar um com o objetivo de responder à minha pergunta. Agradeço os comentários de todos aqui, mas como eu ainda estou insatisfeito, eu suponho que tudo o que posso fazer agora é cavar a fonte mim ...
monguin

1

Não sou especialista em emuladores de terminais, mas ...

aplicativos como o bash (readline) executado 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 conhecem stdin e stdout em um dispositivo terminal (ttyS / ttyUSB / tty / pts no linux).

O problema não é mostrar algum texto destacado, mas como informar o aplicativo da janela X (o emulador de terminal) de que o texto foi selecionado através desses dispositivos de terminal.

Eu acho que o aplicativo do terminal X abre um desses dispositivos na entrada e na saída e, em seguida, converte os eventos-chave X na saída correta (do lado X) da entrada (do lado do bash). Ao contrário do fluxo de saída do bash para o terminal X como entrada , aqui o terminal X processa essa entrada para mover o cursor, preenche o backround com alguma cor, de acordo com a saída do aplicativo bash.

Pelo meu conhecimento, códigos de escape podem ser usados ​​para controlar comportamentos especiais, como limpar, preencher o plano de fundo, mover o cursor e talvez algum código de escape personalizado possa ser adicionado para informar ao terminal X que um texto de linha, coluna a linha, coluna foi selecionado, apenas um exemplo, talvez o texto selecionado possa ser retornado (um detalhe de implementação).

Eu acho que, não sendo uma definição padrão, você terá que corrigir todos os aplicativos que deseja suportá-lo para saber sobre a combinação de teclas pressionada e gerar o código de escape apropriado, a linha de leitura, se você quiser no bash, o emulador de terminal X em do outro lado para processar corretamente o código de escape (e finalmente enviar as informações para a área de transferência). Provavelmente, implementar isso como um recurso de terminal o pouparia de corrigir todos os aplicativos. Espero (e acho) que os drivers de dispositivo do terminal no kernel desejem saber o mínimo possível sobre códigos de escape, portanto, se você tiver sorte, nenhum patch será necessário.

O terminal X desenha a saída, para que você saiba facilmente, quando você usa o mouse, que texto / caracteres você está selecionando.

Um widget de texto gráfico sabe tudo sobre sua janela X e é por isso que é tão fácil implementar selecionar e copiar.

EDITAR

Aqui, este patch urxvt-9.16-image-display pode ser um bom ponto de partida para entender o que é necessário para suportar novos códigos de escape. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

As respostas dadas são boas explicações de por que fazer isso é difícil. Aqui está algo que você pode fazer no gnome-terminal para configurar ctrl-ce ctrl-vcopiar e colar, enquanto religa outras teclas na disciplina do terminal com o sttyenvio SIGINTe a inserção de um caractere literalmente. Esta não é uma solução completa porque alguns programas desativam a disciplina do terminal e você não poderá enviá-los '^ C' e '^ V'. Mais informações aqui .

Em seu script de inicialização 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

Então, no gnome-terminal Editar> Preferências> Atalhos, você pode vincular Copiar e Colar para ctrl-c e ctrl-v. Observe que o terminal receberá os principais eventos antes que qualquer coisa seja enviada ao dispositivo do terminal; portanto, a partir de então, você não poderá enviar '^ C' e '^ V' para qualquer processo em execução no terminal.

Acabei de fazer isso e vou ver como vai ser e quais problemas isso causa. Eu fiz o stty's condicionalmente para aplicá-los apenas quando estou executando o X.


1
Obrigado pela resposta. Nesse meio tempo eu me tornei acostumados a OSX e Emacs ligações, e também apenas desistido do sonho de ctrl + shift + seta em um terminal ...
monguin

1

Como Thanatos mencionou, há uma distinção a ser feita entre o emulador de terminal (rodando no X Windows ou Wayland) e os programas rodando dentro do terminal (vamos chamar de "shell", embora não seja); essas duas coisas são isoladas uma da outra (veja detalhes técnicos ).

Os primeiros itens da sua lista (teclas de seta, Início / Fim etc.) são tratados diretamente pelo programa dentro do terminal e, portanto, a posição do cursor é controlada pelo programa dentro do terminal.

Os atalhos de copiar e colar (Ctrl + Shift + C e Ctrl + Shift + V), por outro lado, são manipulados pelo emulador de terminal, que entende o mouse (para que você possa selecionar texto com o mouse), ele sabe o que é na tela (para que ele possa copiar) e pode enviar pressionamentos de teclas para o programa interno (para que ele possa colar).

Para oferecer suporte às teclas Shift + Esquerda e Shift + Direita, o emulador de terminal ou o shell precisaria lidar com o pressionamento de tecla. De qualquer maneira, temos um problema:

  1. O shell não pode manipular facilmente essas chaves porque, eventualmente, você deseja copiar o texto selecionado para a área de transferência, e a área de transferência é um conceito do X Windows ao qual o shell não necessariamente tem acesso (mas veja xclip). E até onde eu sei, se o shell suportava a seleção de texto, o Linux não define nenhum mecanismo para notificar o emulador de terminal sobre o que está selecionado.
  2. Enquanto isso, o emulador de terminal não é responsável pela localização do cursor. Mesmo que o emulador de terminal possa alterar a localização do cursor, provavelmente não sabe onde a linha de texto atual começa e termina. Por exemplo, o terminal pode conter texto ~ $ ls -le o emulador de terminal não sabe que apenas a ls -lparte pertence ao usuário.

Não é difícil imaginar um emulador de terminal que suporte a seleção com Shift + Arrows, mas acho que ele teria que ocultar o cursor do shell e introduzir seu próprio "cursor falso" que existe temporariamente para ajudá-lo a selecionar algo, e então você pode pressionar Ctrl + C / Ctrl + Shift + C / Ctrl + Ins para copiar (ou Esc para cancelar) e mostrar o cursor real mais uma vez. Isso não teria todos os recursos de uma seleção normal, é claro - especialmente cortar e excluir não existiriam.


Obrigado, vou ler o artigo TTY, mas ainda não o fiz. Isso pode explicar a diferença na minha compreensão da diferença entre "emuladores de terminal" e "aplicativos de desktop que lidam com programas de texto". Meu exemplo anterior, o console do Matlab, se comporta exatamente como eu quero. Não entendo por que não pode haver um aplicativo de desktop com esse comportamento, onde o programa de texto em execução nele é algo além do Matlab. Digamos que eu queira usar apenas os comandos shell mais básicos - ls, cd, cp, mv - e não vejo nenhum conflito. Programas como screen ou tmux, pelo que entendi, podem tornar as coisas mais complicadas.
Monguin #

1

Estas são as ligações de teclado CUA que você descreve, um padrão da IBM em meados dos anos 80:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Eles geralmente são implementados em todos os ambientes de desktop criados desde então. Todas as ferramentas DOS, Windows, Motif e até Netware convergiram para esse padrão. Uma exceção é o Mac, que usa um conjunto bastante semelhante, mas diferente (Cmd em vez de Ctrl) do mesmo período.

Os terminais Unix são muito anteriores a esse padrão e, na maioria das vezes, o ignoram. Além disso, se eles implementassem essas associações de teclas, isso poderia interferir nos programas TUI que já os utilizam para outras funcionalidades. Portanto, embora tecnicamente factível, também é problemático.

Apps:

O microeditor de texto é o melhor que eu já vi ao emular um editor de texto da GUI, semelhante ao DOS,  editmas com recursos mais modernos no texto sublime. neé mais antigo nos repositórios Debian e nanopode até ser configurado com combinações de teclas sãs. Mas o terminal nu / shell, não.

Com libvteisso, pode ser fácil construir um terminal virtual rudimentar que lida com esses atalhos de teclado. Um monte de trabalho para um pequeno ganho no entanto.


0

Eu apenas ajudei um amigo a resolver um problema semelhante e descobri que o gerente da área de transferência clipit era o culpado.

sudo apt-get remover clipit

foi capaz de recuperar tudo e funcionar muito bem para ele. Espero que possa ajudar alguém por aí.


Você respondeu à pergunta errada? Essa foi uma pergunta geral sobre os recursos de todos os emuladores de terminal. É bastante claro que não há "solução". Agora não, nem nunca tive o clipit instalado em nenhuma máquina.
monguin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.