Comment basculer entre deux emplacements dans un tampon


38

Parfois, je me trouve souvent en alternance entre deux fonctions que je suis en train d’éditer conjointement. Dans ces situations, il est fastidieux et pénible de continuer C-s <functionname>à changer d’autre fonction, puis de trouver l’endroit exact que j’étais en train d’ éditer précédemment.

Comment définir des marqueurs puis basculer facilement entre deux emplacements du tampon?


3
Vous le faites mal. Vous devriez avoir une vue fractionnée verticale pour voir les deux fonctions en même temps.
CaptainCodeman

8
Je ne suis pas d'accord pour dire que OP "fait le mal". Bien qu’une fenêtre fractionnée serait utile, OP devra quand même passer d’une fenêtre à l’autre lors de l’édition des deux fonctions. En outre, la question est plus générale que le cas d'utilisation spécifique: OP veut pouvoir rapidement se déplacer rapidement dans différents tampons. Les nombreuses réponses ci-dessous donnent un certain nombre de moyens utiles pour le faire.
Dan

@ Dan C'est un homme cool, et je suis d'accord avec vous, mais ma réponse ne vise pas à résoudre son problème - mais simplement à souligner qu'il existe un autre moyen.
CaptainCodeman

4
@ CaptainCodeman, c'est bien, bien que la réponse de T. Vernon ci-dessous offre l'alternative à fenêtre scindée. Veuillez traiter mon commentaire comme une demande plus générale de langue proactive dans les messages.
Dan

1
@ CaptainCodeman Vous avez absolument raison. Je ne savais pas qu'emacs prenait en charge une vue fractionnée verticalement. En tant que tel, j'ai accepté la réponse qui détaille l'utilisation de ces vues fractionnées verticales.
Vedaad Shakib

Réponses:


20

Fenêtres d'Emacs

C-x 2ouvrira une autre fenêtre (= divise le cadre) en dessous de la fenêtre actuelle, associée au même tampon. Vous pouvez déplacer un point dans l'une des fenêtres sans affecter l'autre.

Vous pouvez passer d'une fenêtre à l'autre en utilisant C-x o. La bibliothèque Windmove intégrée fournit une fonction facilitant la navigation entre les fenêtres.

Si cette méthode vous convient, vous pouvez également consulter les tampons indirects .

entrez la description de l'image ici


Peut-être devriez-vous ajouter quelques lignes sur l’utilisation des tampons indirects: c’est vraiment plus utile (et un peu plus complexe) que d’utiliser une autre fenêtre.
ffevotte

@Francesco, je vois ce que vous voulez dire maintenant (avec l’autre réponse concernant les tampons indirects), c’est effectivement une option très facile à utiliser. Ce n’est pas l’utilisation que j’avais à l’esprit: mon utilisation de tampons indirects ne remplace pas l’utilisation d’une fenêtre différente, mais elle permet par exemple de modifier l’affichage avec rétrécissement. J'ajouterai quelques mots à la réponse lorsque je trouverai le temps.
T. Verron

56

Registres:

C-xrSPCcourt point-to-register
C-xrjcourtjump-to-register

Tapez n'importe quel caractère pour spécifier un registre lorsque vous y êtes invité. 1

Signets:

C-xrmcourt bookmark-set
C-xrbcourtbookmark-jump

Mark ring:

C-SPCC-SPCpousse la position actuelle sur l'anneau de repère (sans le laisser actif).
C-uC-SPCfait apparaître l'anneau de repère en sautant à la position précédente. Vous pouvez utiliser cette fonction à plusieurs reprises pour parcourir l'intégralité de l'anneau.

