Najszybszy sposób (y) na przesuwanie kursora w wierszu poleceń terminala?

156

Jaki jest najlepszy sposób poruszania się po danej bardzo długiej linii poleceń w terminalu?

Powiedzmy, że użyłem klawisza strzałki lub Ctrl- Raby uzyskać ten długi wiersz 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, aby --option25coś tam zmodyfikować.

Jak najszybciej się tam dostać? To, co zwykle robię, to Ctrl- Aaby przejść do początku, a potem powtarzać Alt- Fiść naprzód, słowo po słowie (lub Ctrl- Eiść do końca i Alt- Bpotem cofać się). Ale w długiej kolejce zajmuje to zbyt dużo czasu. Musi istnieć sposób, aby wyszukać i przejść bezpośrednio do części, którą muszę zmodyfikować, np. option25?

Szczery
źródło

Odpowiedzi:

107

Ponieważ nie zostało to jeszcze zamknięte, oto kilka innych opcji.

  • Użyj Ctrl+, xa następnie Ctrl+, eaby otworzyć bieżący wiersz w edytorze określonym przez $FCEDITlub $EDITORlub emacs(próbowano w tej kolejności).
  • Jeśli uruchomiłeś polecenie wcześniej, naciśnij Ctrl+, raby przeszukać historię wstecz i wpisz option25(w tym przypadku). Linia zostanie wyświetlona. Kliknij, Tababy rozpocząć edycję w tym momencie.
  • Użyj rozszerzenia historii z s///modyfikatorem. Np !-2:s/--option25/--newoption/. Uruchomi przedostatnią komendę, ale zamieni opcję25. Aby zmodyfikować ostatnią ./cmdkomendę, użyj !stringskładni: !./cmd:s/--option25/--newoption/
    Zamiast / w podstawieniu można użyć dowolnego separatora.
  • Jeśli edytujesz poprzednią linię, możesz użyć szybkiego zastępowania: ^--option25^--newoption
  • Wyszukiwanie postaci. Wspomniał o tym Pax i można to zrobić w zwykłym trybie emacsa za pomocą Ctrl+ ]dla wyszukiwania w przód i Ctrl+ Alt+ ]dla wyszukiwania wstecz.

Polecam drugą opcję. Ctrl+ rjest naprawdę poręczny i szybki, nie ma problemów z edytorami, a wyniki widać przed wykonaniem polecenia (w przeciwieństwie do rozszerzeń historii).

Pianozaur
źródło
203

Żeby było jasne, nie chcesz „szybkiego sposobu przesuwania kursora w wierszu poleceń terminala ”. To, czego naprawdę chcesz, to szybki sposób poruszania się po linii poleceń w twojej powłoce programie .

Na przykład Bash jest bardzo popularną powłoką. Używa Readline biblioteki do implementacji danych wejściowych wiersza poleceń. Można powiedzieć, że znajomość powiązań Readline jest bardzo wygodna, ponieważ jest używana nie tylko w bash. Na przykład gdb używa również Readline do przetwarzania danych wejściowych.

W dokumentacji Readline można znaleźć wszystkie powiązania związane z nawigacją (i nie tylko): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Krótkie kopiowanie i wklejanie, jeśli powyższy link nie działa:

Najpotrzebniejsze rzeczy

  • Ctrl-b Cofnij się o jeden znak.
  • Ctrl-f Przejdź do przodu o jeden znak.
  • [DEL] lub [Backspace] Usuń znak po lewej stronie kursora.
  • Ctrl-d Usuń znak pod kursorem.
  • Ctrl-_ lub Cx Cu Cofnij ostatnie polecenie edycji. Możesz cofnąć całą drogę z powrotem do pustej linii.

Ruch

  • Ctrl-a Przejdź na początek wiersza.
  • Ctrl-e Przejdź na koniec wiersza.
  • Meta-f Przechodzi do przodu o słowo, które składa się z liter i cyfr.
  • Meta-b Cofnij słowo.
  • Ctrl-l Wyczyść ekran, ponownie drukując bieżącą linię u góry.

Zabijaj i szarp

  • Ctrl-k Zabij tekst od aktualnej pozycji kursora do końca linii.
  • Md Zabij od kursora do końca bieżącego słowa lub, jeśli między słowami, do końca następnego słowa. Granice słów są takie same, jak te używane przez Mf.
  • M- [DEL] Zabija od kursora początek bieżącego słowa lub, jeśli jest między słowami, początek poprzedniego słowa. Granice słów są takie same, jak te używane przez Mb.
  • Ctrl-w Zabij od kursora do poprzedniej białej spacji. To jest inne niż M-, ponieważ granice słów są różne.
  • Ctrl-y Yankuje ostatnio zabity tekst z powrotem do bufora przy kursorze.
  • Mój Obróć pierścień zabijania i szarp za nowy szczyt. Możesz to zrobić tylko wtedy, gdy poprzednie polecenie to Cy lub My.

