2012-11-15 11 views
5

Ich habe ein Befehlszeilenprogramm, das JSON und YAML ausgibt. Standardmäßig erkennt es, ob pygments (pymentmize) verfügbar ist und wenn dies der Fall ist, übergebe es die Ausgabe, um eine schöne kolorierte Ausgabe zu erhalten. Auf den meisten Computern, auf denen dieses Programm ausgeführt wird, ist jedoch puments nicht standardmäßig installiert. Aber die meisten Computer haben entweder Emacs oder Vim, tut dies jedoch. Gibt es eine Möglichkeit, einen dieser Editoren dazu zu bringen, einige Texte mithilfe von ANSI-Escape-Sequenzen zu markieren und sie dann wieder auszugeben?Syntax-Highlighter von emacs oder vim für das Befehlszeilenprogramm verwenden?

+0

Übrigens, ich habe gerade über Coderay herausgefunden. Es ist Ruby-basiert und sein Befehlszeilenprogramm ist viel schneller als pygmentize. –

+1

Eine andere Option wäre [GNU Source-highlight] (http://www.gnu.org/software/src-highlite/source-highlight.html). Ich verwende das, um Farben mit [weniger] (http://superuser.com/a/71593/79870) zu erhalten. –

+0

@RandyMorris: Ja, es gibt sogar ein CPAN-Modul dafür (mein Programm ist Perl-basiert). Das einzige Problem ist, dass die Abhängigkeit ziemlich groß ist (das Installieren von source-highlight und seine dev-Bibliotheken, um das CPAN-Modul zu erstellen, zieht ungefähr 100 MB Debian-Pakete ein). –

Antwort

1

Emacs enthält eine Funktion namens htmlfontify, die einen formatierten Puffer in HTML konvertiert. Sie können dies im Batch-Modus mit einem kleinen elisp-Skript verwenden, um eine Datei als HTML zu rendern. Zum Beispiel:

emacs -q --batch --file myfile.rb --eval '(progn (require (quote htmlfontify)) (htmlfontify-buffer) (set-buffer-modified-p t) (save-buffer))' 
+0

Danke. Sorry hat es nicht klar gemacht, ich brauche es in ANSI-Escape-Sequenzen, da ich an Terminal ausstelle. Mein EmacsLisp-fu ist streng limitiert, aber du hast mir ein paar Tipps gegeben. –

2

wie Emacs (. Cp ataylor Antwort), Vim einen Puffer mit voller Syntax-Hervorhebung zu HTML machen kann; siehe :help 2html.vim. Sie könnten wahrscheinlich einen Großteil des Plugins-Codes wiederverwenden, der die Syntax des Puffers durchläuft, und ihn so ändern, dass er in ANSI-Escape-Sequenzen rendert. Sie müssten jedoch die gesamte Rendering-Logik selbst implementieren.

Obwohl es einige Plugins gibt, die Vim als Pager verwenden, glaube ich nicht, dass es einfach möglich ist, Vim zu verwenden, um den Puffer mit ANSI-Escape-Sequenzen auszugeben. Schließlich möchte Vim die Kontrolle über das Terminal behalten und löscht es beim Beenden.

Ich würde vorschlagen, nach einer anderen, dedizierten Lösung außerhalb von Vim zu suchen, obwohl das bedeutet, dass Sie es installieren müssen.

1

Wenn Sie nicht wollen, @IngoKarkat Beratung und schreiben Standard-Plugin zur Unterstützung ANSI-Escape-Sequenz Sie können meine formatvim Plugin verwenden, es unterstützt Rendering-ANSI-Escape-Sequenz unter Verwendung

Format format csi to /path/to/file 

folgen. Anfangs war mein Plugin ein Standard-2HTML-Targeting für verschiedene Formate mit einfachem Hinzufügen eines neuen Formats (ich brauchte ungefähr 30 Minuten, um ANSI-Escape-Sequenz-Unterstützung hinzuzufügen, hauptsächlich die Spezifikation dieser Sequenzen), aber der aktuelle Code ist zu weit gegangen Ähnlichkeiten erwähnen. Es ist bekannt, dass es für große Dateien schneller arbeitet oder wenn Sie eine Instanz von vim verwenden, um eine Anzahl von Dateien zu rendern (d. H. Wenn die Aufwärmphase ("Kompilieren" und Cache-Füllen) durch den Vorteil eines weiteren Laufs maskiert wird).

4

wie der Editor kann schon die Ansi-Zeug, ziemlich einfach, eine Bildschirmaufnahme des Editors zu machen, nein?

script -qc "stty rows 10000 
emacs -nw -visit YOURFILE.YAML -eval '(redisplay t)' -f kill-emacs 
resize" 

(redisplay nur erforderlich für GNU Emacs FSF)

jetzt die Erfassung aufzuräumen

perl -p0E 's/\A(?s:.*)\e\[27m\r\n 
\e\[A\n((?s).*?) 
(?:\e\[K\n)+ 
\e.*\e\[27m\r$(?s:.*)\Z/$1/mx' < typescript 

, wenn Sie nicht den Aufnahmevorgang auf dem Bildschirm sichtbar sein sollen, können Sie es wickeln in einem versteckten Terminal mit etwas wie perl's IO: Pty

+0

Netter Trick! Ein wenig Overkill für das Problem zur Hand. Vielen Dank. –

4

Matthew Wozniski schrieb ein Skript namens vimcat.sh, das dies mit Vim tut. Seine Version ist . Ich habe ein paar Änderungen daran vorgenommen (wenn der Speicher dient, erlaubten die Modifikationen, dass er auf meinem Mac OS X System läuft; ich weiß, dass die Ersetzung von /dev/fd/9 für /proc/self/fd/9 diesen Zweck hatte); siehe mein Kern bei https://gist.github.com/4090959.

Ich glaube, dass beide Versionen des Skripts Probleme mit der Rückkehr zur Standardhintergrundfarbe haben, wenn Vim's Hervorhebung den Hintergrund ändert.

Verwandte Themen