2013-04-02 14 views
6

In un file org-mode, con codice quanto segue:codice rientro in blocchi src org-babele

#+begin_src emacs-lisp 
(add-to-list 'org-tab-before-tab-emulation-hook 
      (lambda() 
       (when (within-the-body-of-a-begin-src-block) 
       (indent-for-tab-command--as-if-in-lisp-mode)))) 
#+end_src 

desidero il TAB per rientrare il codice come sarebbe se fosse in un buffer in modalità lisp.

Quello che serve è:

  • Un modo per capire se il cursore si trova all'interno di un blocco src. Non deve attivarsi quando si trova sulla riga dell'intestazione stessa, in quanto in quel caso dovrebbe avvenire il piegamento org predefinito.
  • Un modo per indentare il codice in base alla modalità (emacs-lisp in questo caso) specificata nell'intestazione.

Org può già sintetizzare i blocchi src di evidenziazione in base alla modalità e gli hook TAB ci sono. Questo sembra fattibile.

+1

Dato che si sta modificando il codice corrente, sarebbe '' C-c ''' sufficiente per accedere alla modalità di modifica? – gongzhitaao

+0

Sì, conosco questa scorciatoia, ma mi sembra troppo pesante quando si modificano molti frammenti brevi, ad esempio in un file config-within-org di emacs. – user103576

+0

potrebbe essere utile su questo [thread] (http://lists.gnu.org/archive/html/emacs-orgmode/2012-02/msg00847.html) – gongzhitaao

risposta

1

Ecco una soluzione di massima:

(defun indent-org-src-block-line() 
    "Indent the current line of emacs lisp code." 
    (interactive) 
    (let ((info (org-babel-get-src-block-info 'light))) 
    (when info 
     (let ((lang (nth 0 info))) 
     (when (string= lang "emacs-lisp") 
      (let ((indent-line-function 'lisp-indent-line)) 
      (indent-for-tab-command))))))) 

(add-to-list 'org-tab-before-tab-emulation-hook 
      'indent-org-src-block-line) 

Gestisce solo i blocchi emacs-lisp. Ho provato solo con il blocco src senza indentazione (non il default dell'organizzazione).

In genere è difficile far funzionare una modalità in un'altra: molti comandi della tastiera sono in conflitto. Ma alcuni dei tratti più basilari, come la tab per indent, newline, commenting (l'org commenterà il codice lisp con #, che è sbagliato) sembrano come potrebbero essere fatti funzionare e avrebbero l'impatto maggiore.

9

Basta muovere punto nel blocco di codice e premere Cc '

Questo si aprirà un buffer in elisp-mode, la sintassi come evidenziare annuncio tutto ...

1
(defun my/org-cleanup() 
    (interactive) 
    (org-edit-special) 
    (indent-buffer) 
    (org-edit-src-exit)) 

dovrebbe farlo, dove ` trattino-buffer' è definito come:

(defun indent-buffer() 
    (interactive) 
    (indent-region (point-min) (point-max))) 
15

Dal Emacs 24.1 è ora possibile impostare l'opzione seguente:

(setq org-src-tab-acts-natively t) 

... e che dovrebbe gestire tutti i blocchi src.

+0

Questa è la migliore risposta che non mi aspettassi di trovare questo settimana :-) –

+0

Gli utenti di Yasnippet che incontrano un ciclo di riserva 'yasnippet' durante questa operazione potrebbero trovare utile questa discussione: https://github.com/joaotavora/yasnippet/issues/761 –

Problemi correlati