Jak powtórzyć aktualnie wpisany parametr na konsoli bash?

23

Właśnie pisałem coś w stylu:

mv foo/bar/poit/zoid/narf.txt

i nagle zdałem sobie sprawę, cholera, muszę ponownie wpisać duże części tego parametru

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Nawet przy wypełnianiu tabulatorów jest to dość bolesne. Wiem, że mogę skopiować i wkleić parametr, wybierając tekst i klikając środkowym przyciskiem myszy, ale to nie wystarczy. Chcę pozostać na klawiaturze.

Czy jest więc sposób, aby skopiować wklej bieżący parametr linii za pomocą klawiatury?

k0pernikus
źródło
3
Moja rada nie odpowiada na twoje pytanie, ale jest małą wskazówką. Tak jak w twoim przykładzie, możesz użyć następnej konstrukcji: mv foo/bar/poit/zoid/{narf.txt,troz.txt}zamiast dwukrotnego wpisywania / kopiowania długiego adresu.
pędzi
2
Nieco krótsza niż @ rozwiązania Rush: mv foo/bar/poit/zoid/{narf,troz}.txt. Działa to szczególnie dobrze, jeśli mamy coś takiego.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@Rush Czy masz coś przeciwko wskazaniu tego jako odpowiedzi? Może nie jest to bezpośrednio to, o co prosiłem, ale z drugiej strony twoje rozwiązanie jest o wiele bardziej do tego stopnia, czego chcę. Zasługuje na znak akceptacji.
k0pernikus

Odpowiedzi:

15

Jeśli planowałem z wyprzedzeniem, używam rozszerzenia nawiasów klamrowych . W tym przypadku:

mv foo/bar/poit/zoid/{narf,troz}.txt

Oto inne podejście przy użyciu domyślnych readlineskrótów klawiaturowych:

  • mv foo/bar/poit/soid/narf.txt: początek
  • Ctrl- w: unix-word-ruboutdo usunięciafoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, przestrzeń, yankznowu dostaćmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-worddwukrotnie, aby usunąć ostatninarf.txt
  • troz.txt: wpisz inną część ogona

Jeśli spędzasz trochę czasu na używaniu bashpowłoki, zalecam okresowe czytanie listy domyślnych skrótów i wybieranie kilku, które wydają się przydatne do nauczenia się i włączenia do twojej rutyny. Rozdział 8 bashinstrukcji jest dobrym miejscem do rozpoczęcia. Znajomość skrótów może naprawdę podnieść efektywność.

jw013
źródło
Schludny! W moim przypadku musiałem nacisnąć Alt + Backspace zamiast Meta + Backspace.
k0pernikus
3
@ k0pernikus Tak na większości klawiatur, klawisz Alt to klawisz Meta.
jw013
1
Aby zapisać ponowne wpisywanie .txt, możesz nacisnąć Ctrl + Lewo (lub dowolny inny skrót, który wywołuje backward-word), następnie Lewo jeden znak, a następnie Alt + Backspace i wpisać troz.
wjandrea
24

Ekspansja historii faktycznie działa również na bieżącym poleceniu, używając oznaczenia zdarzenia !#. Połącz to z desygnatorem słowa dla ostatniego argumentu - $-, aby uzyskać właśnie wpisany parametr. Możesz używać wszystkich zwykłych modyfikatorów, więc jeśli np. Zmieniasz nazwę pliku w odległym katalogu, możesz po prostu wpisać:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
źródło
Bardzo przydatne! Działa to szczególnie dobrze z magic-spaceopcją bash w inputrc do automatycznego rozszerzania rozszerzeń historii. (Nie mogłem użyć najczęściej głosowanej odpowiedzi, ponieważ ustawiłem ^ W na łamanie ukośników, ponieważ jest to zwykle bardziej przydatne.)
Soren Bjornstad
@ SorenBjornstad alt+backspacezwykle już zatrzymuje się na ogranicznikach słów, takich jak ukośniki, więc nie musisz zmieniać sposobu ^Wuzyskania tej funkcji, możesz mieć zarówno słowa bez znaków, jak i białe znaki
Eric Renouf
14

