Wydaje się, że jest sporo informacji na temat edytowania i wykonywania poleceń za pomocą edytora za pomocą „edit-and-execute-command (Cx Ce)”, ale chciałbym uzyskać bieżące polecenie powłoki, zastosować pewne filtrowanie (za pomocą skryptu), a następnie zwróć go z prośbą o dalsze zatwierdzenie / ręczne zmiany przed wykonaniem. Czy to możliwe dzięki Bash?
13
edit-and-execute-command
.Escape
+V
, ale nadal będzie wykonywać polecenie. Jeśli chodzi o obejście, dodamecho
z przodu, aby go wykonać, wypisując polecenie do konsoli w celu sprawdzenia.Odpowiedzi:
Najnowsza aktualizacja mojego doświadczenia
Część
0"+y$dd
poniższego mapowania jest naprawdę czymś, o czym powinieneś dokładnie pomyśleć i dostosować ją do swojego gustu / przepływu pracy / doświadczenia.Na przykład bardzo często zdarza mi się, że kończę z wieloma liniami w buforze, gdzie chcę tylko wykonać ten, na którym znajduje się kursor; w tym przypadku mogę użyć
0"+y$dd:%d<CR>
zamiast0"+y$dd
.A to tylko jeden z możliwych scenariuszy.
Ostateczna odpowiedź dla tych, którzy lubią
vim
vim
jako swójEDITOR
/VISUAL
, aby podczas edytowania wiersza poleceniavim
używałeś go do edycji.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
swój~/.vimrc
plik do zamapowania Leaderd(którego rzadko będziesz używać podczas edycji polecenia) na akcję „usuń bieżącą linię do+
rejestru bez końcowego EOL”.+
lub*
rejestru z powyższego mapowania; sposoby wklejenia do terminala prawdopodobnie będą się różnić; musisz mieć dostęp+clipboard
do tych rejestrów .vim
edytorze naciśnijEscapeLeaderd .Oryginalna odpowiedź
Często muszę zrobić to samo i robię to w następujący sposób. (Zwykle używam
set -o vi
inbash
, więc punkty 1 i 2 poniżej są różne, jeśli używaszset -o emacs
, domyślnie; na podstawie twojego pytania wygląda na to, że punkty 1 i 2 są ujednolicone w Ctrl+, xa następnie Ctrl+ e, co jest trudniejsze do wpisania, imho .)(To tutaj zadajesz pytanie.)
URxvt
.Oczywiście jest to tylko obejście polegające na skopiowaniu edytowanego polecenia do schowka przed usunięciem całego polecenia, dzięki czemu nic nie zostanie wykonane po wyjściu z edytora; jednak jest to najlepsze, co mogę dla siebie zdobyć.
Aktualizacja
Ponieważ moje
EDITOR
(iVISUAL
) jest równevim
, kiedy edytuję polecenie, edytuję je wvim
.W związku z tym zauważyłem, że bufor ma nazwę
/tmp/bash-fc.random
, gdzierandom
jest 6-znakowym alfanumerycznym ciągiem losowym.Daje to miejsce na wiele możliwości, jeśli używasz go
vim
jako edytora, ponieważ możesz zdefiniować pewne mapowanie w.vimrc
celu wykonania całej sekwencji Escape0"+y$dd:wq. Na przykład jednym poleceniem, którego rzadko używasz podczas edycji wiersza poleceń, jest Leaderd; dlatego możesz umieścić następującymap
ping w swoim.vimrc
plikutak więc krok 4 w powyższym przepisie staje się
źródło
Nie można tego zrobić w Bash / readline, ale jest to możliwe w Zsh za pomocą
edit-command-line
polecenia:Teraz naciśnij Control- x Control- eaby otworzyć edytor, edytować linię, opuścić edytor - zobaczysz zaktualizowaną linię poleceń, ale nie zostanie ona wykonana automatycznie.
źródło
Teraz, gdy o tym myślę, być może wariant tego, co @kenorb zasugerował w komentarzu, jest najlepszym rozwiązaniem (ponieważ wydaje się, że nie ma rozwiązania), jeśli chcemy się trzymać
bash
.Możesz zamiast tego wstawić
#
(znak komentarzabash
) do poleceniaecho
. Następnie, gdy wyjdziesz z exitora, polecenie będzie nieskuteczne i będziesz musiał tylko nacisnąć arrow up(lub k, jeśli używaszset -o vi
), usunąć#
i potwierdzić.Pamiętaj, że ta strategia dodaje tylko kilka naciśnięć klawiszy, więc może być dość wydajna, w zależności od poziomu pisania.
źródło
Te elementy mogą cię przybliżyć:
a) zastąp normalne wiązanie nowego wiersza (ctrl-M)
bind -x '"\C-M":date"
b) pobrać bieżącą linię z historii za pomocą
!#
zamień datę na dowolny skrypt.
c) edytuj ręcznie
d) w razie potrzeby w jakiś sposób związać
!!:p
którym drukuje nowe polecenie do wiersza poleceń, ale go nie wykonuje, umożliwiając w ten sposób jego ręczną edycję.e) za pomocą ctrl-J prześlij edytowane polecenie zamiast nowego wiersza
albo mogą nie ...
źródło
W bash istnieje opcja modyfikowania polecenia z historii bez jego wykonywania. Nie jestem pewien, czy można do tego użyć skryptu, nie wydaje się to prawdopodobne. Chociaż możesz wprowadzać modyfikacje za pomocą modyfikatorów historii.
Oto jak to wygląda:
źródło
Chciałbym wskazać Ci środowisko Composure dla Bash (nie jestem z nim związany): https://github.com/erichs/composure
Zapewnia
draft
irevise
funkcje, które brzmią, jakby mogły pomóc w tym, co próbujesz zrobić. Oto (długi) cytat z pliku readme projektu:źródło
Nie wydaje się to możliwe przy pomocy skrótu klawiaturowego, przynajmniej:
źródło