Najszybszy sposób przesuwania kursora w linii poleceń terminala?
Jaki jest najlepszy sposób poruszania się po danej bardzo długiej linii poleceń w terminalu?
Powiedzmy, że użyłem klawisza strzałek lub Ctrl-R {[7] } aby uzyskać tę długą linię poleceń:
./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50
Teraz muszę przesunąć (zaczynając od początku lub końca linii) kursor do --option25
aby coś tam zmodyfikować.
Jaki jest najszybszy sposób, aby się tam dostać? To co zwykle robię to Ctrl-A aby dostać się do początku, a następnie wielokrotnie Alt-F aby przejść do przodu, słowo po słowie (lub Ctrl-E to go the end and Alt-B to then go backward). Ale na długiej linii, która zajmuje zbyt dużo czasu. Musi być jakiś sposób, aby wyszukać i przejść bezpośrednio do części, którą muszę zmodyfikować, np. option25
?
14 answers
Ponieważ to nie zostało jeszcze zamknięte, oto kilka dodatkowych opcji.
- użyj Ctrl+x {[15] } po którym następuje Ctrl+e aby otworzyć bieżącą linię w edytorze określonym przez
$FCEDIT
lub$EDITOR
lubemacs
(próbowano w tej kolejności). - Jeśli uruchomiłeś komendę wcześniej, naciśnij Ctrl+r dla przeszukiwania historii odwrotnej i wpisz
option25
(w tym przypadku). Linia zostanie wyświetlona. Kliknij Tab {[15] } aby rozpocząć edycję w tym punkt. - użyj rozszerzenia historii za pomocą modyfikatora
s///
. Np.!-2:s/--option25/--newoption/
powtórzyłoby polecenie przedostatnie, ale zastąpiłoby opcję25. Aby zmodyfikować ostatnie polecenie./cmd
, użyj składni!string
:!./cmd:s/--option25/--newoption/
W miejsce / w zastępstwie można użyć dowolnego ogranicznika. - jeśli edytujesz poprzedni wiersz, możesz użyć szybkiego zastępowania:
^--option25^--newoption
- wyszukiwanie znaków. Zostało to wspomniane przez Pax i można to zrobić w zwykłym trybie Emacsa za pomocą Ctrl+] for forward Szukaj i Ctrl+Alt+] do wyszukiwania wstecz.
Polecam drugą opcję. Ctrl+r jest naprawdę poręczny i szybki, bez mieszania się z edytorami, i widzisz wyniki przed uruchomieniem polecenia (w przeciwieństwie do rozszerzeń historii).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 13:01:12
Aby było jasne, nie chcesz " szybkiego przesuwania kursora po linii poleceń terminal". To, czego naprawdę chcesz, to szybki sposób poruszania się po linii poleceń w programie shell .
Bash jest na przykład bardzo powszechną powłoką. Używa biblioteki Readline do implementacji wprowadzania wiersza poleceń. I tak powiem, bardzo wygodne jest poznanie wiązań Readline, ponieważ jest on używany nie tylko w bash. Na przykład, gdb używa również Readline do przetwarzania wejście.
W dokumentacji Readline znajdziesz wszystkie powiązania związane z nawigacją (i nie tylko): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction
Krótki kopiuj-wklej jeśli powyższy link pójdzie w dół:
Bare Essentials- Ctrl-b Przesuń do tyłu o jeden znak.
- Ctrl-f Przesuń do przodu o jeden znak.
- [DEL] lub [Backspace] Usuń znak po lewej stronie kursora.
- Ctrl-D Usuń znak pod spodem kursor.
- Ctrl - _ lub C-x C-u cofa ostatnie polecenie edycji. Możesz cofnąć całą drogę z powrotem do pustej linii.
Ruch
- Ctrl-A przesunięcie do początku linii.
- Ctrl-e przesunięcie do końca linii.
- Meta-F Przesuń do przodu słowo, gdzie słowo składa się z liter i cyfr.
- Meta-b Przesuń słowo do tyłu.
- Ctrl-l Wyczyść ekran, przedrukowując bieżącą linię u góry.
Zabić i yank
- Ctrl-k wyłącza tekst od bieżącej pozycji kursora do końca wiersza.
- M-D zabić od kursora do końca bieżącego słowa, lub, jeśli między słowami, do końca następnego słowa. Słowa są takie same jak te używane przez M-f.
- m - [DEL] Usuń z kursora początek bieżącego słowa lub, jeśli pomiędzy słowami, początek poprzedniego słowa. Słowa są takie same jak te używane przez M-B.
- Ctrl-w zabijanie z kursora do poprzednie białe znaki. To jest INNE niż M-ponieważ granice słowa różnią się.
- Ctrl-y przesuwa ostatnio zabity tekst z powrotem do bufora przy kursorze.
- M-Y Obróć kill-ring i wyciągnij nowy szczyt. Można to zrobić tylko wtedy, gdy wcześniejsze polecenie to C-Y lub M-Y.
M jest meta kluczem. Dla Max OS X Terminal możesz włączyć "Użyj opcji jako klawisz meta" w Ustawieniach / klawiaturze. Dla Linuksa jest to bardziej skomplikowane.
Update
Także zauważ, że Readline może działać w dwóch trybach:
- tryb emacs (który jest domyślny)
- vi mode
Aby przełączyć Bash na tryb vi:
$ set -o vi
Osobiście wolę tryb vi, ponieważ używam Vima do edycji tekstu.
Bonus
W macOS Terminal app (i w iTerm też) można wybrać opcję-Kliknij, aby przesunąć kursor (kursor przesunie się do klikniętej pozycji). To działa nawet wewnątrz vim
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-15 20:48:25
Przytrzymaj klawisz Option i kliknij tam, gdzie chcesz, aby kursor się poruszał, a Terminal przyspieszy kursor w tym precyzyjnym miejscu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 12:44:50
Preferuję tryb edycji vi (ponieważ te naciśnięcia klawiszy są teraz osadzone w moim rdzeniu kręgowym (mózg w ogóle nie jest używany), wraz z CTRL-K, CTRL-X z WordStar 3.3 :-). Możesz użyć wiersza poleceń set -o vi
, aby go aktywować (i set -o emacs
, aby przywrócić).
W Vi, byłoby (ESC-K, aby uzyskać linię najpierw oczywiście) "f5;;B
" (bez podwójnych cudzysłowów).
Oczywiście, musisz zrozumieć, co jest na linii, aby uciec z tego. Zasadniczo jest to
f5 to find the first occurrence of "5" (in --option5).
; to find the next one (in --option15).
; to find the next one (in --option25).
B to back up to the start of the word.
Zobaczmy jeśli miłośnicy Emacsa mogą wymyślić lepsze rozwiązanie, mniej niż 5 klawiszy (choć nie chcę rozpoczynać wojny religijnej).
Czy zastanawialiście się, czy nie chcielibyście umieścić tego potwornie długiego polecenia w skrypcie? :-)
Właściwie, mogę pójść o jeden lepszy niż to: "3f5B
", aby znaleźć trzecie wystąpienie "5", a następnie wrócić do początku słowa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-19 02:14:07
Użyj Meta - B / Meta-f, aby poruszać się do tyłu/do przodu odpowiednio o słowo.
W OSX meta tłumaczy się jako ESC, co jest do bani.
Ale alternatywnie możesz otworzyć preferencje terminala -> Ustawienia -> Profil -> klawiatura i zaznaczyć "użyj opcji jako klawisz meta"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-11 11:28:17
Po jednokrotnym uruchomieniu polecenia Uruchom fc
Uruchomi się $EDITOR
z poprzednim poleceniem, a następnie możesz użyć zwykłego edytora do modyfikacji polecenia. Po zapisaniu i zakończeniu plik zostanie wykonany.
..ale, jak powiedział Pax - wiersz poleceń nie jest szczególnie dobry do edycji absurdalnie długich linii-dlaczego nie zrobić polecenia w skrypcie?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 12:46:15
Jeśli chcesz przejść do przodu pewną liczbę słów, naciśnij M-<n>
(M-
jest dla Meta i jego Zwykle klawisz escape) następnie naciśnij numer. Spowoduje to wysłanie argumentu repeat do readline, więc możesz powtórzyć dowolne polecenie - jeśli chcesz iść do przodu, naciśnij M-<n> M-f
, a kursor przesunie się do przodu <n>
liczba słów.
Np.
$|echo "two three four five six seven"
$ M-4
(arg: 4) echo "two three four five six seven"
$ M-f
$ echo "two three four| five six seven"
Więc dla przykładu z kursora na początku wiersza trafisz, {[5] } i twój kursor będzie na --option25|
- lub- z koniec linii M-26 M-b
oznaczałby kursor --|option25
Przyrostowe wyszukiwanie historii
W terminalu wpisz:
gedit ~/.inputrc
Następnie skopiuj wklej i zapisz
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
Wszystko, co musisz zrobić, aby znaleźć poprzednie polecenie, to wpisać powiedz pierwsze 2 lub 3 litery, a strzałka w górę zabierze cię tam szybko powiedz chcę:
for f in *.mid ; do timidity "$f"; done
All I need to do is enter
fo
I naciśnij strzałkę w górę, wkrótce pojawi się
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 06:59:06
Jedną z opcji jest użycie M-x shell
W emacs
. To zapewnia wszystkie funkcje edycji i naciśnięcia klawiszy, które ma emacs
, więc C-s
może być używany do wyszukiwania tekstu option25
, na przykład.
(ale nadal wolałbym być w prawdziwej powłoce terminala, jeśli ktoś może wskazać mi dobre wyszukiwanie i edytowanie obiektów.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 18:19:40
Użyj myszki
Czasami najprostszym sposobem edycji wiersza poleceń jest użycie myszy. Niektóre poprzednie odpowiedzi dają polecenie, aby otworzyć bieżącą linię w twoim $EDITOR. Dla mnie (zhs z konfiguracją grml) tą kombinacją jest Alt+e
. Jeśli włączysz mysz w edytorze, możesz z niej skorzystać.
Aby włączyć mysz w Vimie, dodaj ją do swojego~/.vimrc
set mouse=a
set ttymouse=xterm2
Jeśli chcesz wykonać zaznaczenie tekstu w terminalu (zamiast przenosić mysz do Vima), przytrzymaj Shift po kliknięciu; jest to oczywiście specyficzne dla terminala.
Administratorzy nie powinni bać się myszy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-13 12:49:57
W Cygwinie możesz aktywować tę funkcję klikając prawym przyciskiem myszy okno. W wyskakującym oknie wybierz opcję Options... - > Mysz - > Aktywuj klikamy Umieść kursor wiersza poleceń - > Zastosuj.
Od teraz po prostu kliknięcie lewym przyciskiem myszy w jakiejś pozycji w wierszu poleceń spowoduje umieszczenie kursora w tym miejscu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 13:00:00
Pierwszy: export EDITOR= 'nano-m'
Then: CTRL+X Ctrl + E w sekwencji.
Bieżąca linia otworzy się w edytorze nano z włączoną myszką. Możesz kliknąć w dowolną część tekstu i edytować
Następnie CTRL + X, aby zakończyć i y, aby potwierdzić zapis.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-29 18:46:53
Zrobiłem skrypt aby linia poleceń kursor poruszał się po kliknięciu myszką :
- włącz raportowanie śledzenia myszy xterm
- Ustaw powiązania readline tak, aby pochłaniały sekwencję ucieczki generowaną przez kliknięcia
Więcej informacji o kolejny post
Będzie działać, jeśli echo -e "\e[?1000;1006;1015h" # Enable tracking
wyświetli sekwencje specjalne na terminalu po kliknięciu myszką
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-31 05:06:06
Może nie jest najszybszy, ale to musi być tutaj, trochę czytania o ruchach kursora ANSI
sekwencje escape ANSI pozwalają na dowolne przesuwanie kursora po ekranie. Jest to bardziej przydatne dla pełnoekranowych interfejsów generowanych przez skrypty powłoki, ale może być również używane w podpowiedziach . Sekwencje ucieczki ruchu są następujące:
- Position the Cursor:
\033[<L>;<C>H
Or
\033[<L>;<C>f
puts the cursor at line L and column C.
- Move the cursor up N lines:
\033[<N>A
- Move the cursor down N lines:
\033[<N>B
- Move the cursor forward N columns:
\033[<N>C
- Move the cursor backward N columns:
\033[<N>D
- Clear the screen, move to (0,0):
\033[2J or \033c
- Erase to end of line:
\033[K
- Save cursor position:
\033[s
- Restore cursor position:
\033[u
(...)
spróbuj umieścić następujący wiersz kodu w prompt (jest to trochę jaśniejsze, co robi, jeśli prompt jest kilka linii w dół terminala, gdy umieścić go w): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"
to powinno przesunąć kursor siedem linii w górę ekranu, wydrukować słowo "BASH", a następnie wrócić do miejsca, w którym zaczął produkować normalny prompt.
Przykłady :
Przesuń kursor do tyłu o 7 linii:
echo -e "\033[7A"
Przesuń kursor do linii 10, kolumny 5:
echo -e "\033[10;5H"
Szybko echo kody kolorów , aby pokolorować program:
echo -e "\033[35;42m" ; ifconfig
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-24 01:23:38