Notez que certaines commandes (en particulier celles susceptibles de vous déplacer à une distance inconnue ou arbitraire de votre position d'origine) seront automatiquement poussées vers l'anneau de repère afin que vous puissiez les utiliser C-uC-SPCultérieurement. Cela inclut isearch, donc après avoir utilisé C-spour aller quelque part, vous pouvez facilement revenir en arrière.

Point d'échange et marque:

Et comme le fait remarquer Tu Do, cette C-xC-xcourse exchange-point-and-markest très utile pour sauter entre deux endroits. Il active également la marque / région, mais vous pouvez utiliser C-SPCpour effacer la mise en surbrillance.


1 Si vous tirez parti de la fonctionnalité de registre dans elisp, utilisez un symbole non conflictuel pour le nom, plutôt qu'un caractère, afin de ne pas entrer en conflit avec les registres définis de manière interactive (à moins, bien sûr, que vous souhaitiez utiliser. cette).


2
Vous devriez également ajouter C-x C-x, car il peut basculer entre deux positions. C-u C-SPCfait apparaître l'anneau de repère et exécuter à nouveau pour déplacer le point ailleurs.
Tu Do

18

En plus de la réponse de phils, il y a encore plus d'options:

  • helm-all-mark-rings : il vous permet de visualiser le contenu des anneaux de marque locaux et globaux dans une interface conviviale, afin que vous puissiez toujours revenir à votre position actuelle. Vous pouvez pousser la marque avec C-SPC C-SPC. Démo:

anneaux de barre tout-marque

  • helm-sémantique-ou-imenu : Répertorie toutes les définitions disponibles dans le fichier en cours. Si le curseur est à l'intérieur d'une définition, lors de l'activation, le surligneur présélectionne cette définition.

  • sr-speedbar : navigateur de fichiers qui répertorie ses définitions dans chaque fichier. Cela ressemble à l’arborescence dans IDE.


9

Outre les registres et les marqueurs (voir la réponse de @ phils sur les deux et mon autre, Icicles sur les marqueurs), les signets , en particulier les signets auto-nommés ou temporaires, peuvent être utiles à cet égard. Vous avez besoin de la bibliothèque Bookmark + pour ces types de signets spéciaux.

  • Un signet nommé automatiquement est un signet que vous n'avez pas besoin de nommer. Il est rapide de créer et de supprimer: appuyez simplement sur une touche. La même clé crée ou supprime un signet en un point. (Par défaut, cela est lié à C-x p RET, mais vous pouvez bien sûr utiliser n'importe quelle clé.)

  • Les signets nommés automatiquement sont, comme les signets en général, persistants. Mais vous pouvez éventuellement les supprimer automatiquement.

  • Vous pouvez également créer des signets temporaires ou rendre temporaires les signets existants. Vous pouvez, par exemple, choisir de rendre les signets automatiquement nommés automatiquement temporaires.

  • Vous pouvez parcourir rapidement un ensemble de signets donné. Par exemple, pour parcourir les signets nommés automatiquement, utilisez les commandes bmkp-next-autonamed-bookmark-repeatet bmkp-previous-autonamed-bookmark-repeat(en les liant à des clés).

  • Vous pouvez mettre en évidence les lieux marqués de différentes manières, de sorte qu'il est facile de les repérer.


7

En ce qui concerne les tampons indirects mentionnés dans la réponse acceptée ...

M-x clone-indirect-buffercréera un tampon indirect pour le tampon actuel. «<2>» sera ajouté au nom du nouveau tampon (ou à un nombre supérieur si vous avez déjà des noms de tampon en double). Le nouveau tampon est ouvert dans une nouvelle fenêtre. Vous pouvez revenir à une fenêtre unique en utilisant C-x 0ou C-x 1.

Avec M-x winner-modevous pouvez facilement basculer entre les deux endroits. C-c <left>/ M-x winner-undoet C-c <right>/ M-x winner-redobascule entre les configurations de fenêtre. Dans ce cas, les configurations seront des positions dans les deux mémoires tampon visualisant le fichier unique.

Remarque: les fonctions winner-undoet winner-redofonctionnent sur une liste de configurations. Si la configuration est modifiée, par exemple un point en mouvement, la configuration actuelle devient la tête de la liste et winner-redoest invalide. Dans ce cas winner-undo, la position précédente est rétablie.

Dans le cas du PO, cela conduit au processus suivant:

  1. Activer le mode gagnant M-x winner-mode
  2. Fichier de visite (nom de fichier: Fichier1.txt, nom du tampon: Fichier1.txt)
  3. M-x clone-indirect-buffer (nouveau nom de tampon indirect: File1.txt <2>)
  4. Faire de la fenêtre actuelle la seule fenêtre C-x 1
  5. Recherchez le premier lieu de modification, apportez des modifications.
  6. Basculer vers le fichier de visite du tampon d'origine (le tampon C-x bpar défaut sera le tampon d'origine à moins qu'un changement de tampon n'ait eu lieu depuis l'étape 3). Cela crée une nouvelle configuration vers laquelle le gagnant pourra revenir.
  7. Recherchez un autre lieu de modification, apportez des modifications.

Un basculement vers l'emplacement de modification précédent (configuration de la fenêtre) dépend de la modification apportée à la configuration de la fenêtre entre les commutateurs.

  • Si un changement est effectué en utilisant l' interrupteur C-c <left>/ M-x winner-undo.
  • Si aucune modification n’est apportée, utilisez C-c <left>/ M-x winner-undopour le retour et C-c <right>/ M-x winner-redopour le retour.

Un changement est autre chose qu'un autre winner-undoou winner-redo.


3

si vous utilisez evil-modela couche vim, alors C-oet C-ifonctionnera de la même manière.

Ils exécutent les commandes evil-jump-backward/ forward. C-osaute à la position la plus ancienne dans la liste des sauts, qui est définie automatiquement (les marques sont définies dans les commandes de mouvement). C-iva en sens inverse. Nous pouvons également utiliser TABaprès un C-oau lieu de C-i. Donc, utiliser les deux fonctions vous amène dans votre tampon actuel.

