10 votes

combiner python-mode avec org-mode pour emacs

J'ai combiné org-mode avec lisp-mode pour obtenir un beau pliage de code dans emacs pour le code lisp : lisp-orgi-mode . En fait, j'utilise ';' au lieu de '*' comme caractère d'en-tête. Pour les commentaires, je mets simplement un espace avant le ';', ce qui le rend ' ;' pour qu'il ne compte pas comme un titre...

Cependant, faire la même chose avec python-mode ne fonctionne pas... Probablement parce que le caractère '#' utilisé par les commentaires python interfère avec les paramètres de org-mode...

Quelqu'un a-t-il pu combiner la fonctionnalité avec succès ? Je sais que des personnes ont combiné le mode python avec le mode outline ( lien ), mais le mode "ouline" n'est pas aussi bon que le mode "org"...

Edit : J'ai réussi à le faire fonctionner correctement avec outline-magic : python-magic.el

9voto

monotux Points 1661

J'utilise hideshow-org ( et une petite introduction ici ) dans ce but, et je pense que ça marche vraiment, vraiment bien.

Voici quelques extraits supplémentaires, mais utiles :

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

6voto

Naveen Points 1471

Ok, j'ai réussi à faire fonctionner outline-minor-mode avec l'outline-regexp suivant : "[ \t ]*# \|[ \t ]+\(classe\|def\|if\|elif|else\|pendant\|pour\|essayer\|excepté\|avec\) " J'obtiens maintenant le pliage du code en utilisant à la fois la syntaxe python et les lignes de commentaires comme titres.
Serait-il possible d'adapter votre code pour l'utilisation de la tabulation en appelant "indent-for-tab-command" et s'il n'y a rien à faire, appeler "outline-cycle" ?

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

1voto

Je pense outline-magic a été remplacée par outshine et je ne sais pas si le code ci-dessus fonctionne avec lui. Mais j'ai réussi à faire fonctionner le code suivant, avec l'aimable autorisation de un article de blog par 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)

Peut-être que quelqu'un trouvera cela utile. Je pense que c'est un moyen incroyable de faciliter l'édition et la navigation dans le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X