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.
fonte
Respostas:
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:
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.
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-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 sexsel
a versão da pasta do terminal é mais útil. Vejaman xsel
.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
xsel
e 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.fonte
gnome-terminal
teria 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é.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
fonte
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
stty
envioSIGINT
e 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çaEntã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.
fonte
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:
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.~ $ ls -l
e o emulador de terminal não sabe que apenas als -l
parte 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.
fonte
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
micro
editor de texto é o melhor que eu já vi ao emular um editor de texto da GUI, semelhante ao DOS,edit
mas com recursos mais modernos no texto sublime.ne
é mais antigo nos repositórios Debian enano
pode até ser configurado com combinações de teclas sãs. Mas o terminal nu / shell, não.Com
libvte
isso, 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.fonte
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í.
fonte