Powłoka z lepszymi możliwościami edycji

11

Powłoki (przynajmniej to, co wiem) mają naprawdę złe możliwości edycji poleceń.

Na przykład:

  • Nie mogę skierować kursora do żadnego punktu polecenia.
  • Nie mogę zaznaczyć i cofnąć / usunąć / zamienić tekstu w poleceniu.

Obecnie są one tak rozpraszające, że używam gedit do edytowania poleceń przed wklejeniem ich do terminala.

Czy istnieje jakieś rozwiązanie, które jest dla nich dobre?

UniversallyUniqueID
źródło
3
Łączymy terminal ze skorupą.
JdeBP,

Odpowiedzi:

13

Bash jest w tym całkiem niezły. Musisz tylko nauczyć się jego skrótów. Na przykład (w domyślnym trybie emacs):

  • Ctrl+ A: przejście na początek linii.
  • Ctrl+ E: przejście do końca linii.
  • Ctrl+ B: przesuń jedną postać do tyłu.
  • Ctrl+ F: przesuń jedną postać do przodu.
  • Alt+ B: przesuń jedno słowo do tyłu.
  • Alt+ F: przesuń jedno słowo do przodu.
  • Ctrl+ K: usuń (wytnij) wszystko do końca linii.
  • Alt+ D: usuń (wytnij) słowo za kursorem.
  • Ctrl+ W: usuń (wytnij) słowo przed kursorem.
  • Ctrl+ Y: yank (wklej) to, co znajduje się w buforze (na przykład co wycinasz za pomocą Ctrl+ Klub Alt+ D)

I jest ich o wiele więcej. Przeczytaj, man readlineaby zobaczyć, co jeszcze jest dostępne. Możesz przypisać różne skróty, umieszczając je w ~/.inputrc. Na przykład, aby dodać Ctrl+ Leftjedno słowo do tyłu i Ctrl+ Rightjedno słowo do przodu, dodaj to do ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Aby dowiedzieć się, co oznaczają te dziwne kody, naciśnij Ctrl+, Va następnie naciśnij klawisz, którego chcesz użyć. Jeśli spróbujesz z Ctrl+ Right, zobaczysz ^[[1;5C. Wymienić ^[z \ew ~/.inputrc.


Możesz także zajrzeć do innych powłok. Popularne „nowoczesne”, bogate w funkcje powłoki to:

terdon
źródło
Z gnome-terminalmusisz użyć ESCprzycisku zamiast ALT do nawigacji o jedno słowo do przodu i do tyłu. . .. lub przejdź na terminal, który nie używa Alt w menu aplikacji. . . jak
Xterm
@Serg nie w moim systemie, dzięki. Nie wiem, czy skonfigurowałeś go w ten sposób, czy jest to domyślna poprawka Ubuntu. Esc jest jednak często używany jako synonim Alt.
terdon
Brak buforowania podziału udostępniania między terminalem.
Craig Hicks
7

Możesz edytować puste lub częściowo wpisane polecenie w wybranym edytorze, ustawiając EDITORgo w wybranym edytorze i naciskając CTRLklawisze X+ + Elub CTRL+ X/ CTRL+ E, które otwierają aktualnie edytowaną linię EDITOR;

Na przykład ustawienie EDITORna geditspowoduje, że CTRL+ X+ Ei CTRL+ X/ CTRL+ Eotworzą bieżącą linię w Gedit.

Aby to trwałe rozwiązanie, można ustawić EDITORw ~/.bashrc.

Pozwala to na użycie nawet w pełni flegowanego graficznego edytora tekstu do edycji polecenia; aby uruchomić edytowane polecenie, po prostu zapisz i zamknij dokument.


Tę samą funkcję można włączyć w Zsh, dodając następujące elementy do ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
źródło
2
Można to również wywołać za pomocą fcpolecenia, jeśli ustawiona jest zmienna FCEDIT. Dobra odpowiedź !
Sergiy Kolodyazhnyy,
1
@Serg Thanks, jednak fcotwiera poprzednie polecenie (które jest jeszcze fajniejsze w pewien sposób). Nie wiedziałem o tym, dzięki!
Kos
6

Terminale same w sobie nie mają możliwości edycji tekstu. Terminale zapewniają obszar tekstu i łączą klawiaturę z czymś. Ale coś , co uruchamiasz w terminalu, określa, co może zrobić.

Powłoki takie jak bashzwykle są pierwszą rzeczą, którą można uruchomić w terminalu. Ponieważ powłoki działają w oparciu o polecenia, możesz edytować tylko bieżące polecenie. zapewnia doskonałą edycję poleceń w porównaniu do powłoki Bourne'a, a cshnawet kshnie jest to coś, z czym chciałbyś edytować nawet krótką historię.

Edytory tekstu to jedno z poleceń, które można wywoływać w powłoce. Wiodącymi przykładami są i . vimlub emacsda ci możliwość edycji prawie wszystkiego. Oba zawierają wbudowane środowiska programistyczne do rozszerzania ich możliwości na każdy napotkany problem.

Dlatego rozwiązaniem jest lepsze zrozumienie działania tych narzędzi i wybranie odpowiedniego dla danego zadania .

pisklęta
źródło
Znam różnicę, ale czy można coś zrobić, aby poprawić edycję poleceń bash?
UniversallyUniqueID,
1
umieścić to w skrypcie?
pisklęta
0

Zwykle terminale umożliwiają zaznaczanie tekstu za pomocą myszy, ale powłoka nie jest tego świadoma. Tak niestety nie bash, zsh, fishani nie esmoże obsługiwać edycję myszy oparte. Myślę, że aby to zrobić, musieliby przejąć większą kontrolę nad terminalem.

Jednak (i ​​to jest trochę rozciągnięte), jeśli otworzysz Vima lub GVima, a następnie wprowadzisz polecenia powłoki za pomocą:

:!...

następnie możesz kliknąć myszką, aby przejść do dowolnego miejsca w linii . (Musisz :set mouse=anajpierw, jeśli nie jest to jeszcze włączone). Klawisze edycji w tym trybie można zobaczyć za pomocą:help cmdline-editing

Vim ma również dość potężny tryb historii poleceń, do którego można dotrzeć, naciskając q:. Stamtąd możesz szarpać, usuwać i wklejać za pomocą poleceń trybu normalnego Vima. W tym trybie możesz wybrać mysz za pomocą myszy, a następnie usunąć wybraną funkcję (naciskając d).

Istotnym zastrzeżeniem jest to, że Vim tak naprawdę nie utrzymuje uruchomionej sesji powłoki na żywo. Każde wykonane polecenie zostanie uruchomione w procesie potomnym. Tak więc wszelkie zmiany wprowadzone do zmiennych środowiskowych lub opcji powłoki przez proces potomny zostaną utracone.

To powiedziawszy, możesz modyfikować zmienne środowiskowe z poziomu procesu Vima i używać ich z wiersza poleceń Vima, a nawet będą eksportowane do procesów potomnych:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Jeśli więc chcesz udawać, że Vim jest dziwną powłoką, możesz cieszyć się jego zaawansowanymi funkcjami edycji! Prawdopodobnie największą wadą jest to, że trzeba będzie rozpocząć każdą komendę pisania albo :!czyq:

A tak przy okazji, jeśli chcesz uzyskać wynik polecenia powłoki w bieżącym buforze Vima, możesz to zrobić w ten sposób (ale uważaj, to zablokuje twoją bieżącą linię):

:,!ls
joeytwiddle
źródło