2014-10-16 17 views
6

Czasami używam multilinii poleceń zsh:Wstawianie nowej linii w poleceniu multiline zsh wyciągnął z historii

❯ echo \ 
> a \ 
> multiline \ 
> command 

Podczas edycji polecenia po wyciągnięciu go z historii wyszukiwania, można zmienić zawartość poszczególnych linii. Jednak nie mogę dowiedzieć się, jak wstawić kolejny wiersz:

# I want to insert another line after "multiline"... 
❯ echo \ 
> a \ 
> multiline \ # but hitting <return> here just runs the command, even though there's a backslash at the end of the line 
> command 

Jak mogę wstawić znak nowej linii w środku polecenia wielowierszowego wyciągnął z historii?

+0

http://unix.stackexchange.com/questions/6620/how-to-edit-command- line-in-full-screen-editor-in-zsh – chepner

+0

@chepner Wspaniale, to jest świetne. Pls tworzą odpowiedź, w której wyjaśnisz nieco więcej, więc mogę ją zaakceptować. –

Odpowiedz

14

Można użyć self-insert-unmeta związać Alt + Return wstawić dosłownego przełamane bez akceptowania polecenia:

bindkey '^[^M' self-insert-unmeta 

Do korzystania z przykładem: uderzanie Alt + Powrót pod kursorem pozycja (#)

% echo \ 
a \ 
multiline \# 
command 

dostaniesz to:

% echo \ 
a \ 
multiline \ 
# 
command 

Działa to nie tylko podczas edycji historii, ale także podczas wpisywania poleceń. Możesz więc przygotować kilka komend w skrypcie, takich jak moda, i zaakceptować je pojedynczym Return.

Na przykład naciśnięcie Alt + Return zamiast # w poniższym przykładzie:

% echo command 1# 
echo command 2# 
echo command 3 

zrobi to samo co komenda echo command 1; echo command 2; echo command 3 i produkowania tego wyjścia:

command 1 
command 2 
command 3 
+1

Wiem, że nie powinniśmy dziękować ludziom w Stack Overflow, ale czuję się do tego zmuszony. Dziękuję: DI może teraz utworzyć keybinding zsh, który tworzy polecenie wieloliniowe (z dokumentem tutaj) i zmienia jego czas wykonania bez drukowania 'heredoc>' i uniemożliwia mi edycję go, tak jak to: 'bindkey -s "^ [t" 'sh << EOF^[^ Mecho "kompilacja 1 (opcjonalnie)";^[^ Mecho "kompilacja 2 (obowiązkowe)"^[^ MEOF^[[A^[[A^[[H'' –

0

Brzmi jak odpowiednie miejsce do użycia pliku skryptu powłoki zamiast?

#!/bin/zsh 
my 
commands 
here 
I can even add a new line at a later time. 
+0

Dzięki, ale nie zgadzam się. Jeśli używasz wielu odmian programu ze złożonym interfejsem wiersza poleceń, wyszukiwanie historii powłoki stanowi doskonały sposób na przeszukiwanie i rozwidlenie poprzednich przebiegów. Nie dostaniesz tego, jeśli przechowujesz każdą konfigurację w pliku. –

6

(podsumowanie odpowiedzi od https://unix.stackexchange.com/questions/6620/how-to-edit-command-line-in-full-screen-editor-in-zsh)

zsh pochodzi z funkcji, które można wykorzystać, aby otworzyć bieżący wiersz polecenia w swoim ulubionym edytorze. Dodaj następujące linie do swojego .zshrc:

autoload -z edit-command-line 
zle -N edit-command-line 
bindkey "^X^E" edit-command-line 

Pierwsza linia ładuje funkcję. Druga linia tworzy nowy widget dla edytora linii powłoki Z (zle) z funkcji o tej samej nazwie. Trzecia linia łączy widget sterowania - Xsterowania - e. Jeśli używasz vi Wiązania zamiast emacs klawiszy, użyj coś jak

bindkey -M vicmd v edit-command-line 

zamiast (co wiąże widżet do przeciwko w trybie vicmd).

+0

Twoja odpowiedź jest naprawdę dobra, ale muszę zmienić zaakceptowaną odpowiedź, ponieważ @Adaephon udziela jej bardziej bezpośredniej odpowiedzi. –

4

Jeśli przy użyciu trybu bindkey -v można również użyć domyślnego o/O Polecenia z trybu z trybu vicmd, aby dodać linię nowej linii i wprowadzić w niej tryb insert odpowiednio powyżej lub poniżej bieżącego wiersza.

6

Można użyć ESC - Return.

FWIW, testowałem to na Debianie Jessie, zsh 5.0.7 i działa tam.

0

Wystarczy pamiętać, jeśli chcesz skomentować w poleceniu multilinii, można użyć:

❯ echo `#first comment` \ 
> a `#second comment` \ 
> multiline \ 
> command