Jak w twoim przykładzie, możesz użyć następnej konstrukcji:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

lub nawet (jak sugeruje Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

zamiast tego dwukrotnie wpisuj / kopiuj długi adres.

pośpiech
źródło
2
Nazywa się to rozszerzaniem nawiasów klamrowych .
CodeGnome
6

Bawiąc się, mam to do pracy:

mv foo/bar/poit/zoid/narf.txt

Naciśnij, Enter
aby zapisać ostatni parametr.

Teraz użyj, aby wrócić do ostatniego wpisanego wiersza. Wpisz spację i aby uzyskać ostatnio używany parametr użyj:

Alt + .

Nienawidzę prowokować błędów, ale w tym przypadku użycia zadanie zostaje wykonane.

k0pernikus
źródło
Fajnie, kolejna świetna wskazówka nauczyła się!
Bram
<kbd> Esc </kbd> + <kbd>. </kbd> to (it?) to samo co <kbd> Alt </kbd> + <kbd>. </kbd>.
Nikos Alexandris,
2

Możesz łatwo używać zmiennych:

a=test.csv ; cp $a $a.bak

Albo w ciebie przypadek (konkurencja tab note działa za pomocą części):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ppp
źródło
2

Mam to w moim ~/.inputrc:

"\ej":"!#:$\e^"

!#jest bieżącą linią, :$jest ostatnim słowem i \e^jest history-expand-line.

nisetama
źródło
należy to zaznaczyć jako odpowiedź. Naciśnięcie „alt / opcja + j” powoduje teraz skopiowanie ostatniego słowa.
mpprdev
2

Dla zshmnie pomocne są następujące skróty klawiszowe.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Więc uderzyłem Alt- Maby powtórzyć ostatni argument Alt- Kjeśli chcę usunąć części z końca ścieżki.

Oto przydatne odniesienie do niektórych zachowań, które można zmapować.

bdellaterra
źródło
2

Krótkie interaktywne dwuetapowe rozwiązanie

  1. rodzaj: echo foo/bar/poit/zoid/narf.txt

    To sprawia, że foo/bar/poit/zoid/narf.txtdostępne dla Alt- .skrót w bash.

  2. wpisać: mva hitem Alt- ., Space, Alt-.

    Dostaniesz mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Teraz możesz łatwo zmodyfikować ostatnie słowo.

Dowódca północy

To narzędzie, które może być (bardzo) przydatne, to menedżer plików uruchomiony w konsoli. Daje to możliwość interaktywnego kopiowania nazw plików i ścieżek katalogów do wiersza poleceń. Midnight Commander pokazuje zatem 2 panele (lewy i prawy), które wyświetlają zawartość różnych katalogów.

Krótki przewodnik:

  • Up/ DownKlawisze strzałek wybierają pliki w bieżącym panelu.
  • Tab przełącza między lewym a prawym panelem.
  • Ctrl- Shift- Enterkopiuje aktualnie wybrany plik do wiersza poleceń (w tym pełną ścieżkę)
  • Alt- ootwiera aktualnie wybrany katalog w drugim panelu
  • Ctrl- opozwala zobaczyć konsolę na pełnym ekranie
  • Ctrl- x, pkopiuje ścieżkę aktywnego panelu do konsoli
  • Ctrl- x, Ctrl- pkopiuje ścieżkę nieaktywnego panelu do konsoli
  • Esc- Tabjest autouzupełnianiem

Jest to zdecydowanie najszybszy sposób, jaki do tej pory znalazłem - po tym, jak przyzwyczaiłem się do skrótów.

Markus Dutschke
źródło
0

Użyj tego samego w {,} „powielaczu”. To znaczy:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
źródło