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

8

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

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

Isto tem o poder de selecionar texto com o mouse (ou seja, no modo visual), e então copiar o texto atual para a á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 copiava como espaços.

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

    
por Sparhawk 23.10.2014 / 06:01

2 respostas

5

Não é uma tarefa por menos

Não,
Eu não acho que você pode fazer isso diretamente, porque menos não tem um cursor para começar.
Ele precisaria de um para navegar até o início e fim do texto a ser selecionado.
less não é a ferramenta certa para navegação em nível de caractere.

Guias já expandidas

Você pode usar a tecla shift e 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 são organizados - menos a interpretação das guias internamente e grava apenas caracteres " " normais na tela.

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

Use vim

Se você estiver mostrando um arquivo em less , há uma boa solução:
Pressione a tecla v em less para abrir o arquivo atual em vim - asuming your $EDITOR etc. está configurado para vim .

Isso não funciona ao mostrar stdin de um pipeline ou algo assim, embora haja soluções alternativas .

Rolagem do mouse, pelo menos

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

Isso parece ser ativado por padrão, mas os eventos de 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 qual é a variável de ambiente LESS :

$ echo $LESS

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

    
por 23.10.2014 / 08:06
3

Você pode copiar a linha superior exibida em less para a seleção CLASSE X11 digitando com less :

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

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

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

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

No entanto, note que você deve pressionar Enter depois para confirmar o aviso "| done (press RETURN)".

Com xterm , você também pode definir um novo modo de seleção, por exemplo, quando estiver pressionando Ctrl + Alt ao estender a seleção que informa a less quais linhas copiar de sua tela atual:

Escreva um script lesspaste como:

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

E defina tabelas de conversão xterm (aqui na linha de comando para testes, mas você vai querer adicionar isso a um arquivo de recursos 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 para colar arrastando o mouse com Ctrl + Alt em espera e, ao liberar o Botão 1, o xterm diria menos para canalizar a tela atual para nosso lesspaste script com as coordenadas inicial e final passadas como um argumento ( y1;x1 y2;x2 ).

(note que pode não funcionar corretamente se less for invocado com -s para espremer linhas em branco (como é típico quando invocado por man ), pois a entrada que é alimentada para lesspaste será não tem suas linhas em branco espremidas (para que os deslocamentos do número de linha possam estar errados)).

    
por 29.06.2015 / 12:49

Tags