M to klucz Meta. W terminalu Max OS X możesz włączyć opcję „Użyj opcji jako klucza meta” w Ustawieniach / Klawiatura. W przypadku Linuksa jest to bardziej skomplikowane.

Aktualizacja

Zwróć również uwagę, że Readline może działać w dwóch trybach:

  • tryb emacs (który jest domyślny)
  • tryb vi

Aby przełączyć Bash na tryb vi:

$ set -o vi

Osobiście wolę tryb vi, ponieważ używam vim do edycji tekstu.

Premia

W aplikacji Terminal macOS (a także w iTerm) możesz przesunąć kursor z naciśniętym klawiszem Option (kursor przesunie się do klikniętej pozycji). To działa nawet w środku vim.

cud. mice
źródło
3
Wolę tę odpowiedź, ponieważ zawiera [istotę / korzeń / powód], jak działa klawiatura bash (skąd pochodzi), tj. Readline.
eugenevd
6
W standardowym terminalu Ubuntu Meta (M) to Alt + Shift, chyba że wyłączysz skróty klawiaturowe dostępu do menu, w którym to przypadku jest to po prostu Alt.
brianpeiris
2
W Kde w Konsole Meta (M) to klawisz alt
Pipo
Problem polega na tym, że Meta + F nie działa, jeśli Meta jest ustawiona na ALT, ponieważ ALT daje dostęp do menu uruchomionego programu (w tym przypadku terminala). Czy jest alternatywa?
Pithikos
1
co to jest Mf, więc nie używasz tu kontroli, więc co to jest?
PositiveGuy,
33

Przytrzymaj klawisz Option i kliknij miejsce, w którym chcesz przesunąć kursor, a Terminal przesuwa kursor w to dokładne miejsce.

Łączenie życia z Androidem
źródło
2
Właśnie zduplikowałeś moją skuteczność
Lay González
W jakich środowiskach to działa? Myślę, że tylko w systemie Mac OS?
Abdull
Działa na zdalnym ssh linux, nawet przez serwer przesiadkowy.
John Jiang,
10

Zwykle wolę 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), razem z CTRL-K, CTRL-X z WordStar 3.3 :-). Możesz użyć wiersza poleceń, set -o viaby go aktywować (iset -o emacs przywrócić).

W Vi byłoby to (oczywiście ESC-K, aby ustawić linię jako pierwszą) " f5;;B" (bez podwójnych cudzysłowów).

Oczywiście musisz zrozumieć, co się dzieje, aby ujść z tego na sucho. Zasadniczo tak

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, czy miłośnicy emacsa mogą wymyślić lepsze rozwiązanie, mniej niż 5 naciśnięć klawiszy (chociaż nie chcę rozpoczynać wojny religijnej).

Czy zastanawiałeś się, czy może chciałbyś umieścić to przerażająco długie polecenie w skrypcie? :-)

Właściwie mogę pójść o jedną lepszą niż to: " 3f5B" znaleźć trzecie wystąpienie "5", a następnie cofnąć się do początku słowa.

paxdiablo
źródło
Nie ma potrzeby używania skryptu - wystarczy nacisnąć "v" w trybie vi i otworzyć wiersz poleceń w edytorze. Możesz ładniej sformatować linię poleceń, err, „skrypt” za pomocą znaków nowej linii i nie jest potrzebny plik tymczasowy. :) Tak więc "v / 25" przenosi cię tam 4 znakami.
dannysauer
Ale do uruchomienia potrzebujesz czegoś więcej niż klawisza <Enter>. @dannysauer
CDR,
9

Użyj Meta-b / Meta-f, aby przejść odpowiednio do tyłu / do przodu 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”

Edson Medina
źródło
8

Po jednokrotnym uruchomieniu polecenia uruchom fc

Uruchomi się $EDITORz poprzednim poleceniem, a następnie możesz użyć zwykłego edytora do zmodyfikowania polecenia. Po zapisaniu i wyjściu plik zostanie wykonany.

... ale, jak powiedział Pax - wiersz poleceń nie jest szczególnie dobry do edycji absurdalnie długich wierszy - dlaczego nie przekształcić polecenia w skrypt?

dbr
źródło
4

