Comment obtenir des effets de pliage de code dans Emacs?

Quel est le meilleur moyen d’obtenir quelque chose comme le pliage de code, ou le type de cyclage utilisé par le mode org. Quelle serait la meilleure solution dans elisp pour créer ce type de comportement?

EDIT: Je suis désolé je n’étais pas clair. Je veux programmer quelque chose dans elisp qui fait des choses très similaires au pliage du code, ou qui ressemble le plus au mode org avec la hiérarchie qui peut être étendue. Je me demande quelle est la meilleure façon d’atteindre cet objective. Je pense avoir entendu que les superpositions d’Emacs sont une bonne solution, mais je ne sais pas.

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

NUMÉRO DE MODIFICATION 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 le suivant

Lorsque vous placez votre point sur une fonction et que vous appelez cette fonction elisp, la définition de la fonction est établie où qu’elle se trouve (je pense simplement à utiliser find-tag pour cela) et la déplie 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 qu’il s’agit d’un changement de contexte vers un autre fichier. Donc, je voudrais qu’il se comporte comme le pliage de code, mais il extrait le code externe du tampon. Cela pose quelques problèmes car il ne peut pas coller le code dans le tampon ou si quelqu’un le sauvegarde, 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 partie du tampon. Je pense que cela a du sens.

    Le pliage est généralement inutile avec emacs, car il comporte des outils qui implémentent explicitement les actions que les utilisateurs effectuent manuellement lors du pliage du code.

    La plupart des gens réussissent bien avec des recherches incrémentales simples. Voir “foo” mentionné quelque part? Tapez Cs foo , trouvez la définition, appuyez sur Entrée, lisez-le, puis appuyez sur Cx Cx pour revenir à votre position actuelle. Simple et très utile.

    La plupart des modes supportent imenu . Mx imenu vous permettra de passer à 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’append à la barre de menus; voir la page d’informations pour plus de détails). Il fournit des données pour quel mode de fonction, ce qui vous permettra de voir quelle fonction vous êtes actuellement dans le modèle. (Pourquoi vos fonctions sont-elles aussi longues, cependant?)

    Il y a aussi la barre de vitesse , qui affiche les informations imenu (et d’autres choses) graphiquement.

    Si vous voulez avoir un aperçu de votre fichier, essayez Mx “. Avec une expression régulière, il créera un nouveau tampon avec chaque correspondance dans le tampon actuel. Vous pouvez rechercher” (defun “pour avoir un aperçu des fonctions du les implémentations actuelles du fichier.Cliquer sur le résultat vous déplacera vers 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 les choses en permanence.

    Mode masquer-afficher ( hs-minor-mode ) avec la liaison par défaut Cc @ CMh pour déclencher le pliage ( hs-hide-all )

    Une autre façon de peler le chat:

    En l’occurrence, vous n’avez besoin d’aucun package ou configuration supplémentaire pour cela. Allez simplement dans n’importe quel fichier source, tapez

    M-1 Cx $ et la magie se produit!

    Comme d’habitude, c’est de la magie blanche: Cx $ 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 de cet argument) et, sans surprise, définit la variable display-display à la valeur de cet argument.

    du blog sorcier emacs mineur

    Juste pour être complet: M-3 Cx $ afficherait un code nested plus profond, etc.

    FWIW j’ai fait une petite aide aujourd’hui basée sur smth. trouvé ici pour que F5 bascule le pliage du code en fonction de la position actuelle du curseur:

     (global-set-key (kbd "") '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)))))) 

    J’utilise le mode mineur d’esquisse pour plier mon code python. Au lieu de devoir placer {{{et}}} en mode pliage, 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 quasiment sûr que ça vient avec emacs. J’ajoute alors ceci à mes .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 \Cc@ prefix, too hard to type. Note this overides some bindings. (setq outline-minor-mode-prefix "\Ct") ; turn on outline mode (outline-minor-mode t) ; initially hide all but the headers ;(hide-body) ; make paren matches visible (show-paren-mode 1) ) 

    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 évaluation de ce code, le petit sortingangle apparaîtra dans la zone de frange, 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

    hs-minor-mode fonctionne à merveille.

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

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

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

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

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

    De la page d’accueil:

    Ceci est un paquet pour effectuer le pliage de texte comme dans Vim. Il a les caractéristiques suivantes:

    • pliage 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 s’adapte bien, vous pouvez travailler sur des centaines de fichiers avec beaucoup de plis sans effets indésirables;
    • cela ne brise pas l’indentation ou quelque chose;
    • les plis peuvent être basculés de l’état plié à déplié et en arrière 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 de package avy: vous pouvez utiliser avy pour plier du texte avec un nombre minimal de touches!

    En utilisant l’excellent use-package que j’installe et que je active en utilisant cet extrait dans ma configuration:

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

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

    Je crois que votre comparaison de votre “projet” avec le pliage n’est pas très bonne, car le pliage consiste à modifier l’apparence tout en gardant le contenu du tampon intact (le texte). Votre projet impliquerait de montrer du texte supplémentaire tout en gardant le contenu du tampon intact, AFAIU. Alors. il ne peut être implémenté en tant que composition d’insertion de texte et de pliage (le contenu du tampon serait alors modifié).

    Mais peut-être, il est en effet possible avec le même mécanisme que le pliage est fait avec – “overlays” … Considérons les propriétés de superposition “before-ssortingng” et “after-ssortingng”; peut-être, vous pourriez mettre vos définitions de fonctions dans ces chaînes appartenant à une superposition de longueur nulle au point. Regardez la fonction contour-indicateur-région pour voir comment les superpositions sont utilisées dans le mode contour.

    Si vous utilisez le mode hs-minor-mode , il peut être judicieux de définir un raccourci plus pratique, par exemple:

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