CTRL + C: copiar ou interromper

6

No Linux e no Windows CTRL + C tem dois significados muito diferentes, dependendo do programa que você usa. Em alguns programas (principalmente programas GUI), significa "copiar", enquanto em outros programas (quase todas as ferramentas de linha de comando) significa "interromper" ou "sair".

Isso é especialmente problemático para pessoas que usam a GUI para usar a linha de comando, já que "copiar" é uma operação completamente segura, enquanto a interrupção pode matar o programa que você está usando, destruindo seu trabalho.

Qual é o motivo, ou onde está a origem dessa divisão?

    
por Dakkaron 25.11.2015 / 15:13

1 resposta

15

O significado de “matar” de Ctrl + C é muito antigo, acho que ainda mais antigo que o Unix. Wikipedia o rastreia até o TOPS-10, que data do final dos anos 60. O artigo explica por que Ctrl + C era uma opção razoável: em ASCII , publicado em 1963, o caractere correspondente é ETX, fim do texto . Na falta de um caractere que significa “pare”, um caractere que significa “esse segmento de entrada acabou” era uma escolha razoável para significar “interromper o processamento atual”.

O significado de “copiar” de Ctrl + C vem da Xerox PARC, os inventores do copy-paste em sua forma moderna (e a maioria dos outros fundamentos das interfaces gráficas de usuário). Não sei exatamente quando isso aconteceu, mas deve ter sido no final dos anos 70. Este tópico sobre o Experience Stack Exchange do usuário discute a escolha de combinações de teclas; C para cópia faz muito sentido.

Houve poucas razões para o PARC rejeitar Ctrl + C para copiar com base no significado existente nos terminais TOPS-10 e Unix. Os sistemas operacionais e aplicativos eram mais diversos na época, e muito menos pessoas usavam computadores; não havia oportunidade nem exigia um padrão único para associações de teclas em todos os aplicativos. Outros usos para Ctrl + C em aplicativos populares incluem page-down em WordStar ² e comando específico do modo no Emacs. Todos eles foram projetados independentemente, para aplicações com requisitos frequentemente diferentes, sendo executados em diferentes ambientes.

Você pode configurar as associações de teclas do terminal com o stty command . As ligações do terminal estão ativas quando o terminal está no modo cozido³. Por exemplo, o comando stty intr ^G define o caractere que envia um sinal SIGINT para Ctrl + G em vez de Ctrl + C . O caractere ^G é BEL em ASCII; quando enviado para um terminal, significa “tocar a campainha”. É o caractere que o Emacs usa para “interromper a operação atual” (lógica: o aplicativo envia a BEL ao usuário através do terminal para interromper o usuário; o usuário envia o BEL para o aplicativo através do terminal para interromper o aplicativo). Não tem um significado padrão quando enviado para um terminal.

A maioria dos shells fornece recursos de edição de linha, então eles configuram o terminal para o modo raw. Então, faça aplicações em modo de texto em tela cheia. Você pode precisar configurar esses aplicativos para reconhecer Ctrl + G ao invés de Ctrl + C , e alguns podem ter ligações de teclas não configuráveis. Então, alterar o caractere de interrupção pode ou não ser praticamente factível, dependendo de quais aplicativos você usa.

Outra abordagem poderia ser configurar seu terminal para alterar a seqüência de bytes que ele envia para o keychord Ctrl + C ou fazer com que ele não envie nada e faça uma cópia Operação. Você também escolheria um keychord diferente para enviar Ctrl + C (se você tiver um teclado de PC que não seja laptop, você pode usar o out-of-the-way Pausa / Tecla Break ). Nem todos os terminais podem ser configurados dessa maneira.

¹ Ctrl-S (XOFF) significa parar, mas está endereçado ao terminal, não ao aplicativo.
² Próximo a Ctrl + X para a próxima linha, com Ctrl + E e Ctrl + R para linha anterior e page-up; essas chaves foram escolhidas devido à sua colocação em um teclado QWERTY.
³ Nitpick: o modo cozido é um conjunto de configurações do terminal, incluindo a interpretação de vários caracteres, incluindo um que envia um sinal de interrupção.

    
por 26.11.2015 / 03:39