So wechseln Sie zwischen zwei Positionen in einem Puffer hin und her

38

Manchmal wechsle ich häufig zwischen zwei Funktionen, die ich gemeinsam bearbeite. In diesen Situationen ist es mühsam und schmerzhaft, weiter a zu machen C-s <functionname>, um zur anderen Funktion zu wechseln und dann den genauen Ort zu finden, den ich zuvor bearbeitet habe.

Wie setze ich Markierungen und springe dann problemlos zwischen zwei Positionen im Puffer hin und her?

Vedaad Shakib
quelle
3
Du machst es falsch. Sie sollten eine vertikale geteilte Ansicht haben, damit Sie beide Funktionen gleichzeitig sehen.
CaptainCodeman
8
Ich bin nicht einverstanden, dass OP "es falsch macht". Während ein geteiltes Fenster hilfreich wäre, muss OP beim Bearbeiten beider Funktionen immer noch zwischen den Fenstern hin und her springen. Außerdem ist die Frage allgemeiner als der spezifische Anwendungsfall: OP möchte in der Lage sein, schnell zu verschiedenen Stellen in einem Puffer zu springen. Viele Antworten unten geben eine Reihe von nützlichen Möglichkeiten, um dies zu tun.
Dan
@Dan Das ist cool Mann, und ich stimme dir zu, aber meine Antwort soll nicht sein Problem lösen - nur darauf hinweisen, dass es einen alternativen Weg gibt.
CaptainCodeman
4
@CaptainCodeman, das ist in Ordnung, obwohl T. Vernons Antwort unten die Alternative für geteilte Fenster darstellt. Bitte behandeln Sie meinen Kommentar als eine allgemeinere Bitte um proaktive Sprache in Beiträgen.
Dan
1
@CaptainCodeman Du hast absolut recht. Mir war nicht bewusst, dass Emacs eine vertikale geteilte Ansicht unterstützt. Aus diesem Grund habe ich die Antwort akzeptiert, in der die Verwendung dieser vertikalen geteilten Ansichten beschrieben wird.
Vedaad Shakib

Antworten:

20

Emacs-Fenster

C-x 2öffnet ein weiteres Fenster (= Teilung des Rahmens) unterhalb des aktuellen Fensters, das an denselben Puffer angehängt ist. Sie können einen Punkt in einem der Fenster verschieben, ohne den anderen zu beeinflussen.

Sie können mit von einem Fenster zum anderen wechseln C-x o. Die integrierte Windmove- Bibliothek bietet einige Funktionen, die das Navigieren zwischen Fenstern erleichtern.

Wenn diese Methode zu Ihnen passt, möchten Sie möglicherweise auch einen Blick auf indirekte Puffer werfen .

Bildbeschreibung hier eingeben

T. Verron
quelle
Vielleicht sollten Sie ein paar Zeilen mehr über die Verwendung von indirekten Puffern hinzufügen: Es ist wirklich nützlicher (und ein bisschen komplexer) als die Verwendung eines anderen Fensters.
ffevotte
@Francesco Ich verstehe, was Sie jetzt meinen (mit der anderen Antwort zu indirekten Puffern), in der Tat ist das auch eine sehr einfach zu verwendende Option. Das ist nicht die Verwendung, an die ich gedacht habe: Meine Verwendung von indirekten Puffern ersetzt nicht die Verwendung eines anderen Fensters, ermöglicht jedoch das Ändern der Ansicht, beispielsweise durch Verengen. Ich werde ein paar Worte zur Antwort hinzufügen, wenn ich die Zeit finde.
T. Verron
56

Register:

C-xrSPCläuft point-to-register
C-xrjläuftjump-to-register

Geben Sie ein beliebiges Zeichen ein, um ein Register anzugeben, wenn Sie dazu aufgefordert werden. 1

Lesezeichen:

C-xrmläuft bookmark-set
C-xrbläuftbookmark-jump

Ring markieren:

C-SPCC-SPCschiebt die aktuelle Position auf den Markierungsring (ohne ihn aktiv zu lassen).
C-uC-SPCöffnet den Markierungsring und springt zur vorherigen Position. Sie können dies wiederholt verwenden, um durch den gesamten Ring zu navigieren.

