A expansão da história foi grande nos anos 80 (quando introduzida por csh
) quando os terminais eram muito lentos e limitados. O problema é que eles não são WYSIWYG. Você não vê o que ele expande até que seja tarde demais (o comando já foi iniciado) (embora alguns shell permitam executar a expansão antes de pressionar Enter).
Aqui, eu criaria um widget que insira o último elemento de pipeline no cursor. Com zsh
(adicione a ~/.zshrc
):
last-pipe-elements() {
emulate -L zsh
if [[ $WIDGET = $LASTWIDGET ]]; then
# Invoking the widget several times retrieves pipeline
# elements for older command lines
((last_pipe_elements_iteration++))
LBUFFER=$last_pipe_elements_saved_LBUFFER
else
last_pipe_elements_iteration=1
fi
last_pipe_elements_saved_LBUFFER=$LBUFFER
local -a words
words=(${(z)${history[@]}[last_pipe_elements_iteration]})
local nth_pipe=${words[(In:NUMERIC:)\|]}
((nth_pipe)) || return
LBUFFER+=${(j: :)words[nth_pipe,-1]}
}
zle -N last-pipe-elements
bindkey '\eP' last-pipe-elements
Dessa forma, você digita Alt + Shift + P (presume-se que envie a seqüência de caracteres ESC e P
, pode ser necessário adaptá-lo para o seu terminal que pode enviar \xd0
( $'\MP'
) ou mesmo \xf0
($ '\ Mp') ou algo completamente diferente, verifique com Ctrl + V ) para inserir o último elemento do pipeline (incluindo |
) do último comando, pressione-o novamente para o comando antes disso, e use Alt + 2 Alt + Shift + P para os últimos 2 elementos do pipe.
(z)
chama o analisador de shell para dividir as linhas de comando em palavras. Encontramos o |
que queremos e depois juntamos as palavras à direita do espaço one . Isso significa que |tr a b
se tornará | tr a b
, mas isso não deve afetar o significado do comando, desde que você não use construções complexas de várias linhas ( sed 's/ /x/'
não será alterado para sed 's/ /x/'
, por exemplo ).
Se você não quiser definir um novo widget, outra coisa que você pode fazer é pesquisar de volta (com Ctrl + R assumindo o modo emacs
, embora você possa fazer o equivalente em vi
mode) para o | anterior, apague para o final da linha com Ctrl + K e volte ao seu comando ( Down ) para cole-o com Ctrl + Y . Isso ainda seria mais rápido do que usar a expansão do histórico e ainda seria visual (você pode selecionar visualmente qual |
você quer cortar).