2009-11-06 17 views
17

Chciałbym mój skrypt tcsh, aby uruchomić edytor (np vi, emacs):Jak uruchomić edytor ze skryptu powłoki?

#!/bin/tcsh 
vi my_file 

ten rozpoczyna się VI ze my_file ale pierwsze wyświetla ostrzeżenie „vim: Uwaga: Wyjście nie jest do terminala” a moje naciśnięcia klawiszy nie pojawiają się na ekranie. Po zabiciu vi moje okno terminala jest pomieszane (bez nowych linii), wymagające "zresetowania". Próbowałem "emacs -nw", "xemacs -nw" i pico z podobnymi wynikami. "xemacs" działa, ale uruchamia osobne okno. Chcę ponownie użyć tego samego okna terminala.

Czy istnieje sposób na uruchomienie edytora ze skryptu, aby ponownie użyć tego samego okna terminala?

+0

Zwykle robię dokładnie to, co robisz i to działa dobrze dla mnie. Ale moja powłoka to bash. Tego rodzaju rzeczy działa również dobrze pod sh. Czy można zrobić "który vi", aby dowiedzieć się, czy coś innego niż vi jest wywoływana? I ... z jakiego środowiska systemu operacyjnego korzystasz? –

+1

Z bash i vim możesz po prostu zrobić vi mój_plik z poziomu skryptu. Nie wiem, dlaczego musiałbyś zrobić coś wyjątkowego. –

+0

Czy próbujesz uzyskać vim, aby przeczytać PLIK lub zawartość ZMIENNEJ? – matpie

Odpowiedz

16

Odpowiedziałem na własne pytanie! Musisz przekierować wejście terminalu i wyjścia:

#!/bin/tcsh 
vi my_file < `tty` > `tty` 
+3

ale ... ale ... ale ... przekierować z miejsca? Wciąż jest dla mnie tajemnicą, dlaczego powinieneś to zrobić. –

+0

Próbuję to zrobić z vimem, ale dostaję tylko '\' tty \ ': niejednoznaczne przekierowanie ' –

+3

Okazuje się, że '\' tty \ 'rozwija się do" not a tty "wewnątrz mojego skryptu. Po prostu użyłem '/ dev/tty', ale zastanawiam się, jak może to być przenośne ... –

2

udało mi się uzyskać pożądanego zachowania pod bash + Cygwin + Terminator:

#!/bin/bash 
vim foo 

Uruchom skrypt, ładunki vim, żadnych komunikatów o błędach, zachowuje się tak, normalna. Istnieją niewątpliwie dziesiątki wariacji pomiędzy naszymi konfiguracjami, więc nie mogę zaryzykować odgadnięcia, na czym polega różnica. Ciekawi mnie, co to jest, ale to działa, co jest ważną częścią.

11

Powodem, dla którego pojawia się błąd, jest to, że po uruchomieniu powłoki w środowisku rozpoczyna się ona w podpowłoce, która ma STDIN i STDOUT nie podłączone do TTY - prawdopodobnie dlatego, że jest to coś w rodzaju potoku. Po przekierowaniu otwierasz nowe połączenie bezpośrednio do urządzenia. Tak więc, na przykład, linia poleceń zamienia

$ vi < `tty` > `tty` 

do

$ vi </dev/ttys000> /dev/ttys000 

więc nie jesteś naprawdę używając stare STDIN/STDOUT, jesteś tworząc dwa nowe pliki i mapowanie ich do proces STDIN/STDOUT procesu vi.

Teraz powiedz nam, co robisz z tym, a my powiemy ci, jak uniknąć tego kludge.

+0

Nie tworzę nowych plików. Przekierowuję plik urządzenia końcowego (tty informuje, który to plik), który jest związany z moim oknem terminala i istniał przed uruchomieniem mojego skryptu, do STDIN/STDOUT vi. Utworzono skrypt, który zawiera "zatwierdzenie cvs" i wykonuje wiele dodatkowych kontroli (np. Uruchamia nasz pakiet testowy) przed dokonaniem odprawy. Jest to czasami nazywane "bramkowanym meldunkiem". Z powodów, dla których nie będę wchodził, nie mogę użyć standardowego haka pre-commit CVS. Próbuję naśladować, w jaki sposób "cvs commit" uruchamia edytor, gdy nie określasz komunikatu zatwierdzenia w wierszu poleceń. –

2

Absolutnie. :-)

Napisz swój skrypt i każ mu wywołać zmienną środowiskową EDITOR, którą ustawisz na "emacsclient". Następnie uruchom Emacsa, wykonaj M-x server-start, przejdź do bufora powłoki (M-x shell) i wykonaj skrypt. Emacsclient wyświetli obiekt, który ma zostać poddany edycji, a C-x # będzie działał jako polecenie "done" i zabierze Cię z powrotem do skryptu z zakończonymi lub przerwanymi zmianami, zgodnie z własnym wyborem.

Ciesz się.

Edycja: Chciałem dodać, że te dni Emacs jest moim programem terminalowym. Mam tuziny buforów powłoki i nigdy nie muszę się martwić o utratę mocy wyjściowej i mogę wykorzystać całą moc Emacsa do manipulowania i analizowania wyjścia terminala. I niech skrypty Emacsa generują dane wejściowe do powłok. Fantastycznie. Na przykład oglądanie danych wyjściowych Tomcat w buforze powłoki podczas edytowania źródeł lub przetwarzania poczty lub robienia większości rzeczy Emacsa jest bardzo wygodne. Gdy pojawi się ślad stosu Tomcat, mogę szybko na nie odpowiedzieć.

3

Ustaw terminal tty na zmienną, a następnie przekieruj edytor we/wy za pomocą tej zmiennej.

w skrypcie:

#!/bin/sh 

ls | while read a; do vi $a < $MYTTY >$MYTTY; done 

a następnie uruchomić skrypt:

$ MYTTY=`tty` ./myscript >/tmp/log 
2

miał ten sam problem z 'pinfo' w skrypcie powłoki 'podczas gdy' pętla. Linia może być wykorzystane w skrypcie, używa „ps”, aby odnaleźć tty bieżącego numeru procesu „$$” i przechowuje że tty w $ KEY_TTY:

KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3` 

Później w skrypcie, po prostu wywołać proggie tty tylko z $ KEY_TTY jako wejście, w moim przypadku było to:

pinfo -m $s $page < $KEY_TTY 

na „vi” byłoby:

vi $a < $KEY_TTY > $KEY_TTY 

zaletą jest to, że skrypt jako cały nadal może akceptować wejście STDIN, a "vi" (lub cokolwiek) powinno działać poprawnie - - bez konieczności pamiętania o ustawieniu zmiennych środowiskowych przed uruchomieniem skryptu.

6

Chciałem zrobić coś podobnego. Potrzebowałem aliasu, który znajdowałby ostatni plik, nad którym pracowałem i otwierałem go w vi (1) do edycji. W każdym razie, nie mogłem dowiedzieć się, jak to zrobić, jak czytelnej alias (w tcsh), więc po prostu stworzony brzydki skrypt powłoki (csh, bo jestem stary) zamiast:

#!/bin/csh 

set DIR = "~/www/TooMuchRock/shows/" 

set file = $DIR`ls -t $DIR | head -1` 
set tty = `tty` 

vi $file <$tty >$tty 

(1) Kraftwerk: bin> który vi vi: alias do/usr/local/bin/vim -u ~/.exrc