Beachten Sie, dass einige Befehle (insbesondere solche, die Sie möglicherweise eine unbekannte oder willkürliche Entfernung von Ihrem ursprünglichen Standort entfernt haben) automatisch auf den Markierungsring drücken, damit Sie anschließend zurückkehren können C-uC-SPC. Dazu gehört isearch, dass Sie nach dem Verwenden C-svon einfach wieder zurückspringen können.

Tauschstelle und Marke:

Und wie Tu Do kommentiert, C-xC-xläuft exchange-point-and-markdas sehr nützlich, um zwischen zwei Orten zu springen. Hiermit wird auch die Markierung / Region aktiviert, aber Sie können C-SPCdie Hervorhebung mit dieser Option entfernen.


1 Wenn Sie die Registerfunktionalität in elisp nutzen, verwenden Sie anstelle eines Zeichens ein nicht in Konflikt stehendes Symbol für den Namen, damit Sie nicht mit interaktiv gesetzten Registern in Konflikt geraten können (es sei denn, Sie möchten dies natürlich tun) Das).

Phils
quelle
2
Sie sollten auch hinzufügen C-x C-x, da es zwischen zwei Positionen hin und her springen kann. C-u C-SPCWenn Sie den Markierungsring anklicken und erneut ausführen, wird der Punkt an eine andere Stelle verschoben.
Tu Do
18

Neben der Antwort von phils gibt es noch einige weitere Optionen:

  • Helm-All-Mark-Ringe : Hier können Sie den Inhalt des lokalen und des globalen Markierungsrings in einer benutzerfreundlichen Oberfläche anzeigen, sodass Sie immer dorthin zurückkehren können, wo Sie waren. Sie können mit markieren C-SPC C-SPC. Demo:

Helm-Alleskönner-Ringe

  • helm-semantic-or-imenu : Listet alle verfügbaren Definitionen in der aktuellen Datei auf. Befindet sich der Cursor innerhalb einer Definition, wird diese Definition beim Aktivieren des Textmarkers vorausgewählt.

  • sr-speedbar : Ein Dateibrowser, der seine Definitionen in jeder Datei auflistet. Es ähnelt dem Gliederungsbaum in IDE.

Tu Do
quelle
9

Neben Registern und Markern (siehe @phils Antwort zu beiden und meinen anderen, Icicles Antwort zu Markern) können Lesezeichen , insbesondere automatisch benannte oder temporäre Lesezeichen, hilfreich sein. Für diese speziellen Lesezeichentypen benötigen Sie die Bibliothek Bookmark + .

  • Ein automatisch benanntes Lesezeichen muss nicht benannt werden. Es ist schnell zu erstellen und zu löschen: drücken Sie einfach eine Taste. Der gleiche Schlüssel erstellt oder löscht ein Lesezeichen an einer Stelle. (Standardmäßig ist dies an gebunden C-x p RET, aber Sie können natürlich jeden Schlüssel verwenden.)

  • Automatisch benannte Lesezeichen sind wie Lesezeichen im Allgemeinen dauerhaft. Sie können sie jedoch optional automatisch löschen lassen.

  • Sie können auch temporäre Lesezeichen erstellen oder vorhandene Lesezeichen als temporär festlegen. Sie können beispielsweise festlegen, dass automatisch benannte Lesezeichen automatisch temporär sind.

  • Sie können schnell Zyklus unter einem gegebenen Satz von Lesezeichen. Um beispielsweise zwischen automatisch benannten Lesezeichen zu wechseln, verwenden Sie die Befehle bmkp-next-autonamed-bookmark-repeatund bmkp-previous-autonamed-bookmark-repeat(binden Sie sie an die Tasten).

  • Sie können mit Lesezeichen versehene Orte auf verschiedene Arten hervorheben , so dass es einfach ist, sie zu erkennen.

Drew
quelle
7

In Bezug auf indirekte Puffer, die in der akzeptierten Antwort erwähnt wurden ...

M-x clone-indirect-buffererstellt einen indirekten Puffer für den aktuellen Puffer. Dem Namen des neuen Puffers wird '<2>' hinzugefügt (oder eine größere Zahl, wenn Sie bereits doppelte Puffernamen haben). Der neue Puffer wird in einem neuen Fenster geöffnet. Mit C-x 0oder können Sie zu einem einzelnen Fenster zurückkehren C-x 1.

