Espaço à direita ao copiar do console

6

É esse comportamento irritante que tenho experimentado aqui e ali ocasionalmente: quando você seleciona texto com o mouse no console (isto é, copia), cola-o e percebe que tem espaços extras no final de cada linha . Isto é,

line 1                                                                          
line 2                                                                          

em vez de

line 1
line 2

Portanto, não apenas um espaço no final de cada linha.

Não consegui reproduzir o problema de forma confiável e não consegui encontrar a resposta. Eu acredito que com alguns softwares ele se manifesta só depois de um tempo.

Mas acabei de notar que, quando abro o mesmo arquivo em vim , primeiro do console, em seguida, de tmux , funciona bem no primeiro caso. E não no último. Considerando TERM=xterm-256color no console e TERM=screen-256color in tmux , minha conjectura é que isso tem a ver com o terminal não fazer isso corretamente ou não permitir que os aplicativos o façam corretamente. Uma vaga conjectura, presumo. Então, a primeira pergunta é: "O que exatamente está causando isso?"

E o outro é: "Como faço para isso?" O pior caso é quando o arquivo está localizado remotamente. Eu costumava copiá-lo localmente e abri-lo com gedit ultimamente. Agora eu supostamente tenho uma opção para abri-lo em um novo console (já que estou trabalhando principalmente em tmux sessions), e copie de lá. Isso poderia ser feito mais simples?

Quando executo vim de tmux com TERM=xterm-256color vim , ele se comporta de maneira estranha. Como não desenhar fundo onde não há texto. E não parece certo para mim alterar TERM variable (fazendo com que o software pense que está lidando com outro terminal).

Ao editar o arquivo local, geralmente faço :!gedit % .

    
por x-yuri 25.07.2015 / 02:12

5 respostas

3

Você terá espaços no final da linha ao selecionar e copiar do terminal, se o aplicativo exibir espaços nesse local. Os aplicativos podem exibir espaços para apagar o que havia antes. Os terminais têm comandos para excluir uma linha inteira ou excluir caracteres à direita do cursor; os aplicativos escolhem entre isso e exibir espaços com base no que consideram mais eficiente. Por exemplo, se você digitar algumas coisas em um prompt e pressionar Backspace, o aplicativo (por exemplo, o shell) provavelmente substituirá o último caractere por um espaço.

Se você tiver uma conexão X11, poderá usar xsel ou xclip para copiar um arquivo para a área de transferência local.

Experimentalmente, o Vim parece ter dificuldades para não exibir linhas que terminam com espaços (mesmo quando o buffer contém uma linha que termina com espaços). Portanto, copiar a partir disso é uma opção se você não tiver uma conexão X11.

Uma alternativa seria pós-processar após a cópia:

xsel | sed 's/  *$//' | xsel
    
por 26.07.2015 / 00:00
3

Na verdade, são várias perguntas, e nenhuma das respostas faz mais do que passar por cima das partes interessantes:

  • quando você seleciona texto com o mouse no console (isto é, copia), cole e perceba que tem espaços extras no final de cada linha.
  • Quando executo o vim a partir do tmux com TERM = xterm-256color vim, ele se comporta de maneira estranha.

A maioria dos terminais (como o xterm) armazena os dados que você pode selecionar no na tela. Não há nenhuma parte oculta por trás dele que diga ao terminal que o aplicativo deveria preencher um plano de fundo.

Os aplicativos atualizam a tela movendo o cursor, escrevendo texto (que pode incluir espaços reais - ou guias que o terminal renderiza como espaços) e apagando partes da tela.

Erasure é um problema especial (para seleção / colagem), já que muitos terminais (como xterm) preencherão a área apagada da tela com a cor atual (a cor de fundo apaga (bce) recurso na descrição do terminal). Mas, ao mesmo tempo, as áreas apagadas não têm mais caracteres armazenados nessas posições da tela. Os terminais que usam a representação na tela permitem que você selecione tudo, exceto a área apagada. (Como um caso especial, o seu terminal poderia ter regiões apagadas rodeadas por texto, o que será um espaço para seleção).

Tudo isso é um incômodo, e há muito tempo o xterm forneceu um recurso para ignorar os espaços à direita. A maioria dos outros terminais não fornece isso. E como é uma opção, pode não ser ativada se você tiver executado o xterm. A maioria dos desenvolvedores de terminal que copiam os recursos do xterm não copiam as opções.

