155 votes

Comment obtenir des effets de pliage de code dans Emacs ?

Quelle est la meilleure façon de réaliser quelque chose comme le pliage de code, ou le type de cyclage que org-mode utilise. Quelle serait la meilleure solution dans elisp pour créer ce type de comportement ?

EDIT : Je suis désolé, je n'ai pas été clair. Je veux programmer quelque chose en elisp qui fait des choses très similaires au pliage de code, ou en fait plus comme org-mode avec la hiérarchie qui peut être étendue. Je me demande quelle est la meilleure façon d'obtenir cet effet. Je crois avoir entendu dire que les superpositions Emacs sont une bonne solution, mais je ne sais pas.

Pour ce qui est du pliage, j'utilise simplement la fonction intégrée set-selective-display.

EDIT NUMÉRO 2 :

Merci pour les réponses, mais je pense que je pose la mauvaise question. Je vais donc essayer d'être plus clair sur ce que j'essaie de faire. Je voudrais créer ce qui suit

Lorsque vous placez votre point sur une fonction et que vous appelez cette fonction elisp, elle placera la définition de la fonction où qu'elle se trouve (je pense utiliser find-tag pour cela) et la dépliera dans le tampon actuel. L'idée est que si vous devez passer à un autre tampon pour lire la définition de la fonction, j'ai l'impression que c'est un changement de contexte vers un autre fichier. J'aimerais donc que cela se comporte comme le pliage de code, sauf que le code est extrait du tampon. Cela pose quelques problèmes car il n'est pas possible de coller le code dans la mémoire tampon ou si quelqu'un l'enregistre, le code extrait sera sauvegardé. Je me demande donc s'il existe un moyen de créer une zone à l'intérieur d'un tampon qui ne fasse pas partie du tampon. Je pense que cela a du sens.

1 votes

Vous cherchez quelque chose qui, lorsque vous l'appelez avec un point dans une fonction CALL, saute à la définition de la fonction ? un peu comme obtenir de l'aide sur une fonction elisp vous permettra de sauter au code elisp ? Je ne pense pas que vous puissiez faire cela sans un certain concept du "projet" Par exemple, comment sauriez-vous quelle fonction "swap" vous voulez sauter ?

2 votes

Voir aussi : stackoverflow.com/questions/382781/ où l'affichage sélectif est un peu modifié pour obtenir des effets de pliage.

0 votes

Je vous recommande de retirer votre EDIT NB 2 et créez une nouvelle question pour elle.

166voto

dmckee Points 50318

Vous pouvez utiliser le hide-show mode ( hs-minor-mode ). Pour activer ce mode à la volée pour le tampon actuel uniquement, tapez M-x hs-minor-mode RET

En supposant que vous avez le raccourci clavier par défaut :

  • C-c @ C-M-h Pour tout plier ( hs-hide-all ).
  • C-c @ C-h Cache le bloc actuel ( hs-hide-block ). Le point (curseur) doit se trouver à l'intérieur du bloc.
  • C-c @ C-s Afficher le bloc actuel ( hs-show-block ). Le point doit être dans le {...} qui cache le code.

21 votes

Cela fonctionne bien. Et avec evil-mode, cela est déclenché par les commandes normales de vim : zR , zM , zo , zc .

153voto

jrockway Points 23734

Le pliage est généralement inutile avec emacs, car il dispose d'outils qui implémentent explicitement les actions que les gens font manuellement lorsqu'ils plient du code.

La plupart des gens ont du succès avec de simples recherches incrémentales. Vous voyez "foo" mentionné quelque part ? Tapez C-sfoo trouvez la définition, appuyez sur la touche Entrée, lisez-la, puis appuyez sur la touche C-x C-x pour revenir là où tu étais. Simple et très utile.

La plupart des modes prennent en charge imenu . M-ximenu vous permettra d'accéder à une définition de fonction (etc.) par son nom. Vous pouvez également le lier à un clic de souris pour obtenir un menu de fonctions (ou l'ajouter à la menubar ; voir la page Info pour plus de détails). Il fournit des données pour which-function-mode, ce qui vous permettra de voir dans quelle fonction vous vous trouvez actuellement dans la modélisation. (Mais pourquoi vos fonctions sont-elles si longues ?)

Il existe également barre de vitesse qui affiche graphiquement les informations de l'imenu (et d'autres choses).

Si vous voulez obtenir une vue d'ensemble de votre fichier, essayez M-xoccur ". Étant donné une regex, elle créera un nouveau tampon avec chaque correspondance dans le tampon actuel. Vous pouvez rechercher "(defun" pour obtenir une vue d'ensemble des fonctions implémentées par le fichier actuel. En cliquant sur le résultat, vous vous déplacerez à cette position dans le fichier.

De toute façon, pensez à ce que vous voulez vraiment réaliser, et Emacs le met probablement en œuvre. Ne vous battez pas avec des outils imparfaits qui vous font plier et déplier les choses constamment.

25 votes

Vim offre également toutes ces fonctionnalités sous une forme ou une autre, mais je trouve toujours sa fonction de pliage de code inestimable.

3 votes

M-x occur vient de me sauver un tas de maux de tête. Excellent article !

162 votes

J'ai voté contre la première phrase ("Le pliage est généralement inutile avec emacs, car..."). J'utilise constamment le pliage simple (basé sur le niveau d'indentation) pour analyser la structure d'un code non familier.

24voto

Nikwin Points 2066

J'utilise le mode mineur outline pour plier mon code python. Au lieu de devoir placer {{{ et }}} comme en mode folding, il utilise l'endroit où le bloc est défini.

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

Je suis presque sûr qu'il est fourni avec emacs. J'ajoute ensuite ceci à mon .emacs

;;======= Code folding =======
(add-hook 'python-mode-hook 'my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
  ; outline uses this regexp to find headers. I match lines with no indent and indented "class"
  ; and "def" lines.
  (setq outline-regexp "[^ \t]\\|[ \t]*\\(def\\|class\\) ")
  ; enable our level computation
  (setq outline-level 'py-outline-level)
  ; do not use their \C-c@ prefix, too hard to type. Note this overides some bindings.
  (setq outline-minor-mode-prefix "\C-t")
  ; turn on outline mode
  (outline-minor-mode t)
  ; initially hide all but the headers
  ;(hide-body)
  ; make paren matches visible
  (show-paren-mode 1)
)

9 votes

Ressemble à outline-mode prend en charge python dans emacs 24 - pas besoin de personnalisation outline-level fonctions. C'est tout ce dont j'avais besoin pour ajouter à mon user.el : (add-hook 'python-mode-hook 'outline-minor-mode)

2 votes

Oh et vous voulez définitivement remplacer outline-minor-mode-prefix - les combinaisons de touches par défaut sont terribles - j'utilise (setq outline-minor-mode-prefix (kbd "C-;"))

13voto

Alex Ott Points 14329

Vous pouvez également obtenir le pliage du code en utilisant CEDET avec le code suivant dans le fichier init :

(global-semantic-folding-mode t)

Après l'évaluation de ce code, le petit triangle apparaîtra dans la zone de frange, de sorte que vous pourrez plier et déplier le code en l'utilisant. Cette méthode est plus précise, car elle utilise des informations syntaxiques extraites du code source.

1 votes

Si vous rencontrez un problème, consultez cette question : stackoverflow.com/questions/15307113/

6voto

freitass Points 2488

Apparemment, il n'y a pas de solution parfaite, mais je pense que la meilleure est la suivante :

http://www.emacswiki.org/emacs/FoldingMode

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