2013-04-02 8 views
6

w pliku org-mode, z kodem jak poniżej:wcięcie kod w org-babel bloków src

#+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 

Chciałbym klawisz TAB, aby wciąć kod, jak to będzie, jeśli to było w buforze w trybie seplisji.

Co potrzebne jest:

  • Sposób, aby dowiedzieć się, czy kursor znajduje się wewnątrz bloku src. Nie musi się uruchamiać, gdy znajduje się w samym wierszu nagłówka, ponieważ w takim przypadku powinno nastąpić domyślne składanie org.
  • Sposób wcięcia kodu zgodnie z trybem (emacs-lisp w tym przypadku) określonym w nagłówku.

Org potrafi już podświetlać składnię bloków src zgodnie z trybem, a haki TAB są dostępne. Wygląda to na zręczność.

+1

Od czasu edycji bieżącego kodu, czy "C-c" '', aby przejść do trybu edycji, jest wystarczające? – gongzhitaao

+0

Tak, wiem o tym skrócie, ale przy edycji wielu krótkich fragmentów, np. W pliku config-in-org, emacs jest zbyt ciężki. – user103576

+0

może być pomocny w tym [wątku] (http://lists.gnu.org/archive/html/emacs-orgmode/2012-02/msg00847.html) – gongzhitaao

Odpowiedz

1

Oto szorstki rozwiązanie:

(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) 

Zajmuje tylko emacs-LISP bloków. Testowałem tylko z blokiem src bez wcięcia (nie domyślnie dla org).

Trudno jest w ogóle sprawić, aby jeden tryb działał w innym - wiele poleceń klawiaturowych będzie w konflikcie. Ale niektóre z bardziej podstawowych uderzeń, takich jak zakładka wcięcia, znak nowej linii, komentowanie (org będzie komentować kod septyczny z #, co jest błędne) wydają się, że mogą być wprowadzone do działania i miałyby największy wpływ.

9

Wystarczy przesunąć punkt w bloku kodu i naciśnij przycisk CC '

To spowoduje pojawienie się bufor w elisp-mode, składnia PODKREŚLAJĄC ogłoszenie wszystko ...

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

powinno wystarczyć, gdzie ` tiret bufor”jest zdefiniowany jako:

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

Od Emacs 24.1 można teraz ustawić następującą opcję:

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

... i to powinno obsłużyć wszystkie bloki src.

+0

To jest najlepsza odpowiedź, której nie spodziewałem się znaleźć tydzień :-) –

+0

Użytkownicy Yasnippet, którzy napotkają pętlę zastępczą 'yasnippet' podczas wykonywania tej czynności mogą uznać ten wątek za przydatny: https://github.com/joaotavora/yasnippet/issues/761 –