Mit können M-x winner-modeSie bequem zwischen den beiden Standorten wechseln. C-c <left>/ M-x winner-undound C-c <right>/ M-x winner-redowechseln zwischen Fensterkonfigurationen. In diesem Fall sind die Konfigurationen Positionen in den zwei Puffern, die die eine Datei anzeigen.

Hinweis: Die Funktionen winner-undound winner-redoarbeiten mit einer Liste von Konfigurationen. Wenn die Konfiguration geändert wird, z. B. ein Bewegungspunkt, wird die aktuelle Konfiguration zum Kopf der Liste und winner-redoist ungültig. In diesem Fall winner-undowird die vorherige Position wiederhergestellt.

Für die Situation des OP führt dies zu folgendem Prozess:

  1. Schalten Sie den Gewinnermodus ein M-x winner-mode
  2. Besuchsdatei (Dateiname: File1.txt, Puffername: File1.txt)
  3. M-x clone-indirect-buffer (neuer indirekter Puffername: File1.txt <2>)
  4. Aktuelles Fenster zum einzigen Fenster machen C-x 1
  5. Suchen Sie den ersten Bearbeitungsort und nehmen Sie Änderungen vor.
  6. Wechseln Sie zur Originalpuffer-Besuchsdatei C-x b(Standard ist Originalpuffer, sofern seit Schritt 3 kein Wechsel zu einem anderen Puffer stattgefunden hat). Dadurch wird eine neue Konfiguration erstellt, zu der der Gewinner zurückkehren kann.
  7. Suchen Sie einen alternativen Bearbeitungsort, und nehmen Sie Änderungen vor.

Ein Wechsel zum vorherigen Bearbeitungsort (Fensterkonfiguration) hängt davon ab, ob die Fensterkonfiguration zwischen den Schaltern geändert wird.

  • Wenn eine Änderung vorgenommen wird, wechseln Sie mit C-c <left>/ M-x winner-undo.
  • Wenn keine Änderung vorgenommen wird, wechseln Sie mit C-c <left>/ M-x winner-undofür Zurück und C-c <right>/ M-x winner-redofür Vorwärts.

Eine Änderung ist alles andere als eine andere winner-undooder winner-redo.

user2542
quelle
3

wenn Sie verwenden evil-mode, die vim Schicht, dann C-ound C-iwird die gleiche Arbeit.

Sie führen die Befehle evil-jump-backward/ aus forward. C-ospringt zur älteren Position in der Sprungliste, die automatisch gesetzt wird (Markierungen werden bei Bewegungsbefehlen gesetzt). C-igeht in umgekehrter Richtung. Wir können auch TABnach einem C-ostatt verwenden C-i. Wenn Sie also beide Funktionen verwenden, werden Sie in Ihrem aktuellen Puffer vor und zurück geführt.

Wenn Sie möchten, dass diese Funktion Puffer überkreuzt, lesen Sie evil-jumpers: http://melpa.org/#/evil-jumper

«
Evil-Jumper ist ein Add-On für den Evil-Modus, das die Implementierung der Sprungliste so ersetzt, dass sie dem Verhalten von Vim besser entspricht. Insbesondere wird es über Puffergrenzen springen und tote Puffer bei Bedarf wiederbeleben. Die Sprungliste kann auch in einer Datei gespeichert und zwischen Sitzungen wiederhergestellt werden. »

Hinweis: Ich habe es in diesem Wiki gelernt

Ehvince
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Dan
1
D'oh, und mit diesem automatisierten Kommentar meine ich eigentlich, dass die Antwort so aussieht, als wäre sie ein Kommentar zu einer anderen Antwort. Wenn Sie dies bestimmt eine Antwort in seinem eigenen Recht sein, könnten Sie ein wenig auf , was erweitern C-ound C-itun?
Dan
Du hast recht ! getan.
Ehvince
2

Wenn Sie Eiszapfen verwenden , können Sie schnell zwischen den Markierungen in mark-ringjedem Puffer oder dem navigieren global-mark-ring(der in jedem Puffer eine einzelne Markierung enthält).

