2011-12-21 14 views
10

Na przykład, chcę, aby móc wpisać coś takiego:emacs powłoki rur produkcji do nowego bufora

$ git diff | tempbuffer 

i mają diff otwarty w nowym, niezapisanych bufora.

+3

Jeśli mogę zasugerować, spróbuj magit. może nie robić dokładnie tego, co chcesz. ale widzę, że pasuje do Twoich potrzeb https://github.com/magit/magit – kindahero

Odpowiedz

6

Możesz po prostu użyć M-! - uruchomi to polecenie w tym samym pliku cwd, co bufor powłoki, i wyprowadzi wyniki do bufora *Shell Command Output*.

Należy pamiętać, że jeśli wyniki są krótkie, bufor ten nie zostanie podniesiony, a wynik zostanie skopiowany do obszaru echa; jednakże bufor jest nadal używany i dostępny. Chfshell-commandRET zawiera szczegóły dotyczące tego, co stanowi „krótki” Wyjście:

Jeśli wyjście jest na tyle krótki, aby wyświetlić w Echo obszaru (określony przez zmienną max-mini-window-height jeśli resize-mini-windows nie jest -nil), jest tam pokazane. W przeciwnym razie wyświetlany jest bufor zawierający dane wyjściowe.

+3

Możesz również użyć C-u M-! aby umieścić wyjście w bieżącym buforze. – Daimrod

+1

@ Daimrod: Dokładnie to, co OP robi * nie * chce robić. Jest wewnątrz eshell i chce, aby wyjście polecenia przechodziło do nowego bufora. – Thomas

+0

To jest genialne - dziękuję. Brakuje tylko wstawienia nowego bufora we właściwym trybie. Na przykład, jeśli wyślę wyniki 'git diff' do nowego bufora, chciałbym, aby bufor był w trybie diff. –

8

Jeśli używasz eshell możesz przekierować wyjście do bufora, np.

print foo > #<buffer bar> 

, który tworzy nowy bufor bar z zawartością "foo". Aby uzyskać więcej informacji, zobacz Emacswiki pod numerem http://www.emacswiki.org/emacs/EshellRedirection.

+1

Dziękuję. To działa dla eshell. Używam jednak normalnej powłoki (tj. Powłoki M-x). –

+1

Jeśli eshell nie jest opcją dla ciebie, możesz wyprowadzić swoje wyniki do emacsclient. Będziesz potrzebował do tego skryptu lub funkcji powłoki. Jako punkt wyjścia patrz http://www.emacswiki.org/emacs/EmacsClient#toc43. –

+0

Jest to bardzo przydatne przy korzystaniu z TRAMP, np. "foo/ssh: user @ machine:/some/remote/file> # " – Warbo

3

Niestety emacsclient nie czyta swojego standardowego wejścia, więc potrzebujesz jakiegoś opakowania. Oto funkcja powłoki Bash, który działa dla mnie:

tempbuffer() { 
    perl -MFile::Temp -MFile::Copy -e \ 
    'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file'; 
} 
+0

Dziękuję za komentarz. Przepraszam, jestem trochę głupi. Umieściłem tę funkcję w moim pliku bash i mogę wywołać ją z konsoli. Nie rozumiem jednak, jak przekazać komendę, którą faktycznie chcę uruchomić (np. 'Git diff'). –

+0

Tak jak w oryginalnym poście, np. 'git diff | tempbuffer'. – Sean

+0

Ah dostałem to. Wielkie dzięki. –

0

zrobiłem pakiet (e-sink), używając informacji z wiki emacs jako punkt wyjścia. Działa tak, jak opisałeś, i "ogon" zamiast "ouput", zamiast czekać, aż proces zakończy się, aby wyświetlić wszystko.

0

Moje osobiste preferencje to coś można wpisać w bash bez konieczności zarządzania plików:

git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f) 

emacsclient czeka, aby zostać zakończone buforem przed Bash usuwa plik tymczasowy.

Chciałbym użyć M-! (odpowiedź phils'a), gdybym uruchamiał polecenie powłoki od zera i powyższe (które jest podobne do odpowiedzi Seana), gdybym był "w środku czegoś" w powłoce, a następnie zdecydował "Chcę to potoczyć do Emacsa".

Powiązane problemy