Je souhaite naviguer entre les lignes d'un fichier en fonction de l'indentation. Le fichier est structuré par indentation: une ligne plus indentée que la ligne précédente est un enfant de la ligne précédente, une ligne qui a la même indentation que la ligne précédente est son frère. Je recherche principalement trois commandes:
- Passez au frère suivant, c'est-à-dire à la ligne suivante avec la même indentation, en sautant les lignes qui sont plus en retrait, mais en ne sautant pas au-delà d'une ligne qui est moins en retrait.
- Passez au frère précédent, c'est-à-dire la même chose dans l'autre sens.
- Déplacer vers le parent, c'est-à-dire vers la ligne précédente avec moins de retrait.
La position de la colonne du point ne doit pas changer.
Ceux - ci sont analogues pour des données structurées indentation à forward-sexp
, backward-sexp
et backward-up-list
pour les données structurées sexp. L'indentation correspond à la structure du programme dans des langages tels que Haskell et Python; ces fonctions peuvent être particulièrement utiles dans ce contexte mais je ne recherche rien de spécifique au mode (mon cas d'utilisation principal est des données structurées d'intention dans un autre format de fichier).
La coloration des niveaux d'indentation peut aider à naviguer manuellement avec Up/ Downmais je veux quelque chose d'automatique.
Cette question de super utilisateur est similaire mais avec des exigences plus faibles et n'a actuellement pas de réponses qui répondent à mes exigences.
la source
set-selective-display
Vous rapproche- t- on de ce dont vous avez besoin?indent-tools
dans melpa ( indent-tools ), qui fonctionne probablement à cet effet. Le premier commit a eu lieu le 16 mai 2016, environ 3 mois après que cette question a été posée.Réponses:
En examinant les quatre réponses disponibles actuellement ( deux sur Super User et deux sur cette question), je vois les problèmes suivants:
outline.el
, il va de toute façon ligne par ligne (en utilisantoutline-next-visible-heading
) dans notre cas, car (presque) toutes les lignes correspondraient à l'expression rationnelle du contour et compteraient comme un "en-tête".Donc, rassemblant quelques idées de chacun, j'ai ce qui suit: avancer ligne par ligne, sauter les lignes vides et plus en retrait. Si vous êtes à indentation égale, c'est le prochain frère. L'idée de base ressemble à ceci:
Convenablement généralisé (avant / arrière / haut / bas), ce que j'utilise ressemble à ce qui suit actuellement:
Il y a encore plus de fonctionnalités souhaitables, et regarder
outline.el
et réimplémenter certaines d'entre elles peut aider, mais je suis satisfait de cela pour l'instant, pour mes besoins.la source
(current-line)
c'est quelque chosemisc-fns.el
que j'ai en quelque sorte dans mon installation Aquamacs dans le cadre d'uneoneonone.el
bibliothèque.Cette fonctionnalité existe dans Emacs. Le mode Plan décrit un document comme contenant des lignes de titre avec un niveau et dispose de fonctions pour se déplacer entre les niveaux. Nous pouvons définir chaque ligne comme une ligne de titre avec un niveau qui reflète son indentation: défini
outline-regexp
sur l'indentation. Plus précisément, l'empreinte ainsi que le premier caractère non-espaces (et le début du fichier est le plus haut niveau):\`\|\s-+\S-
.Dans Emacs 22.1–24.3, vous pouvez simplifier ceci pour:
Ensuite, vous pouvez utiliser les commandes de mouvement de contour :
C-C @ C-f
(outline-forward-same-level
) pour passer au frère suivant;C-C @ C-b
(outline-backward-same-level
) pour passer au frère précédent;C-C @ C-u
(outline-up-heading
) pour passer au parent.Un onglet et un espace comptent pour la même quantité d'indentation. Si vous avez un mélange d'onglets et d'espaces, définissez-le
tab-width
correctement et appelezuntabify
.Si le mode principal actuel a des paramètres de contour, ils peuvent entrer en conflit. Dans ce cas, vous pouvez utiliser l'une des nombreuses solutions à modes majeurs multiples , la plus simple étant de créer un tampon indirect et de le définir sur Outline Major Mode. En mode Plan principal, les raccourcis clavier par défaut sont plus simples à saisir:,
C-c C-f
etc.la source
M-x make-local-variable RET outline-regexp RET
n'accepte pas cette variable et dit seulement «[Aucune correspondance]». Je dois encore y regarder plus attentivement.outline-regexp
n'est plus un defcustom et ne peut pas être réglé interactivement si facilement.Les trois commandes suivantes, testées au minimum, devraient permettre une navigation de base par des lignes en retrait. Toutes mes excuses pour la répétition du code.
la source
(current-column)
mais cela empêche le curseur de bouger), mais ne correspond pas exactement à mes spécifications: se déplacer à un niveau d'indentation passe moins - lignes en retrait.ind-forward-sibling
recherche simplement la ligne suivante avec la même indentation, donc elle saute les lignes avec moins d'indentation (elle avance même lorsqu'il n'y a pas de frère en avant).