2011-12-05 9 views
9

Quando si utilizzano i blocchi di codice R in un documento .Rnw, il buffer emacs rileva automaticamente che il cursore si trova all'interno di un chunk di codice (ad esempio all'interno di <<>> e @) e passa alla modalità ESS - questo è molto importante perché si può ottenere ESS basato sul codice di formattazione all'interno del chunk di codice e, in modo più utile, si possono inviare righe/regioni di codice al buffer di processo inferiore *R*.Emacs, R, Org-mode: come abilitare il passaggio automatico alla modalità ESS all'interno dei blocchi di codice R?

Come faccio ad avere la stessa funzionalità in un file org-mode entro R blocchi di codice (cioè tra #+begin_src R e #+end_src) - mi piacerebbe emacs di riconoscere automaticamente è all'interno di un blocco di codice R, e si accendono ESS -Modifica in modo che io possa inviare snippet di codice al processo *R*. Sono consapevole del fatto che posso eseguire Ctl-C ' e passare a un altro buffer in modalità ESS in cui posso modificare il codice e ottenere tutti gli altri vantaggi in modalità ESS (incluso l'invio di codice a R). Tuttavia mi piacerebbe non fare questo, cioè voglio essere in grado di inviare snippet di codice dal blocco di codice R nello stesso buffer org-mode.

+0

C'è una [modalità mmm] (http://www.emacswiki.org/emacs/MmmMode) - può essere che può aiutarti. Non l'ho mai usato da solo. – Adobe

risposta

4

Un anno fa circa, ho chiesto il same question sull'elenco delle modalità org. @ cm2 ha già detto che non è possibile utilizzare la funzionalità ESS in org-mode; per quanto ne so, Emacs non può gestire due modalità principali e anche con la modalità mmm sembrano esserci alcune difficoltà.

Dan Davison ha gentilmente pubblicato un codice elisp che riproduce alcune delle funzionalità ESS. Quindi, potresti voler controllare le risposte di Dan alla mia domanda.

+0

Grazie @Bernd. Il thread email che hai menzionato sembra rispondere alla maggior parte delle funzionalità di cui avevo bisogno.Devo indagare su come abilitare "shift-enter" per inviare il codice dal blocco di codice R al processo R. Allora sarò tutto pronto. Sto selezionando il tuo come risposta accettata, dal momento che indicava un thread di posta elettronica effettivo con una soluzione quasi completa. –

4

AFAIK, questo non può essere eseguito con l'attuale implementazione della modalità Org.

Non sono sicuro che sia possibile farlo in modalità Org senza dover approfondire il codice elisp. Il punto principale del comando C-c ' in modalità Org è che si dispone di un buffer aggiuntivo con tutte le evidenziazioni della sintassi che si desidera/richiedono per la propria lingua specifica.

v'è probabilmente un modo per incidere intorno a questo per R codice SPECIFICI scrivendo qualche gancio Org-mode che controlla per vedere se si è in un #+begin_src R ... #+end_src R blocco, e quindi il controllo di un pezzo di codice. Ho il sospetto che questo sarebbe disordinato e in conflitto con altre caratteristiche della modalità Org. Inoltre, dovresti scrivere un'altra funzione per afferrare il blocco di codice corrente e passarlo all'interprete R della modalità Org, insieme a tutte le opzioni aggiunte al blocco src.

+0

Grazie per aver risposto, accettando la tua come la migliore risposta. È bello sapere che non c'è soluzione là fuori che mi manchi. E per ora mi arrenderò e includerò 'Ctl-C 'nel mio flusso di lavoro. –

0

Il poly-org.el nel pacchetto polymode è progettato per gestire la modifica in modalità multipla in org-mode. Ho provato, ma si blocca Emacs a causa di non abilitare jit-lock nel buffer indiretto.

0

Una soluzione alternativa è la commutazione manuale tra le modalità quando necessario, ad esempio, aggiungendo il seguente codice a .emacs e utilizzando F6.

;; Toggle between org & R modes. 
(defun toggle-org-R-mode() 
    (interactive) 
    "Toggle mode between org-R modes" 
    (cond 
    ((string= major-mode "org-mode") 
    (R-mode)) 
    ((string= major-mode "ess-mode") 
    (org-mode)) 
    ) 
) 
(global-set-key [f6] 'toggle-org-R-mode) 
Problemi correlati