Sie tun dies mit mehreren Befehlen C-- C-SPC (für einen Puffer mark-ring) oder C-- C-x C-SPC(für den global-mark-ring). Nachdem Sie die Taste einmal gedrückt haben, bewegen Sie sich mit den üblichen Eiszapfen -Tasten usw. zwischen den Markierungen des Rings.

(Dieselben Tasten ohne Präfix arg setzen die Marke ( set-mark-command) bzw. setzen die globale Marke ( pop-global-mark) wie in Vanille-Emacs.)

Der Text der Zeile jedes Markers wird als Abschlusskandidat verwendet. Während der Eingabe werden durch die Eingabe des Minipuffers die Kandidaten auf die übereinstimmenden eingegrenzt (z. B. Teilzeichenfolge- oder Regexp-Übereinstimmung). Sie können schnell zwischen passenden Markern wechseln oder einen von ihnen direkt besuchen. Sie können sogar die Sortierreihenfolge ( C-,) für das Radfahren ändern .

Drew
quelle
2

Eine minimale, aber oft hilfreiche Möglichkeit - wenn Sie nur einen Blick auf die andere Funktion werfen möchten - ist die Einstellung

(setq scroll-preserve-screen-position t)

Dadurch kehren Sie beim Umschalten zwischen C-vund zu Ihrer genauen Start-Cursor-Position zurück M-v.

Dieter.Wilhelm
quelle
1

evil-modeimplementiert Marker im Vim-Stil . Sie können einstellen , Marker mit ( m, das heißt evil-set-marker) und Sprung zur Marke mit dem Graviszeichen `( evil-goto-mark) oder die Linie der Marke '( evil-goto-mark-line).

Sie können also an der ersten Stelle mit madie Markierung "a" erstellen, an der zweiten Stelle mit die Markierung "b" erstellen maund dann 'azur Markierung "a" und 'bzur Markierung "b" springen.

Dan
quelle
1

Verwenden Sie imenu und den folgenden 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))
      )))
chen bin
quelle
1

In den letzten 20 Jahren habe ich zwei Edelsteine ​​verwendet:

(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)))

Ich binde sie an C-. und C- und verwenden Sie sie ständig, ohne es zu merken.

Ja, Register und Marker sind viel flexibler und leistungsfähiger, aber dies ist einer der winzigen, schnellen Helfer, die es mir unmöglich machen, zu anderen Editoren zu wechseln.

Stefan Kamphausen
quelle
1
Wow, du hast das schon länger benutzt, als ich am Leben war.
Vedaad Shakib
Ich denke, das wird noch nicht in der Node- oder Visual Studio Code-Welt passieren, aber wer weiß ... :-) Freut mich zu sehen, dass junge und kluge Leute immer noch Emacs abholen. Ach ja, ich bin noch keine 50 ;-)
Stefan Kamphausen
Das ist ziemlich genial. Ich habe versucht, einen Weg zu finden, um zwischen zwei beliebigen Orten mit aktiviertem Transient-Mark-Modus zu wechseln, und das löst das Problem wirklich gut :) Vielen Dank.
PlagueHammer
0

Sie können auch Makros verwenden, da diese schnell an praktische Tasten gebunden werden können.

<F3> M-g g N <F4>Nehmen Sie zum Beispiel einen Sprung zu Position N mit auf und weisen Sie ihn der Taste F5 mit zu C-x C-k b <F5>. Dann machen Sie dasselbe mit Position M und F6. Von nun an können Sie einfach F5 und F6 abwechseln, um zwischen N und M zu springen.

Da <F4>das zuletzt aufgezeichnete Makro und <C-u> F4das vorletzte Makro ausgeführt werden , können Sie den Tastenbelegungsschritt überspringen und einfach mit <F4>und die Positionen wechseln <C-u> F4.


Eine andere ziemlich radikale Möglichkeit ist, einen indirekten Puffer in einem anderen Fenster mit zu erstellen <C-x> 4 c. Dieser Puffer hat den gleichen Inhalt, kann jedoch eine andere Punktposition haben. Wechseln Sie nun einfach wie <C-x> ogewohnt zwischen den Fenstern .

memeplex
quelle