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?

Author: Celeritas, 2009-03-18

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 lub emacs (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).

 112
Author: Pianosaurus,
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.

 207
Author: wonder.mice,
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.

 37
Author: Connecting life with Android,
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.

 12
Author: paxdiablo,
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"

 9
Author: Edson Medina,
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?

 8
Author: dbr,
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

 4
Author: ,
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
2015-01-06 06:37:22

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ę

 2
Author: Alexandr,
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.)

 1
Author: Frank,
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.

 0
Author: user7610,
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.

 0
Author: Abdull,
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.

 0
Author: Sunfloro,
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ą :

  1. włącz raportowanie śledzenia myszy xterm
  2. Ustaw powiązania readline tak, aby pochłaniały sekwencję ucieczki generowaną przez kliknięcia
Można go znaleźć na github

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ą

 0
Author: Tinmarino,
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
 0
Author: NVRM,
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