Si vous voulez que cette fonctionnalité soit multi-tampon, consultez evil-jumpers: http://melpa.org/#/evil-jumper

«
Evil-jumper est un add-on pour evil-mode qui remplace la mise en œuvre de la liste de sauts de manière à imiter plus fidèlement le comportement de Vim. Plus précisément, il franchira les limites des tampons et réactivera les tampons morts si nécessaire. La liste de sauts peut également être conservée dans un fichier et restaurée entre les sessions. »

Note: je l'ai appris sur ce wiki


Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son message.
Dan

1
D'oh, et par ce commentaire automatisé, je veux dire en fait que la réponse semble être destinée à être un commentaire sur une autre réponse. Si vous vouliez que cette réponse soit une réponse à part entière, pourriez-vous développer un peu plus sur quoi C-oet C-ifaire?
Dan

Tu as raison ! terminé.
Ehvince

2

Si vous utilisez des glaçons, vous pouvez naviguer rapidement entre les marqueurs situés dans le mark-ringou les tampons global-mark-ring(qui possède un seul marqueur dans chaque tampon).

Vous faites cela en utilisant plusieurs commandes C-- C-SPC (pour un tampon mark-ring) ou C-- C-x C-SPC(pour le global-mark-ring). Après avoir appuyé une fois sur la touche, vous utiliserez les touches cycliques etc. habituelles Icicles pour vous déplacer parmi les marqueurs de la bague.

(Les mêmes clés sans préfixe arg définissent respectivement mark ( set-mark-command) et global mark ( pop-global-mark), exactement comme ils le font dans Emacs vanille.)

Le texte de la ligne de chaque marqueur est utilisé comme candidat à l'achèvement. Au fur et à mesure que vous tapez, votre entrée dans le mini-tampon réduit les candidats à ceux qui correspondent (par exemple, correspondance de sous-chaîne ou d'expression régulière). Vous pouvez rapidement parcourir les marqueurs correspondants ou les visiter directement. Vous pouvez même changer l'ordre de tri ( C-,) pour le cyclisme.


2

Une possibilité minime mais souvent utile - quand vous voulez juste jeter un coup d’œil à l’autre fonction -

(setq scroll-preserve-screen-position t)

qui vous ramène à la position exacte de votre curseur de départ lors du basculement entre C-vet M-v.


1

evil-modeimplémente des marqueurs de style Vim . Vous pouvez définir des marqueurs avec ( m, c’est-à-dire evil-set-marker) et passer à la marque avec le backtick `( evil-goto-mark) ou à la ligne de la marque '( evil-goto-mark-line).

Par conséquent, vous pouvez créer la marque "a" au premier emplacement avec ma, créer la marque "b" au deuxième emplacement avec ma, puis 'asauter à la marque "a" et 'bsauter à la marque "b".


1

utiliser imenu et sous le code

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

Depuis environ 20 ans, j'utilise ces deux joyaux:

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

Je les lie à C-. et C-, respectivement, et les utilise constamment sans s’en rendre compte.

Oui, les registres, les marqueurs, etc., sont beaucoup plus souples et puissants, mais c’est quand même l’une de ces petites aides rapides qui rendent impossible le passage à un autre éditeur.


1
Wow, vous utilisez cela depuis plus longtemps que je suis en vie.
Vedaad Shakib

J'imagine que cela ne se produira pas pour l'instant dans le monde des nœuds ou de Visual Studio Code, mais qui sait ... :-) Je suis heureux de voir que des gens jeunes et intelligents prennent encore Emacs. Oh, et je n'ai pas encore 50 ans ;-)
Stefan Kamphausen

C'est vraiment génial. J'ai essayé de trouver un moyen de basculer entre deux emplacements arbitraires avec le mode transitoire de marquage activé, et cela résout le problème très bien :) Merci.
PlagueHammer

0

Vous pouvez également tirer parti des macros, car elles peuvent être rapidement liées à des touches pratiques.

Par exemple, enregistrez un saut en position N avec <F3> M-g g N <F4>et affectez-le à la touche F5 avec C-x C-k b <F5>. Faites de même avec les positions M et F6. A partir de maintenant, vous pouvez simplement alterner F5 et F6 pour passer de N à M.

Encore plus simple, puisque <F4>exécute la dernière macro enregistrée et <C-u> F4l'avant-dernière, vous pouvez ignorer l'étape de reliure à clé et simplement alterner les positions à l'aide de <F4>et <C-u> F4.


Une autre possibilité plutôt radicale est de créer un tampon indirect dans une autre fenêtre avec <C-x> 4 c. Ce tampon a le même contenu mais peut avoir une position de point différente. Maintenant, alternez simplement entre les fenêtres de <C-x> ola manière habituelle.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.