Emacs: shell-mode erträglicher gestalten

Mit shell-mode steht dem Emacs-Nutzer eine sehr einfache Shell-Umgebung zur Verfügung. Der shell-Buffer ist aus Sicht der in ihm gestarteten Programme ein “dummes” Terminal, einen Zeilen-Editor der Shell kann man daher nicht verwenden.

Diese primitive Umgebung ist ein Feature: Wenn man zum Beispiel die Ausgabe eines in dieser Shell gestarteten Programms weiterverwenden will, so kann man die aus Emacs gewohnten Tastenkürzel, Makros, etc. verwenden und ist nicht etwa darauf angewiesen, die Maus in die Hand zu nehmen, um aus einem xterm Text zu kopieren.

Andererseits gehen viele Kommandozeilen-Programme davon aus, daß zumindest ein Texteditor und ein Pager zur Verfügung steht. Meist kommen hier vi und more zum Einsatz, die auf einem dummen Terminal natürlich nicht wirklich sinnvoll benutzbar sind. (Überdies mutet es doch absurd an, aus Emacs heraus einen anderen Editor aufrufen zu wollen, wo es doch mit viper-mode eine ganz hervorragende vi-Emulation gibt…)

Die Lösung muß natürlich dafür sorgen, daß etwas anderes als vi bzw. more aufgerufen wird. Dafür gibt es die Umgebungsvariablen EDITOR, VISUAL und PAGER. Emacs selbst läßt sich “von außen” mit einem Programm namens gnuclient fernsteuern, und das kommt hier zum Einsatz. Zunächst einmal muß gnuserv, das Gegenstück zu gnuclient, im Emacs selbst gestartet werden, am besten direkt in .emacs:

(require 'gnuserv)
(gnuserv-start)
; für gnuclient unter X keinen neuen Frame erzeugen
(setq gnuserv-frame (selected-frame))

Als Ersatz für den Pager gibt es ein kleines Shellskript gnuclient-cat, das nur Dateien mit mehr als 20 Zeilen in einen Emacs-Buffer lädt:

#!/bin/sh
TEMPFILE=`tempfile`
cat "$@" > $TEMPFILE
if [ `wc -l < $TEMPFILE` -gt 20 ]; then
gnuclient $TEMPFILE
else
cat $TEMPFILE
fi
rm -f $TEMPFILE

Im Startup-Skript der Shell muß dann noch vereinbart werden, daß ein anderer Editor und ein anderer Pager zum Einsatz kommen soll, wenn die Shell aus Emacs heraus gestartet wird:

if [ "$EMACS" = t ]; then
export VISUAL=gnuclient
export EDITOR=gnuclient
export PAGER=~/.my/bin/gnuclient-cat
fi


Über diesen Beitrag


  1. Gregor 14.12.2006 / 13:28

    Da ich Emacs leider nicht staendig nutze, kann ich nur wenig nachvollziehen, was genau diese Shell-Mode macht. Ist es eine Terminalemulation?

    Wozu nutzt du das ausgearbeitete Feature?

  2. hillu 14.12.2006 / 14:36

    shell-mode ist ein normaler Emacs-Buffer, der die Eingaben an
    ein eine Shell weiterreicht, deren Ausgaben dann wieder im Buffer
    landen. Für eine Terminalemulation ist das ein bißchen wenig, und
    daher wird auch TERM=dumb gesetzt. Aber ich nutze shell-mode,
    gerne, weil Dinge wie Copy&Paste sehr einfach funktionieren.

    Wenn Du in einem xterm TERM=dumb setzst und vi, more, less …
    aufrufst, siehst Du gleich, warum Programme, die einen Pager oder einen
    Editor aufrufen wollen (Beispiel: cvs, svn, …) im
    shell-mode ohne die Anpassungen nicht benutzbar sind.

    Für die Leute, die unbedingt vi, less oder *spuck* nano im Emacs
    benutzen wollen, gibt es eine eine Terminalemulation namens
    term. bb (das aalib-Demo) läuft prinizipiell darin auch, aber
    das ist dann ein mehr als dekadenter Umgang mit Systemresourcen.

Hinterlasse einen Kommentar

XHTML: Folgende Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




Safari hates me