2010-11-02 14 views
11

Combiné org-mode con lisp-mode para lograr un hermoso doblado del código en emacs para el código de lisp: lisp-orgi-mode. Básicamente, uso ';' en lugar de '*' como el carácter del título. Para comentarios, simplemente pongo un espacio antes del ';', lo que lo convierte en ';' por lo que no cuenta como encabezado ...combina el modo python con org-mode para emacs

Sin embargo, hacer lo mismo con el modo python no funciona ... Probablemente porque el carácter '#' utilizado por los comentarios de python interfiere con la configuración del modo org ...

¿Alguien ha podido combinar la funcionalidad con éxito? Sé que la gente se han combinado python-mode con contorno-modo (link), pero ouline modo no es tan bueno como org-mode ...

Editar: tengo trabajo muy bien con outline-magic: Pitón-magia. el

Respuesta

10

uso hideshow-org (and a small introduction here) para este propósito, y creo que funciona muy, muy bien.

Estos son algunos fragmentos adicionales, pero útiles:

(dolist (hook (list 'c-mode-common-hook 
      'emacs-lisp-mode-hook 
      'java-mode-hook 
      'lisp-mode-hook 
      'perl-mode-hook 
      'sh-mode-hook)) 
    (add-hook hook 'my-hideshow-hook)) 

(defun my-hideshow-hook() 
    "thisandthat." 
    (interactive) 
    (progn (require 'hideshow-org) 
    (global-set-key (kbd "C-c h") 'hs-org/minor-mode) 
    (hs-org/minor-mode))) 

(defadvice goto-line (after expand-after-goto-line activate compile) 
    "hideshow-expand affected block when using goto-line in a collapsed buffer" 
    (save-excursion 
    (hs-show-block))) 
+0

nice. ¿Es posible ciclar niveles de plegado más allá de una sola iteración? – Naveen

+0

No, no es tan bueno como el modo org es con ciclos de diferentes niveles de plegado. Pero sigue siendo muy útil, y mucho más rápido que C-x n n. – monotux

+0

La siguiente solución es tan buena como el modo orgánico para ciclar diferentes niveles de doblado. Lo intentaste ? – Naveen

7

Ok, tengo delinear-minor-mode que trabaja muy bien con el siguiente esquema-regexp: "[\ t] * # \ | [\ t ] + \ (class \ | def \ | if \ | elif \ | else \ | while \ | for \ | try \ | except \ | with \) " Ahora obtengo el plegado de código utilizando tanto la sintaxis de Python como las líneas de comentarios como encabezados .
¿Sería posible adaptar su código para usar la pestaña para llamar a 'indent-for-tab-command-y si no hay nada que hacer, llame a' outline-cycle?

pitón-magic.el:

; require outline-magic.el by CarstenDominik found here: 
; http://www.astro.uva.nl/~dominik/Tools/outline-magic.el 
; modified code here by Nikwin slightly found here: 
; http://stackoverflow.com/questions/1085170/how-to-achieve-code-folding-effects-in-emacs/1085551#1085551 

(add-hook 'outline-minor-mode-hook 
      (lambda() 
      (require 'outline-magic) 
)) 
(add-hook 'python-mode-hook 'my-python-outline-hook) 

(defun py-outline-level() 
    (let (buffer-invisibility-spec) 
    (save-excursion 
     (skip-chars-forward " ") 
     (current-column)))) 

(defun my-python-outline-hook() 
    (setq outline-regexp "[ \t]*# \\|[ \t]+\\(class\\|def\\|if\\|elif\\|else\\|while\\|for\\|try\\|except\\|with\\) ") 
    (setq outline-level 'py-outline-level) 

    (outline-minor-mode t) 
    (hide-body) 
    (show-paren-mode 1) 
    (define-key python-mode-map [tab] 'outline-cycle) 
    (define-key outline-minor-mode-map [S-tab] 'indent-for-tab-command) 
    (define-key outline-minor-mode-map [M-down] 'outline-move-subtree-down) 
    (define-key outline-minor-mode-map [M-up] 'outline-move-subtree-up) 
) 
(provide 'python-magic)
0

Creo outline-magic ha sido reemplazado por outshine, y no sé si el código anterior funciona con ella. Pero yo era capaz de conseguir el siguiente código para trabajar, cortesía de a blog post by Ryan Davis:

(defun python-mode-outline-hook() 
    (setq outline-level 'python-outline-level) 

    (setq outline-regexp 
    (rx (or 
     ;; Commented outline heading 
     (group 
      (* space) ; 0 or more spaces 
      (one-or-more (syntax comment-start)) 
      (one-or-more space) 
      ;; Heading level 
      (group (repeat 1 8 "\*")) ; Outline stars 
      (one-or-more space)) 

     ;; Python keyword heading 
     (group 
      ;; Heading level 
      (group (* space)) ; 0 or more spaces 
      bow 
      ;; Keywords 
      (or "class" "def" "else" "elif" "except" "for" "if" "try" "while") 
      eow))))) 

(defun python-outline-level() 
    (or 
    ;; Commented outline heading 
    (and (string-match (rx 
       (* space) 
       (one-or-more (syntax comment-start)) 
       (one-or-more space) 
       (group (one-or-more "\*")) 
       (one-or-more space)) 
       (match-string 0)) 
    (- (match-end 0) (match-beginning 0))) 

    ;; Python keyword heading, set by number of indentions 
    ;; Add 8 (the highest standard outline level) to every Python keyword heading 
    (+ 8 (- (match-end 0) (match-beginning 0))))) 

(add-hook 'python-mode-hook 'python-mode-outline-hook) 

Tal vez alguien se encuentra este útil. Creo que es una forma increíble de facilitar la edición y la navegación del código.