2012-11-15 14 views
5

Ho un programma da riga di comando che sparge JSON e YAML. Per impostazione predefinita rileva se pygments (pygmentize) è disponibile e se lo fa, passa l'output attraverso di essa per ottenere un buon output colorized. Tuttavia, pygments non è installato di default sulla maggior parte dei computer su cui verrà eseguito questo programma. Ma la maggior parte dei computer avrà o emacs o vim, tuttavia, lo fa. C'è un modo per ottenere uno di questi editor in sintassi: evidenziare del testo usando le sequenze di escape ANSI e quindi restituirlo di nuovo?Utilizzo dell'evidenziatore della sintassi di emacs o vim per il programma della riga di comando?

+0

BTW, ho appena scoperto di coderay. È basato su ruby ​​e il suo programma da riga di comando è molto più veloce di pygmentize. –

+1

Un'altra opzione potrebbe essere [GNU Source-highlight] (http://www.gnu.org/software/src-highlite/source-highlight.html). Lo uso per ottenere i colori con [meno] (http://superuser.com/a/71593/79870). –

+0

@RandyMorris: sì, c'è anche un modulo CPAN per questo (il mio programma è basato su Perl). L'unico problema è che la dipendenza è abbastanza grande (l'installazione di source-highlight e le sue librerie di sviluppo per costruire il modulo CPAN richiede circa 100 MB di pacchetti Debian). –

risposta

1

Emacs include una funzione denominata htmlfontify che convertirà un buffer danneggiato in HTML. Puoi usarlo in modalità batch con un piccolo script elisp per eseguire il rendering di un file in formato HTML. Per esempio:

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

Grazie. Scusate non l'ho chiarito, ne ho bisogno nelle sequenze di escape ANSI poiché sto trasmettendo al terminale. Il mio EmacsLisp-fu è molto limitato, ma mi hai dato alcuni suggerimenti per giocare. –

2

come Emacs (. Cp risposta di ataylor), Vim può rendere un buffer con sintassi completa in evidenza in HTML; vedi :help 2html.vim. Probabilmente potresti riutilizzare gran parte del codice del plugin che passa attraverso la sintassi del buffer e cambiarlo per renderizzare le sequenze di escape ANSI, ma dovresti re-implementare tutta la logica di rendering da solo.

Sebbene esistano alcuni plugin che utilizzano Vim come cercapersone, non penso sia possibile utilizzare solo Vim per emettere il buffer con sequenze di escape ANSI. Dopotutto, Vim vuole mantenere il controllo del terminale e lo cancella quando esce.

Suggerirei di cercare un'altra soluzione dedicata esterna a Vim, anche se ciò significa che è necessario installarlo.

1

Se non si vuole seguire il consiglio @IngoKarkat e riscrivere plug standard per supportare ANSI sequenza di escape è possibile utilizzare il mio formatvim plug-in, che supporta il rendering a ANSI sequenza di escape utilizzando

Format format csi to /path/to/file 

. Inizialmente il mio plugin era una riscrittura del targeting standard 2html per il supporto di diversi formati con una facile aggiunta di un nuovo formato (ho impiegato circa 30 minuti per aggiungere il supporto alla sequenza di escape ANSI, principalmente leggendo le specifiche di queste sequenze), ma il codice attuale è andato troppo lontano menziona le somiglianze È noto che funziona più velocemente per i file di grandi dimensioni o quando si utilizza un'istanza di vim per eseguire il rendering di un certo numero di file (ad esempio quando la fase di riscaldamento ("compilazione" e riempimento cache) viene mascherata dal vantaggio di un'ulteriore esecuzione).

4

come l'editor può già fare le cose ansi, piuttosto facile fare una cattura dello schermo dell'editor, no?

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

(Rivisualizza è necessaria solo per GNU Emacs FSF)

ora ripulire la cattura

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 

se non si desidera che il processo di registrazione visibile sullo schermo, è possibile avvolgere in un terminale nascosto con qualcosa di simile a IO :: Pty

+0

Bel trucco! Un po 'eccessivo per il problema a portata di mano però. Grazie. –

4

Matthew Wozniski ha scritto uno script chiamato vimcat.sh che lo fa con Vim. La sua versione è https://github.com/godlygeek/vim-files/blob/master/macros/vimcat.sh. Ho apportato alcune modifiche (se la memoria serve, le modifiche gli hanno permesso di funzionare sul mio sistema Mac OS X, so che la sostituzione di /dev/fd/9 per /proc/self/fd/9 aveva lo scopo); guarda il mio succo allo https://gist.github.com/4090959.

Credo che entrambe le versioni dello script abbiano problemi con il ritorno al colore di sfondo predefinito se l'evidenziazione di Vim cambia lo sfondo.

Problemi correlati