É possível selecionar abas como abas com mouse em urxvt?

3

Estou executando o urxvt no Arch Linux. Eu posso selecionar a saída com o mouse para copiar / colar. O problema ocorre quando a saída contém tabulações. Todos os tabuladores são selecionados e copiados como espaços. Isso torna realmente difícil preservar a estrutura de algumas saídas ao copiá-las.

Existe alguma maneira de corrigir esse comportamento?

EDIT: Estou usando o zsh se isso tiver algum efeito sobre o assunto.

    
por Lauri Niskanen 08.09.2012 / 21:43

2 respostas

1

Eu não conheço nenhum terminal que tenha, e direi apenas por que não acho que nenhum terminal faça isso:

tab é um dos muitos caracteres que, uma vez exibidos, exibe mais de um caractere na tela ou move o cursor. CR (mover para o início da linha), LF (para baixo), backspace (esquerda) e todas as seqüências de escape que movem o cursor ou alteram os atributos dos personagens e / ou não exibem nada ...

O urxvt nem sabe exatamente o que o aplicativo produz. Quando um aplicativo envia um LF (\ n) para o lado escravo do pseudo-terminal, você notará que, na maioria das vezes, ele não move apenas o cursor para baixo, como o LF normalmente faz, ele também o move de volta. para o início da linha. Isso porque o driver pty traduz o "\ n" para "\ r \ n" antes de disponibilizá-lo para leitura do lado master do terminal por urxvt (você pode usar stty para alterar esse comportamento) .

Observe também que a seleção não captura espaços à direita.

A seleção X seleciona os caracteres que são exibidos, não aqueles que foram enviados pelo (s) aplicativo (s) para gerar aquela exibição (considere que qualquer caractere em qualquer posição na tela pode ter sido substituído várias vezes por um ou mais aplicativos (s)).

Alguns terminais permitem capturar todos os caracteres que eles recebem no lado mestre do pseudo-terminal, e se não, você pode usar "script" ou "tela" para fazer isso. Mas, para obter a saída de um aplicativo na seleção X, você também pode simplesmente fazer:

the-command | xsel
    
por 09.09.2012 / 23:39
0

O tópico surgiu ocasionalmente com vários emuladores de terminal. A discussão em Debian # 259828 xterm: espaço em branco depois de tabulações representadas como caracteres de espaço nas seleções (para xterm) teve este comentário pelo desenvolvedor do urxvt:

I thought about implementing this in rxvt-unicode: tabs could be represented trivially in rxvt-unicode's data structure. However, there are semantic problems:

Tabs are not characters, but cursor movements. As such, there is no good way to represent them as tab characters, just as "cursor up" or "goto 5,6" will not be represented in the selection text.

e passou a dizer (com efeito) que o urxvt suportava o recurso:

If anybody cares, here is how rxvt-unicode-3.8 implements HT characters now, plus some initial experience on the effects.

When rxvt-unicode-3.8 received a HT, it first calculates the tab movement (which is a relative cursor movement). Iff all characters skipped over are spaces with the same attributes as the first space, it will replace these spaces by a (very) wide tab character (which is easy to do in the way rxvt-unicode handles wide characters, so the code changes were limited to less than 15 lines within the scr_tab method). If any of the characters are not spaces, or if there are attribute changes (e.g. colour), it will only move the cursor.

É claro que o urxvt 3.8 está um tempo atrás. Mas considere os problemas do application que ficam no caminho:

  • apenas o terminal em si tem que suportar o recurso (armazenar guias como guias e permitir a seleção delas),
  • o terminal tem que fazer a coisa certa quando uma aba atinge a margem direita (esse relato de bugs indica casos que não o fizeram),
  • o terminal tem que ser configurado para usar hard tabs (veja a configuração stty para isso),
  • aplicativos (e bibliotecas como ncurses) precisam ser configurados para usar guias difíceis e
  • aplicativos como o screen / tmux precisam (novamente) gerenciar guias como guias para que, ao pintar e pintar novamente a tela, eles sejam enviados para o terminal como guias.

Só porque seu aplicativo envia uma guia para a tela não significa que ele chegue ao terminal. Ele pode ser traduzido para espaços em mais de um nível e totalmente otimizado se um nível intermediário decidir que a tela não mudaria de qualquer maneira.

Uma verificação rápida com o urxvt 9.15 mostra que o recurso ainda funciona (na configuração mais simples, é claro):

$ /tmp/foo
hello   .   world
00000000  68 65 6c 6c 6f 09 2e 09  77 6f 72 6c 64 0a        |hello...world.|
0000000e
$ cat /tmp/foo
printf 'hello\t.\tworld\n' |xclip
hd

Se não funcionar para você, o seu terminal pode estar definido como guias flexíveis ou um dos outros problemas mencionados acima está em seu caminho.

    
por 05.11.2016 / 22:55