Pergunta

No meu .zshrc, uso o trecho a seguir para integrar a área de transferência do shell e minha área de transferência X11 principal.Graças a essa integração, posso recortar e colar texto de e para emacs, firefox e terminal sem precisar usar o mouse.

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y

Observação:Eu também uso esse truque no Mac OS X (com pbcopy/pbpaste em vez de xclip) e graças a Sinergia meus dois computadores compartilham uma única área de transferência.Organizado.Mas não funciona com readline.E eu me pego usando readline com bastante frequência, por exemplo em (i)python, em gdb, em ncftp...

Então aí vem minha pergunta: existe uma maneira de integrar a área de transferência do readline com o resto do mundo?

Claro, estou pensando em alguns .inputrc magia aqui, mas qualquer visão/idéia seria bem-vinda.

Foi útil?

Solução

Pessoalmente, eu corro tudo dentro Tela GNU.Isso me dá toneladas de funcionalidades em todos os programas baseados em terminal, não apenas nos baseados em readline.Ele possui seu(s) próprio(s) buffer(s) de colagem, que são compartilhados entre todas as telas da sua sessão atual, e pode ler/gravar um arquivo de troca (configurável com bufferfile).

  • Uma seleção de tela é feita com Ctrl+A, [, <movimento>, Espaço, <movimento>;
  • copiado para o buffer de colagem com Digitar;
  • colado com Ctrl+A, ];
  • substituído pelo conteúdo do arquivo de troca com Ctrl+A, <;
  • e gravado no arquivo de troca com Ctrl+A, >.

Então tudo que você precisa são pequenos ajudantes para sincronizar /tmp/screen-exchange e a seleção X.Algo tão simples como isso funcionaria.

# ~/.screenrc (or entered at C-a : command prompt)
bind '{' exec sh -c 'xclip -o>~/.screen_exchange'
bind '}' exec sh -c 'xclip -i ~/.screen_exchange'

É claro que algumas ligações e macros melhores tornariam a vida mais fácil (isso requer C-a { C-a < C-a ] para colar a seleção X no terminal), mas isso depende totalmente de você.

Outras dicas

Bash 4.0 introduz algumas novas funcionalidades:

NOTÍCIAS

O comando atribuído a uma sequência de teclas com `bind -x'Agora define duas novas variáveis ​​no ambiente do comando executado: READLINE_LINE_BUFFERe READLINE_POINT.O comando pode alterar a linha de leitura atual e a posição do cursor modificando READLINE_LINE_BUFFER e READLINE_POINT, respectivamente.

O NEWS o arquivo parece impreciso; READLINE_LINE (não _BUFFER) é o que está documentado em outro lugar e realmente funciona.

O seguinte irá simular o comportamento do Bash existente Ctrl+(você|K|S), mas afetando a seleção X, embora eu use meta/Esc porque não gosto de substituir funcionalidades existentes.

_xdiscard() {
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=0
}
_xkill() {
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}"
}
_xyank() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}"
}
bind -m emacs -x '"\eu": _xdiscard'
bind -m emacs -x '"\ek": _xkill'
bind -m emacs -x '"\ey": _xyank'

eu ainda gosto screen mais, mas isso responde melhor à sua pergunta - contanto que o único aplicativo readline de seu interesse seja o Bash.

Eu gostaria de propor o seguinte _xyank() função baseada na resposta do efemiente:

_xyank() {
    CLIP=$(xclip -o)
    COUNT=$(echo -n "$CLIP" | wc -c)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + $COUNT))
}

O que isso faz é mover o cursor para o final do texto arrancado, tornando-o mais consistente com outros comandos integrados.

Como eu escrevi aqui, descobri que pode ser melhor ter atalhos de teclado separados para preencher a área de transferência do X, isso ocorre porque costumo usar "kill" para manipulação de texto no Readline e não quero que isso apague a área de transferência todas as vezes.

Quando o Readline conseguir ter atalhos de teclado que acionam interações com o X, eu recomendo vincular ^Xw e ^Xy para copiar e colar.

Sei que isso não fornece uma solução para sua pergunta, mas não tenho representantes suficientes para dizer isso em um comentário.

Quanto à extensão do Readline com a capacidade de vincular teclas a comandos, mencionei isso na lista de discussão do Readline, veremos o que Chet diz:

https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top