web-dev-qa-db-fra.com

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 cycle utilisé par le mode organisation. Quelle serait la meilleure solution dans elisp pour créer ce type de comportement?

EDIT: Je suis désolé de ne pas avoir été clair. Je veux programmer quelque chose dans elisp qui fait des choses très similaires au pliage de code, ou en fait plus comme le mode org avec la hiérarchie qui peut être développée. Je me demande la meilleure façon d'atteindre cet effet. Je pense avoir entendu que les superpositions emacs sont une bonne solution, mais je ne sais pas.

En ce qui concerne le pliage, j'utilise simplement l'affichage sélectif intégré

MODIFIER LE NUMÉRO 2:

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

Lorsque vous mettez votre point sur une fonction et appelez cette fonction elisp, elle mettra la définition de la fonction d'où qu'elle soit (je pense simplement 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. Je voudrais donc qu'il se comporte comme un pliage de code uniquement s'il extrait du code externe du tampon. Cela présente certains problèmes car il ne peut pas coller le code dans le tampon ou si quelqu'un l'enregistre, il enregistrera le code extrait. Je me demande donc s'il existe un moyen de créer une zone à l'intérieur d'un tampon qui ne fait pas non plus partie du tampon. Je pense que cela a du sens.

108
jacob

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 lors du pliage du code.

La plupart des gens réussissent bien avec de simples recherches incrémentielles. Voir "foo" mentionné quelque part? Type C-sfoo, recherchez la définition, appuyez sur entrée, lisez-la, puis appuyez sur C-xC-x pour retourner là où vous étiez. Simple et très utile.

La plupart des modes prennent en charge imenM-ximenu vous permettra d'accéder directement à 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 barre de menu; voir la page Info pour plus de détails). Il fournit des données pour quel mode de fonction, qui vous permettra de voir dans quelle fonction vous vous trouvez actuellement dans la modélisation. (Pourquoi vos fonctions sont-elles si longues, cependant?)

Il y a aussi speedbar, qui affiche graphiquement les informations d'imenu (et d'autres choses).

Si vous souhaitez obtenir un aperçu de votre fichier, essayez M-xoccur ". Étant donné une expression régulière, elle créera un nouveau tampon avec chaque correspondance dans le tampon actuel. Vous pouvez rechercher" (defun "pour obtenir un aperçu des fonctions que le fichier actuel implémente. Cliquer sur le résultat vous amènera à cette position dans le fichier.

Alors, 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 constamment les choses.

147
jrockway

mode masquer-afficher (hs-minor-mode) avec la liaison de touches par défaut C-c @ C-M-h pour déclencher le pliage (hs-hide-all)

90
dmckee

Une autre façon de dépouiller le chat:

En l'occurrence, vous n'avez besoin d'aucun package ou configuration supplémentaire pour cela. Accédez simplement à n'importe quel fichier source, saisissez

M-1 C-x $ et la magie opère!

Comme d'habitude, c'est de la magie blanche: C-x $ ramènera votre code.

Nous pouvons utiliser le système d'aide d'Emacs pour découvrir ce qui se passe: Ch k Cx $ nous dit que la combinaison de touches ci-dessus appelle set-selective-display , une fonction qui prend un argument numérique (le préfixe M-1 passe 1 comme valeur de cet argument) et, sans surprise, définit la variable selective-display à la valeur de cet argument.

de blog de magie emacs mineur

Juste pour être complet: M-3 C-x $ afficherait un code imbriqué plus profond et ainsi de suite.

FWIW J'ai créé un petit assistant aujourd'hui basé sur smth. trouvé ici pour que F5 bascule le pliage du code en fonction de la position actuelle du curseur:

(global-set-key (kbd "<f5>") 'set-selective-display-dlw)

(defun set-selective-display-dlw (&optional level)
"Fold text indented same of more than the cursor.
If level is set, set the indent level to LEVEL.
If 'selective-display' is already set to LEVEL, clicking
F5 again will unset 'selective-display' by setting it to 0."
  (interactive "P")
  (if (eq selective-display (1+ (current-column)))
      (set-selective-display 0)
    (set-selective-display (or level (1+ (current-column))))))
33
einSelbst

J'utilise le mode contour mineur pour plier mon code python. Au lieu d'avoir à placer {{{et}}} comme en mode pliage, il utilise où le bloc est défini.

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

Je suis quasiment sûr qu'il est livré 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)
)
21
Nikwin

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

(global-semantic-folding-mode t)

Après évaluation de ce code, le petit triangle apparaîtra dans la zone des franges, vous pourrez donc 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

12
Alex Ott

le mode mineur hs fonctionne à merveille.

Cela fonctionne encore plus magnifiquement lorsqu'il est associé à un pli-dwim (faites ce que je veux dire). Ensuite, il y a fold-dwim-org, qui fournit des raccourcis clavier en mode org pour le pliage de code! Les deux peuvent être installés via la marmelade (et je pense que elpa).

9
Jones

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

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

7
freitass

vimish-fold est aussi une solution agréable et facile.

https://github.com/mrkkrp/vimish-fold .

Depuis la page d'accueil:

Il s'agit d'un package pour effectuer le pliage de texte comme dans Vim. Il présente les caractéristiques suivantes:

  • repli des régions actives;
  • bonne rétroaction visuelle: il est évident quelle partie du texte est pliée;
  • persistance par défaut: lorsque vous fermez un fichier, vos plis ne disparaissent pas;
  • la persistance évolue bien, vous pouvez travailler sur des centaines de fichiers avec beaucoup de plis sans effets indésirables;
  • il ne rompt pas l'indentation ou quelque chose;
  • les plis peuvent être basculés de l'état plié à déplié et inversé très facilement;
  • navigation rapide entre les plis existants;
  • vous pouvez utiliser la souris pour déplier les plis (bon pour les débutants et pas seulement pour eux);
  • pour les fans du package avy: vous pouvez utiliser avy pour plier du texte avec un nombre minimal de touches!

En utilisant l'excellent use-package Je l'installe et je l'active en utilisant cet extrait dans ma configuration:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))
5
Horus

emacs est livré avec hs-minor-mode qui facilite le pliage de code entre des expressions équilibrées http://www.emacswiki.org/emacs/HideShow

2
eunikorn

Je crois que votre comparaison de votre "projet" avec le pliage n'est pas très bonne, car le pliage consiste à changer l'apparence tout en gardant le contenu du tampon intact (le texte). Votre projet impliquerait d'afficher du texte supplémentaire tout en gardant le contenu du tampon intact, AFAIU. Alors. ce n'est pas implémentable en tant que composition d'insertion de texte et de pliage (le contenu du tampon serait alors modifié).

Mais peut-être, c'est en effet possible avec le même mécanisme que le pliage se fait avec - "superpositions" ... Considérez les "avant-chaîne" et "après-chaîne" propriétés de superposition ; vous pouvez peut-être mettre vos définitions de fonctions dans ces chaînes appartenant à une superposition de longueur nulle au point. Regardez la fonction contour-flag-region pour voir comment les superpositions sont utilisées en mode contour.

Si tu utilises hs-minor-mode, il peut être judicieux de définir également un raccourci plus pratique, par exemple:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))
1
quazgar

Inspiré de réponse einSelbst :

.. ] args 
 (liste (1+ (colonne actuelle))))) 
 '((nom. set-selective-display-from-cursor-column))) 

Voila, C-x $ est soudainement devenu utile même sans C-u ni M-4 affaires.

0
DomQ