Indo para o tmux: ele não suporta o recurso bce. Seus desenvolvedores decidiram não fazer isso. Portanto, aplicativos normais em execução no tmux produzirão espaços em branco finais. Quando você sobrescreve a descrição do terminal, ele confunde o tmux, já que ele não sabe que o vim está realmente assumindo que o background será limpo usando a cor atual. Você acabou de obter o apagamento. Sem cor.

Por outro lado, os desenvolvedores da tela GNU decidiram um tempo atrás para suportar o recurso. É opcional ...

Leitura adicional:

por 31.12.2016 / 16:59
2

Copiar & colar a partir de uma tela de terminal nunca será totalmente confiável, pois está lidando com a saída de tela em vez do material de origem original. Se alguns aplicativos ecoam o texto para o terminal de uma maneira incomum e isso faz com que o terminal não consiga adivinhar qual era o texto original, provavelmente não há muito que você ou o terminal possam fazer a respeito.

Muitas informações sobre o texto original são potencialmente perdidas quando são renderizadas para um terminal: por exemplo, se uma área de espaço em branco foi produzida por uma guia ou por uma série de espaços, ou se duas linhas de texto foram originalmente uma longa fila que foi embrulhada ou duas linhas separadas.

O terminal tenta fazer o melhor para você copiar & cole o texto original que foi ecoado no terminal, mas nem sempre pode saber.

Como experiência, tente isto:

  • Use less para exibir um arquivo que contenha muitas linhas de linha que envolvem várias linhas de terminal.
  • Clique três vezes em uma dessas linhas (para selecionar toda a linha). less selecionou toda a linha lógica que abrange várias linhas físicas e, se você colá-la em outro lugar, ela será preservada como uma linha longa.
  • Pressione j algum número de linhas para que parte dessa linha longa desapareça na parte superior da tela.
  • Pressione k uma ou mais vezes para rolar a linha lógica inteira de volta à exibição.
  • Clique três vezes na linha lógica novamente. Desta vez, apenas uma linha física é selecionada. Isso porque less repintou a linha física da tela por linha física e o terminal não tem mais como saber se as linhas físicas estavam conectadas juntas.
  • Agora, se você fosse arrastar e selecionar a linha lógica inteira manualmente e colá-la em outro lugar, descobriria que ela incorporou novas linhas.

YMMV nessa experiência porque seu terminal (ou versão de less ) pode ser mais ou menos inteligente que o meu.

Geralmente, quanto mais software produz o resultado, maiores são suas chances de copiar & cole exatamente o material original. cat , por exemplo, é praticamente tão idiota quanto possível. (Você entende, é claro, que "burro" é um elogio!)

Se você obtiver um caractere de espaço extra no final de uma linha em tmux , provavelmente é porque tmux está ecoando esse caractere. Lembre-se de que tmux faz sua própria emulação de terminal e, em seguida, emite novas sequências de terminal para renderizar no terminal subjacente. Talvez esteja ecoando esse caractere de espaço porque acredita que pode haver uma necessidade em alguns casos de sobrescrever algum outro caractere que ele acha que possa estar lá. Seja qual for o motivo, o terminal provavelmente não tem como saber que o caractere de espaço não é realmente parte do conteúdo original.

    
por 25.07.2015 / 05:01
1

Usando o Fedora 17 Linux e a janela do terminal konsole, eu abro o vim com o add-on syntastic vim, eu consegui reproduzir este erro consistentemente. Eu coloquei estas três linhas de python no vim:

a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"

Depois, seleciono visualmente essas linhas e cole-as aqui:

a = "generic assignment"
b = "cursor is on this line"                                                                                     
c = "generic assignment"

Observe como a segunda linha tem toneladas de espaços copiados. Isso com certeza é chato.

As linhas 1 e 3 são copiadas como esperado, mas a segunda linha copia espaços até o ponto mais à direita da janela do terminal.

Solução alternativa:

Mova a linha destacada (o cursor do vim) para longe das linhas que você deseja copiar antes de selecioná-la com o mouse. Então os espaços extras não aparecem nessa linha.

Acredito que sejam os complementos de sintaxe e destaque de cores que estão causando esses problemas.

    
por 21.11.2015 / 16:39
1

Em muitos aplicativos modernos do Terminal, há configurações como "Ajustar espaços à direita" nas opções de mouse / cópia. Aqueles estão presentes para o Konsole (KDE) & Yakuake.

    
por 13.03.2017 / 17:32