Comando Bash para copiar antes do cursor e colar depois?

24

Não sei como dizer isso, mas muitas vezes me encontro digitando comandos assim:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Eu costumo apenas digitar o caminho duas vezes (com conclusão de tabulação) ou vou copiar e colar o caminho com o cursor. Existe algum bashfoo que facilita a digitação?

    
por user1028270 12.10.2016 / 17:17

5 respostas

43

Existem alguns truques (há uma duplicata a ser encontrada, eu acho), mas para isso eu costumo fazer

cp /etc/prog/dir1/myconfig.yml{,.bak}

que é expandido para o seu comando.

Isso é conhecido como expansão de contraventores . Na forma usada aqui, a expressão {} especifica um número de cadeias separadas por vírgulas. Esses "expandem" toda a expressão /etc/prog/dir1/myconfig.yml{,.bak} , substituindo a parte {} por cada sequência: a sequência vazia, dando /etc/prog/dir1/myconfig.yml e, em seguida, .bak , dando /etc/prog/dir1/myconfig.yml.bak . O resultado é

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Essas expressões podem ser aninhadas:

echo a{b,c,d{e,f,g}}

produz

ab ac ade adf adg

Há uma variante usando números para produzir seqüências:

echo {1..10}

produz

1 2 3 4 5 6 7 8 9 10

e você também pode especificar a etapa:

echo {0..10..5}

produz

0 5 10
    
por 12.10.2016 / 17:19
12

A expansão do histórico pode ser útil para esse tipo de coisa (supondo que o histórico bash esteja ativado).

No seu exemplo, você poderia fazer:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

Aqui, o !# refere-se à linha atual, !#:1 refere-se ao parâmetro 1 na linha atual,
e !#:1.bak refere-se ao parâmetro 1 na linha atual com '.bak' no final.

Quando você digitar o especificador de histórico, você pode usar Ctrl + Alt + E para expandi-lo ao seu valor real se você quer por exemplo verifique ou modifique o nome do arquivo.

A seção "Expansão do histórico" nas páginas man do bash tem mais informações.

    
por 13.10.2016 / 03:05
8

Semelhante à resposta da progo, mas um pouco mais simples: C-w cuts ("mata") a palavra à esquerda do cursor, C-y insere ("yanks") novamente.

$ cp /etc/dir1/myconfig.yml█                              (C-w)
$ cp █                                                    (C-y)
$ cp /etc/dir1/myconfig.yml█                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml█       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak█
    
por 13.10.2016 / 10:58
6

Você também pode, na verdade, copiar e colar (kill-yank em termos emacs / bash) da linha de comando para duplicar partes para edição.

M-d mata para frente até o limite da palavra, e você pode matar o texto várias vezes e todos eles serão concatenados juntos para um único 'colar' para puxar. Conveniente!

Coloque tudo de volta na linha de comando no cursor por C-y . Então, se você tem uma linha como essa (o elemento de bloco █ indica a posição do cursor):

$ cp avb.txt█                 (M-b M-b)
$ cp█avb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt█                 (C-y) yank it again
$ cp avb.txt avb█             finish the line
$ cp avb.txt avb.foo█

De qualquer maneira você prefere fazê-lo, familiarizar-se com o que o bash tem a oferecer no departamento de chave interativa será benéfico. link

    
por 13.10.2016 / 08:02
6

Em tcsh ou zsh , Alt + Ctrl + _ no modo emacs ( copy-prev-word widget) insere a última palavra, então

cp very-long-path Alt+Ctrl+_.back

bash tem um widget copy-backward-word (não vinculado a nenhuma tecla por padrão), mas que copia apenas a palavra para o buffer de anel, também é necessário pressionar Ctrl-Y ( no modo emacs ) para arrancá-lo. Mas você poderia fazer:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Para que Alt + Ctrl + _ faça a cópia / snarf e cole / arranca como em tcsh / zsh .

    
por 13.10.2016 / 13:18