Jeśli chcesz przejść do przodu o określoną liczbę słów, naciśnij M-<n>( M-dotyczy Meta i zwykle jest to klawisz Escape), a następnie naciśnij liczbę. Spowoduje to wysłanie argumentu powtarzania do readline, więc możesz powtórzyć dowolne polecenie - jeśli chcesz przejść do przodu, naciśnij, M-<n> M-fa kursor przesunie się do przodu o <n>liczbę słów.

Na przykład

 $|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 twojego przykładu od kursora na początku linii, którą byś uderzył, M-26 M-fa twój kursor byłby na --option25|-lub- od końca linii M-26 M-bumieści kursor na--|option25


źródło
2

Przyrostowe przeszukiwanie historii

w terminalu wprowadź:

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ę szybko przeniesie Cię tam, mówiąc chcę:

for f in *.mid ; do timidity "$f"; done

wszystko, co muszę zrobić, to wejść

fo

i naciśnij strzałkę w górę polecenie wkrótce się pojawi

Alexandr
źródło
1

Jedną z opcji jest użycie M-x shellw emacs. Zapewnia to wszystkie funkcje edycji i naciśnięcia klawiszy emacs, dzięki czemu C-smożna go option25na przykład użyć do wyszukiwania tekstu .

(Ale nadal wolałbym być w prawdziwej powłoce terminala, jeśli ktoś może wskazać mi dobre funkcje wyszukiwania i edycji).

Szczery
źródło
0

Użyj myszki

Czasami najłatwiejszym 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 grml config) ta kombinacja to Alt+e. Jeśli włączysz mysz w swoim edytorze, możesz z niej skorzystać.

Aby włączyć mysz w Vimie, dodaj to do swojego ~ / .vimrc

set mouse=a
set ttymouse=xterm2

Jeśli następnie chcesz dokonać zaznaczenia tekstu w terminalu (zamiast przekazywać kliknięcie myszą do vim), przytrzymaj Shift podczas klikania; jest to oczywiście specyficzne dla terminala.

Administratorzy systemów nie powinni bać się myszy.

user7610
źródło
0

W Cygwin możesz aktywować taką funkcję, klikając prawym przyciskiem myszy okno. W wyskakującym okienku wybierz Opcje ... -> Mysz -> aktywuj Kliknięcia umieść kursor wiersza poleceń -> Zastosuj.

Od teraz, po prostu kliknięcie lewym przyciskiem myszy w jakimś miejscu w linii poleceń umieści tam kursor.

Abdull
źródło
0

pierwszy: export EDITOR = 'nano -m'

następnie: CTRL + X CTRL + E w kolejności.

Bieżąca linia zostanie otwarta w edytorze nano z włączoną myszą. Możesz kliknąć dowolną część tekstu i edytować

następnie CTRL + X, aby wyjść i y, aby potwierdzić zapis.

Sunfloro
źródło
0

Zrobiłem skrypt, aby kursor wiersza poleceń poruszał się po kliknięciu myszą :

  1. Włącz raportowanie śledzenia myszy xterm
  2. Ustaw powiązania readline, aby zużywały sekwencję ucieczki wygenerowaną przez kliknięcia

Można go znaleźć na githubie

Więcej informacji w innym poście

Działa, jeśli echo -e "\e[?1000;1006;1015h" # Enable trackingdrukuje sekwencje ucieczki na terminalu po kliknięciu myszą

Tinmarino
źródło
0

Może nie jest to najszybsze, ale to musi być tutaj, trochę czytania o ruchach kursora ANSI

Sekwencje specjalne ANSI umożliwiają dowolne przesuwanie kursora po ekranie. Jest to bardziej przydatne w przypadku pełnoekranowych interfejsów użytkownika generowanych przez skrypty powłoki, ale może być również używane w monitach . Sekwencje ucieczki przed ruchem 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 wstawić następujący wiersz kodu po znaku zachęty (jest trochę jaśniejsze co robi jeśli znak zachęty znajduje się kilka linii w dół terminala, kiedy to umieścisz): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Powinno to przesunąć kursor o siedem linii w górę ekranu, wypisać słowo "BASH ”, a następnie wróć do miejsca, w którym zaczął wyświetlać normalny monit.


Przykłady :

Przesuń kursor wstecz o 7 linii:

echo -e "\033[7A"

Przenieś kursor do wiersza 10, kolumny 5:

echo -e "\033[10;5H"

Szybkie wyświetlanie kodów kolorów w celu pokolorowania programu:

echo -e "\033[35;42m" ; ifconfig
NVRM
źródło