Question

Quelle est la meilleure façon d'obtenir quelque chose comme le pliage de code, ou le type de vélo que mode org utilise. Quelle serait la meilleure solution elisp pour créer ce type de comportement?

EDIT: Je suis désolé je ne suis pas clair. Je veux programmer quelque chose dans 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 la meilleure façon d'atteindre cet effet. Je crois avoir entendu des superpositions emacs sont une bonne solution, mais je ne sais pas.

En ce qui concerne le pliage je viens d'utiliser la commande interne set-sélectif affichage

EDIT 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 je suis en train de faire. Je voudrais créer les éléments suivants

Lorsque vous mettez votre point sur une fonction et d'appeler cette fonction elisp il mettra la définition de la fonction de là où il est (je pense que vous utilisez la recherche-tag pour cela) et déplier dans le tampon courant. L'idée est que si vous devez passer à un tampon différent pour lire la définition de la fonction, je me sens comme son un changement de contexte à un autre fichier. Je voudrais donc se comporter comme le pliage de code seulement il tire dans le code externe du tampon. Cela pose quelques problèmes car il ne peut pas coller acutally le code dans la mémoire tampon ou si quelqu'un l'enregistre, il sauvera le tiré dans le code. Je me demande donc s'il y a un moyen de créer une zone à l'intérieur d'un tampon qui est également pas partie du tampon. Je pense que logique.

Était-ce utile?

La solution

Le pliage est généralement inutile avec emacs, car il a des outils qui mettent en œuvre les actions explicitement les gens font manuellement lorsque le pliage de code.

La plupart des gens ont un bon succès avec des recherches supplémentaires simples. Voir « foo » mentionné quelque part? Tapez C-s foo, trouver la définition, appuyez sur Entrée, lire, puis appuyez sur C-x C-x pour revenir à l'endroit où vous étiez. Simple et très utile.

La plupart des modes de soutien imenu . M-x imenu vous permettra de passer directement à une définition de fonction (etc.) par son nom. Vous pouvez également lier à un clic de souris pour obtenir un menu de fonctions (ou l'ajouter à la barre de menus, voir la page d'information pour plus de détails). Il fournit des données pour mode qui fonction, ce qui vous permettra de voir quelle fonction vous êtes actuellement à l'intérieur de la modeline. (Pourquoi vos fonctions ce long, bien?)

Il est également speedbar , qui affiche les informations imenu (et d'autres choses) graphiquement.

Si vous voulez avoir un aperçu de votre fichier, essayez Mx occur «Compte tenu d'une expression rationnelle, il va créer un nouveau tampon avec chaque match dans le tampon courant. Vous pouvez rechercher » ( defun » pour obtenir une vue d'ensemble des fonctions du fichier en cours met en œuvre. en cliquant sur le résultat vous déplacer à cette position dans le fichier.

De toute façon, pensez à ce que vous voulez vraiment atteindre, et Emacs implémente probablement. Ne pas se battre avec des outils imparfaits qui vous font plier et déplier les choses en permanence.

Autres conseils

Le mode cache-show (hs-minor-mode) avec C-c @ C-M-h défaut de raccourci clavier pour déclencher le pliage (hs-hide-all)

Une autre façon à la peau du chat:

  

Comme il arrive, vous ne avez pas besoin de forfait ou de configuration supplémentaire pour   cette. Il suffit d'aller à tout fichier source, tapez

M-1 C-x $ et la magie se produit!

Comme d'habitude, il y a de la magie blanche. C-x $ apportera votre code de retour

  

Nous pouvons utiliser le système d'aide Emacs pour découvrir ce qui se passe: C-Hk C-x $   nous dit que la combinaison de touches ci-dessus appelle    set-sélectif affichage , une fonction qui prend un argument numérique   (Le préfixe M-1 passe à 1 lorsque la valeur de cet argument) et,   Sans surprise, définit la sélection d'affichage variable à la valeur de   cet argument.

emacs mineures blog Wizardry

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

FWIW j'ai fait aujourd'hui aide minuscule basée sur lissée. afin que le code de F5 permet de basculer le pliage 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))))))

J'utilise le contour en mode mineur pour plier mon code python. Au lieu d'avoir besoin de placer {{{et}}} comme dans le mode de pliage, il utilise 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 assez sûr qu'il est livré avec emacs. Je puis ajouter 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 \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)
)

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ît dans la zone Fringle, vous serez en mesure de plier et déplier le code de l'utiliser. Cette méthode est plus précis, car il utilise des informations syntaxiques, extrait de code source

hs-mode mineur fonctionne à merveille.

Il fonctionne encore plus beau quand il est associé avec double-dwim (fais ce que je veux dire). Ensuite, il y a fold-dwim-org, qui fournit des org-mode comme les 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 le meilleur est le suivant:

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

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

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 présente les caractéristiques suivantes:

     
      
  • pliage des régions actives;
  •   
  • bon retour visuel: il est évident quelle partie du texte est plié;
  •   
  • persistance par défaut: lorsque vous fermez le fichier vos plis ne disparaissent pas;
  •   
  • la persistance des échelles bien, vous pouvez travailler sur des centaines de fichiers avec beaucoup de plis sans effets indésirables;
  •   
  • il ne rompt pas indentation ou quelque chose;
  •   
  • plis peut être basculée d'un état plié et déplié dos très facilement;
  •   
  • navigation rapide entre les plis existants;
  •   
  • vous pouvez utiliser la souris pour déployer des plis (bon pour les débutants et non seulement pour eux);
  •   
  • pour les fans du paquet Avy: vous pouvez utiliser Avy pour plier le texte avec un nombre minimal de touches
  • !   

En utilisant l'excellent use-package installer et activer à l'aide de cet extrait dans ma config:

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

emacs est livré avec hs-mode mineur qui fascilitates pliage de code entre les expressions équilibrées http://www.emacswiki.org/emacs/HideShow

Je crois que votre comparaison de votre « projet » au pliage est pas tout à fait bon, parce que le pliage est de changer l'apparence tout en gardant le contenu du tampon intact (le texte). Votre projet impliquerait montrant du texte supplémentaire tout en gardant le contenu du tampon intact, AFAIU. Alors. ce n'est pas implémentable comme une composition de texte d'insertion et de pliage (puis, le contenu du tampon seraient modifiés).

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

Si vous utilisez hs-minor-mode, il pourrait être une bonne idée de mettre également un raccourci plus pratique, par exemple:.

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

Avec l'inspiration de réponse einSelbst :

(advice-add 'set-selective-display
            :filter-args (lambda (args)
                           (if (or (car args) selective-display)
                               args
                             (list (1+ (current-column)))))
            '((name . set-selective-display-from-cursor-column)))

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top