Eu tive isso no meu ~/.screenrc
por um tempo:
bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline
Basicamente, digitando ¬ 1 dentro da tela, insere a primeira linha acima do cursor, ¬ 2 a segunda linha e assim por diante.
No meu ~/.Xdefaults
, também tenho:
XTerm.VT100.translations: #override\
Meta <KeyPress> /: dabbrev-expand()
Que permite que xterm
complete (com Alt + / ) o que está na tela (olhando para trás a partir da posição do cursor).
Com zsh
, quando usado em screen
, você poderia fazer:
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
killring=(${(Oaf)"$(<~/.lastoutput)"})
CUTBUFFER=$killring[1]
killring[1]=()
}
zle -N copy-screen
bindkey '\ec' copy-screen
para ligar Alt + C ao widget que armazena as linhas acima do cursor no buffer de corte e no anel kill (o que você cola com Ctrl + Y e ciclo através de Alt + Y no modo emacs
). (o acima assume que screen
foi iniciado a partir do seu diretório pessoal).
Se o texto inserido precisar ser citado (porque contém espaços ou outros caracteres especiais de shell, por exemplo), você pode digitar Alt + " para zsh
para citá-lo.
Como exemplo, você acabou de executar:
$ find /usr/local -size +1M
/usr/local/lib/liblzma.a
/usr/local/share/doc/sudo/ChangeLog
/usr/local/share/perl/5.18.2/Unicode/Unihan/Definition.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_TSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/HanYu.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSUnicode.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_GSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGHanyuDaZidian.db
E você deseja abrir vim
no sudo ChangeLog acima. Com a primeira abordagem, você digitaria:
vim ¬9
Com a segunda abordagem:
vim /usAlt+/
E repita que Alt + / até chegar ao changelog.
Com a terceira abordagem:
vim Alt+CCtrl+YAlt+Y
E repita que Alt + Y até chegar ao changelog.
A última abordagem pode ser usada para sua consulta $s1
.
Em vez de armazenar na matriz killring
, armazene em uma matriz (como $s
) e use $s[1]
para a primeira linha, $s[2]
para a segunda ...
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
s=(${(Oaf)"$(<~/.lastoutput)"})
}
zle -N copy-screen
bindkey '\ec' copy-screen
Aquele Alt + C armazena as linhas acima do cursor na matriz s
.
Em qualquer caso, o que estamos recuperando é o que é exibido na tela, o que não é necessariamente o mesmo que o resultado do último comando. Por exemplo, printf 'a\bc \n'
produz 5 bytes a
, BS, c
, SPC e LF, mas exibe apenas c
.