Quelle est la meilleure façon de réaliser quelque chose comme le pliage de code, ou le type de cyclisme 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'ai pas é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 dire 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 souhaite créer ce qui suit
Lorsque vous mettez 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 simplement utiliser find-tag pour cela) et la dépliera dans le tampon actuel. L'idée est que si vous devez passer à un tampon différent 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, mais il extrait du code externe à la mémoire tampon. Cela pose certains problèmes car il ne peut pas coller le code dans la mémoire tampon ou si quelqu'un l'enregistre, il enregistre 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.
la source
EDIT NB 2
et de lui poser une nouvelle question.Réponses:
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? Tapez C-s
foo
, recherchez la définition, appuyez sur Entrée, lisez-la, puis appuyez sur C-x C-xpour revenir là où vous étiez. Simple et très utile.La plupart des modes prennent en charge imenu . M-x
imenu
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 barre de menus; voir la page Info pour plus de détails). Il fournit des données pour quel mode-fonction, ce qui vous permettra de voir dans quelle fonction vous vous trouvez actuellement dans la modeline. (Pourquoi vos fonctions sont-elles si longues, cependant?)Il existe également une barre de vitesse , qui affiche graphiquement les informations du menu (et d'autres choses).
Si vous voulez avoir un aperçu de votre fichier, essayez M-x
occur
". Étant donné une expression régulière, il créera un nouveau tampon avec chaque correspondance dans le tampon courant. Vous pouvez rechercher" (defun "pour avoir un aperçu des fonctions du fichier courant Cliquez sur le résultat pour vous déplacer vers cette position dans le fichier.Alors de toute façon, pensez à ce que vous voulez vraiment réaliser, et Emacs l'implémentera probablement. Ne vous battez pas avec des outils imparfaits qui vous font plier et déplier constamment les choses.
la source
mode hide-show (
hs-minor-mode
) avec raccourci clavier par défautC-c @ C-M-h
pour déclencher le repliement (hs-hide-all
)la source
zR
,zM
,zo
,zc
.Une autre façon d'écorcher le chat:
M-1 Cx $ et la magie opère!
Comme d'habitude, c'est de la magie blanche: Cx $ ramènera votre code.
du blog de sorcellerie mineur emacs
Juste pour être complet: M-3 Cx $ afficherait un code imbriqué plus profond et ainsi de suite.
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:
la source
J'utilise le mode mineur de contour pour plier mon code python. Au lieu de devoir placer {{{et}}} comme 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 à peu près sûr qu'il est livré avec emacs. J'ajoute ensuite ceci à mes .emacs
la source
outline-mode
prend en charge python prêt à l'emploi dans emacs 24 - pas besoin deoutline-level
fonctions personnalisées . C'est tout ce dont j'avais besoin pour ajouter à monuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- les raccourcis clavier par défaut sont horribles - j'utilise(setq outline-minor-mode-prefix (kbd "C-;"))
Vous pouvez également obtenir le pliage de code en utilisant CEDET avec le code suivant dans le fichier init:
Après évaluation de ce code, le petit triangle apparaîtra dans la zone fringle, 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
la source
hs-minor-mode fonctionne à merveille.
Cela fonctionne encore plus magnifiquement lorsqu'il est associé à fold-dwim (faites ce que je veux dire). Ensuite, il y a fold-dwim-org, qui fournit des raccourcis clavier comme le mode org pour le pliage de code! Les deux peuvent être installés via la marmelade (et je pense elpa).
la source
Apparemment, il n'y a pas de solution parfaite, mais je pense que la meilleure est la suivante:
http://www.emacswiki.org/emacs/FoldingMode
la source
vimish-fold
est également une solution simple et agréable.https://github.com/mrkkrp/vimish-fold .
Depuis la page d'accueil:
En utilisant l'excellent,
use-package
je l'installe et l'active en utilisant cet extrait de code dans ma configuration:la source
Je suis surpris que personne n'ait mentionné le rétrécissement-élargissement. C'est super génial, il est également livré avec emacs. Sélectionnez simplement le code sur lequel vous souhaitez vous concentrer et appuyez sur
C-x n n
, pour revenir au mode plein écran, faites-leC-x n w
. Je préfère toujours utiliser la fonctionnalité emacs intégrée plutôt que d'encombrer mon espace utilisateur avec un autre package. Si emacs peut le faire avec des fonctionnalités intégrées, je préférerai cela à un package tiers, mais ce n'est que moi, cela ne veut pas dire ou n'implique rien d'autre que le fait que j'aime les choses simples sur des configurations longues et complexes.la source
emacs est livré avec hs-minor-mode qui facilite le pliage du code entre les expressions équilibrées http://www.emacswiki.org/emacs/HideShow
la source
Je pense que votre comparaison de votre "projet" au pliage n'est pas tout à fait 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. il n'est pas implémentable en tant que composition d'insertion et de pliage de texte (alors, le contenu du tampon serait modifié).
Mais peut-être, c'est en effet possible avec le même mécanisme que le pliage est fait avec - "superpositions" ... Considérez les propriétés de superposition "before-string" et "after-string" ; peut-être que vous pourriez mettre vos définitions de fonction dans ces chaînes appartenant à une superposition de longueur nulle au point. Regardez la fonction outline-flag-region pour voir comment les superpositions sont utilisées en mode contour.
la source
Si vous utilisez
hs-minor-mode
, cela peut être une bonne idée de définir également un raccourci plus pratique, par exemple:la source
Inspiré de la réponse d' einSelbst :
Voila, est
C-x $
soudainement devenu utile même sans aucunC-u
niM-4
entreprise.la source
Si vous utilisez du JavaScript et que vous utilisez
js2-mode.el
, vous pouvez:C-c C-f
: basculer cacher / tout afficherC-c C-e
: masquer l'élémentC-c C-s
: afficher l'élémentla source