Posso usar o mouse para selecionar corretamente o texto em menos?

9

Acabei de descobrir que posso adicionar as seguintes linhas a ~/.vimrc.

set mouse=a
:vmap <C-C> "+y

Isso tem o efeito de poder selecionar texto com o mouse (ou seja, no modo visual) e depois copiar o texto real na área de transferência do X com Ctrl+ c. Isso difere da cópia padrão do terminal, pois é o texto real que estou copiando, não o que o terminal vê. Por exemplo, se houvesse guias no texto, anteriormente eu as copiaria como espaços.

Existe uma maneira de fazer menos se comportar da mesma maneira? ou seja, posso copiar literalmente o que está no arquivo de texto que estou visualizando em menos?

Sparhawk
fonte
Você já tentou com o gpm?
YoMismo 23/10
@YoMismo Não. Não tenho muita certeza de como isso ajudaria, pois o emulador de terminal ainda conteria espaços literais em vez de guias, no exemplo acima.
Sparhawk 23/10
Desculpe, pensei que você estivesse trabalhando no console, não no terminal X: - /
YoMismo

Respostas:

5

Não é uma tarefa por menos

Não,
acho que você não pode fazer isso diretamente, porque menos não tem um cursor para começar.
Seria necessário navegar para o início e o fim do texto a ser selecionado.
lesssimplesmente não é a ferramenta certa para a navegação em nível de personagem.

Guias já expandidas

Você pode usar a tecla shifte o mouse para fazer uma seleção; Isso é tratado pelo terminal, não por menos. Mas o terminal não sabe como os espaços e as guias foram organizados - menos a interpretação das guias internamente e escreve apenas caracteres " " normais na tela.

Existem ferramentas como screen, tmux e byobu, que podem fazer muitas coisas impressionantes nesta área. Não verifiquei, mas presumo que esses multiplexadores de terminal não tenham uma maneira de contornar isso - sendo terminais, no final - e se comportarão da mesma maneira.

Use vim

Se você está mostrando um arquivo em less, há uma boa solução:
Pressione a tecla vem lesspara abrir o arquivo atual em vim- asuming seu $EDITORetc. está configurado para vim.

Isso não funciona ao mostrar stdin a partir de um pipeline, aproximadamente, embora haja soluções alternativas .

Rolagem do mouse, pelo menos

Mas você pode pelo menos rolar com a roda do mouse:

Isso parece até estar ativado por padrão, mas os eventos da roda do mouse são suprimidos por uma opção diferente.

Para um teste rápido, tente:

LESS=-r man less

A opção -X( --no-init) bloqueia a rolagem - verifique o que sua variável de ambiente LESScontém:

$ echo $LESS

A opção -q( --quiet, --silent) também causa problemas, de acordo com SU: Como fazer a roda do mouse rolar o menos pager usando o bash e o gnome-terminal?

Volker Siegel
fonte
Ótima resposta. A vchave é fantástica! (Tomei a liberdade de uma solução legal para fazê-lo funcionar em pipelines também.) FWIW no meu emulador de terminal (terminador) Não preciso segurar a tecla Shift ao selecionar o texto.
Sparhawk 23/10
@ Sparhawk Ei, a solução alternativa é pelo menos tão fantástica!
Volker Siegel
2
Além disso, existe um pager chamado vimpagerque você pode usar para substituir lessa venda total. Na verdade, ele usa apenas vimenvolto em um pequeno script.
HalosGhost
1
@HalosGhost Obrigado por isso. vimpagerparece bem legal, mas eu tive problemas com puxões que me fazem preferir usar menos e v.
Sparhawk 23/10
@ Sparhawk Tecnicamente, você pode comparar o vimrc usado ou usar partes do seu vimrc normal vimpageraté que funcione; (Eu tento não ativar todos os meus vimplugins ao iniciar vimpager...)
Volker Siegel
3

Você pode copiar a linha superior exibida na lessseleção X11 CLIPBOARD digitando com less:

|.head -n1|xclip -sel c<Enter><Enter>

Isso canaliza o menos buffer da linha superior para a .marca (portanto, com efeito, todo o conteúdo da tela) para o head -n1|xclip -sel ccomando (para armazenar a primeira linha na seleção da CLIPBOARD)

Você pode configurar o emulador de terminal para colar essa sequência em um determinado pressionamento de tecla ou vinculá-lo a uma tecla ou combinação de lessteclas nas combinações de teclas. Por exemplo, para vinculá-lo Alt+C:

printf '%s\n' '#commands' '\ec pipe .head -n1|xclip -sel c\n' | lesskey -

No entanto, observe que você deve pressionar Enterdepois disso para confirmar o prompt "| done (pressione RETURN)".

Com xterm, você também pode definir um novo modo de seleção, por exemplo, aqui, mantendo pressionado Ctrl+Altao estender a seleção que indica lessquais linhas copiar da tela atual:

Escreva um lesspastescript como:

#! /bin/sh -
start=${1%%";"*}
end=${1#*" "}
end=${end%";"*}
head -n "$((end))" | tail -n "$((end - start + 1))" | xclip -sel c

E defina as tabelas de conversão xterm (aqui na linha de comando para teste, mas você deseja adicioná-lo a um arquivo de recurso X):

xterm -xrm 'XTerm.VT100.translations: #override \
  Meta Ctrl<Btn1Down>: select-start()\n\
  Meta Ctrl<Btn1Motion>: select-extend()\n\
  Meta Ctrl<Btn1Up>: select-end(SECONDARY) \
    insert-formatted("|.lesspaste '\''%P %p'\''\n\n", SECONDARY)'

Você marcaria as linhas a serem coladas arrastando o mouse Ctrl+Altpressionado e, ao liberar o Botão 1, o xterm diria menos para canalizar a tela atual para o nosso lesspastescript com as coordenadas de início e fim passadas como um argumento ( y1;x1 y2;x2).

(note que ele pode não funcionar corretamente se lessfor invocado com -sa apertar linhas em branco (como é típico quando invocado pelo man), como a entrada que é alimentado para lesspasteque não tenham suas linhas em branco espremido (para que os deslocamentos número de linha pode estar errado)) .

Stéphane Chazelas
fonte
@ Sparhawk, veja editar.
Stéphane Chazelas
Não parece funcionar para mim. Nada de novo está na área de transferência. É lesssuposto dar algum tipo de feedback? jnão parece fazer nada por mim.
Sparhawk
@ Sparhawk, você tem alguma tecla personalizada para less, jdesloca uma linha ( forw-line) na tecla padrão (na verdade J( forw-line-force) seria melhor aqui, eu vou editar). |deve lhe dar algum feedback. (solicite a marca e, em seguida, o comando para inserir).
Stéphane Chazelas
Não, não fiz, mas estava testando com texto com menos de uma página, talvez por jisso não tenha feito nada. A primeira opção agora funciona (+1). A segunda opção parece bastante complicada com algumas ressalvas, então não tentei. Eu acho que vé bom o suficiente para mim.
Sparhawk