Ostatni parametr ostatniego polecenia w bash w trybie vi

19

Zostałem przekonany (w trakcie przepełnienia stosu) do korzystania z mojego ukochanego basha w trybie vi. Do tej pory całkiem się do tego przyzwyczaiłem i podoba mi się to.

Jednak tak naprawdę brakuje mi jednej funkcji: w trybie emacsa można wprowadzić ostatni parametr poprzedniego polecenia, naciskając „ESC”. (To znaczy, naciśnij klawisz Escape, a następnie.)

Czy istnieje domyślne powiązanie wstawiania ostatniego parametru w trybie vi? Nie udało mi się go znaleźć i naprawdę tęsknię za tym poleceniem ...

Mo.
źródło

Odpowiedzi:

9

Nie ma domyślnego. Wiązanie dla „yank-last-arg” (zgodnie z listą „bind -p”) znika po przejściu do trybu vi.

bind '"\e."':yank-last-arg

da ci to samo wiązanie z powrotem (lub wybierz coś innego)

Polsy
źródło
1
klon do zshbindkey "\e." insert-last-word
jhvaras
Mam go od lat na Zsh i za każdym razem, gdy jestem zmuszony używać bash (np. Na serwerze w pracy), zapominam, że nigdy nie wymyśliłem, jak ustawić bash. Już nie! To w połączeniu z history-search-backwardsjest nieocenione dla poważnych użytkowników linii poleceń.
Sridhar Sarnobat
11

Istnieje (vi-yank-arg), domyślnie odwzorowany na „_”. To powinno zrobić, co chcesz (w trybie poleceń).

Mika Fischer
źródło
+1. Nie jestem pewien, dlaczego ta odpowiedź nie została zaakceptowana.
Sathyam,
7

Niezupełnie to samo, ale w obu trybach możesz pisać !$, a zostanie zastąpione ostatnim słowem poprzedniego polecenia. Znajdź więcej takich rzeczy w instrukcji .

legoscia
źródło
Wystarczająco blisko, aby uzyskać głos uprzywilejowany, ale nie dokładnie taki sam ... Brakuje mi możliwości edycji linii przed jej wykonaniem. Ale i tak bardzo dziękuję!
Pon.
5

Plik ~ / .inputrc może skonfigurować mapę kluczy (można ją wygenerować ręcznie, jeśli nie można jej znaleźć). Dodaj następujące polecenie do ~ / .inputrc :

"\e.": yank-last-arg
"\e_": yank-last-arg

Mój ~ / .inputrc to:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

"\e.": yank-last-arg
"\e_": yank-last-arg

Możesz znaleźć szczegółowe informacje na temat readline i bind -ptutaj: http://linux.about.com/library/cmd/blcmdl3_readline.htm

I kilka informacji o ślepych klawiszach Vi w bash i Ściągawka w trybie edycji Readline VI

Marslo
źródło
3

Wewnątrz .bashrc dodaj te:

set -o vi
bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

Przywrócą one domyślne zachowanie nie tylko kropki ESC - ale także Ctrl-A, Ctrl-E, Ctrl-W i Ctrl-L. Możesz więc cieszyć się normalnym trybem bash vi i nadal używać skrótów, które znasz i lubisz. Jeśli potrzebujesz więcej akcji, po prostu zaznacz „man bash”, aby znaleźć nazwę potrzebnej akcji readline (np. „Wyczyść ekran”, „koniec linii” itp.).

ttsiodras
źródło
0

Możesz użyć, $_aby odwołać się do ostatniego argumentu poprzedniego polecenia.

Wady to:

  1. Nie możesz zweryfikować przed naciśnięciem klawisza Enter, że wstawiona rzecz jest rzeczą, którą chcesz wstawić.

  2. Jeśli użyjesz PROMPT_COMMAND lub pułapki DEBUG (nie jestem pewien, co dokładnie powoduje problem; mam oba w moim .bashrc), aby zrobić wymyślne rzeczy, takie jak wstawienie uruchomionego polecenia w tytule xterm, to się zatnie $_.

Marius Gedminas
źródło