2011-12-25 12 views
8

Voglio giocare e sperimentare una serie di strumenti software, ognuno dei quali avrà un'interfaccia a riga di comando. Alcuni di questi strumenti includono hbase, pig, erlang e prolog. Voglio usare emacs come interfaccia utente per questi strumenti nello stesso modo in cui posso eseguire una shell python con M-x run-python o un interprete Lisp con la modalità ielm.ricetta per costruire una modalità wrapper emacs attorno a un programma a riga di comando?

C'è una ricetta che posso seguire per avvolgere uno di questi strumenti da riga di comando in una modalità emacs? Sto cercando qualcosa che visualizzi il prompt dello strumento, permettimi di cercare nella cronologia con C-c C-n/C-p, invia l'input corrente al processo dello strumento che ho premuto Invio e visualizzo l'output dello strumento.

So che molti di questi strumenti probabilmente hanno già le modalità emacs, sono interessato a come crearne uno rapidamente se non esiste nulla.

+0

Non riesco però a rispondere alla tua domanda, ma se fate un Emacs Lisp wrapper per lo strumento, allora si può utilizzare dal IeLM. Ad esempio, lo faccio con il mio wrapper redis di emacs. http://code.google.com/p/eredis/ – justinhj

risposta

7

Recentemente ho costruito una "modalità gosu inferiore" per la lingua Gosu. In realtà si è rivelato essere piuttosto semplice: Ho appena esteso comint che è la modalità su cui si basano sia shell e ielm. Qui è il bit importante del codice:

(require 'comint) 
(defun inferior-gosu-mode() 
    (interactive) 
    (comint-mode) 
    (setq comint-prompt-regex inferior-gosu-prompt) 
    (setq major-mode 'inferior-gosu-mode) 
    (setq mode-name "Inferior Gosu") 
    (setq mode-line-process '(":%s")) 
    (use-local-map 'inferior-gosu-mode-map)) 

Il bit use-local-map è proprio dove si definisce combinazioni di tasti speciali; Ho come solo una copia dei binding COMINT:

(defvar inferior-gosu-mode-map nil) 
(unless inferior-gosu-mode-map 
    (setq inferior-gosu-mode-map (copy-keymap comint-mode-map))) 

Dopo questo ho avuto qualche semplice codice che ha definito un comando per avviare un processo che avrebbe pop aprire il buffer *inferior-gosu* se esistesse. Ho anche aggiunto un po 'di codice alla normale modalità gosu per aprire una shell gosu inferiore.

In breve: usare comint.

Ecco un link per l'intero codice, ma non c'è molto di più ad esso: https://github.com/TikhonJelvis/Gosu-Mode/blob/master/inferior-gosu-mode.el

sentono naturalmente libero di utilizzare quel codice tuttavia si desidera; potresti anche voler guardare la normale modalità Gosu per vedere come integrare l'erlang e il prolog nelle rispettive modalità di modifica delle lingue.

+5

Sembra una risposta utile, ma probabilmente non è l'approccio migliore per creare la tua modalità? Mi aspettavo di vedere '' (define-derived-mode) ', con' comint-mode' specificato come genitore. – phils

Problemi correlati