Jak przełączać się między dwiema lokalizacjami w buforze

38

Czasami często znajduję się na przemian między dwiema funkcjami, które edytuję w połączeniu ze sobą. W takich sytuacjach żmudne i bolesne jest ciągłe C-s <functionname>przechodzenie do innej funkcji, a następnie znalezienie dokładnego miejsca, które wcześniej edytowałem.

Jak ustawić znaczniki, a następnie z łatwością przeskakiwać między dwiema lokalizacjami w buforze?

Vedaad Shakib
źródło
3
Robisz to źle. Powinieneś mieć widok podziału pionowego, aby widzieć obie funkcje jednocześnie.
CaptainCodeman
8
Nie zgadzam się, że OP „robi to źle”. Podczas gdy podzielone okno byłoby pomocne, OP nadal będzie musiał przeskakiwać między oknami podczas edycji obu funkcji. Poza tym pytanie jest bardziej ogólne niż konkretny przypadek użycia: OP chce mieć możliwość szybkiego przeskakiwania do różnych lokalizacji w buforze. Wiele odpowiedzi poniżej podaje szereg użytecznych sposobów na zrobienie tego.
Dan
@ Dan To fajny człowiek i zgadzam się z tobą, ale moja odpowiedź nie ma na celu rozwiązania jego problemu - tylko wskazanie, że istnieje alternatywny sposób.
CaptainCodeman
4
@CaptainCodeman, w porządku, chociaż poniższa odpowiedź T. Vernona stanowi alternatywę dla podzielonego okna. Traktuj mój komentarz jako bardziej ogólną prośbę o proaktywny język postów.
Dan
1
@CaptainCodeman Masz absolutną rację. Nie wiedziałem, że emacs obsługuje widok podziału pionowego. Jako taki, zaakceptowałem odpowiedź, która szczegółowo opisuje użycie tych widoków podzielonych w pionie.
Vedaad Shakib

Odpowiedzi:

20

Okna Emacsa

C-x 2otworzy kolejne okno (= podziel ramkę) poniżej bieżącego, dołączone do tego samego bufora. Możesz przenieść punkt w jednym oknie bez wpływu na drugie.

Możesz przechodzić z jednego okna do drugiego za pomocą C-x o. Wbudowana biblioteka windmove zapewnia pewne funkcje, które ułatwiają nawigację między oknami.

Jeśli ta metoda Ci odpowiada, możesz także przyjrzeć się buforom pośrednim .

wprowadź opis zdjęcia tutaj

T. Verron
źródło
Może powinieneś dodać jeszcze kilka wierszy na temat używania buforów pośrednich: to naprawdę jest bardziej przydatne (i nieco bardziej złożone) niż używanie tylko innego okna.
ffevotte
@Francesco Rozumiem teraz, co masz na myśli (z inną odpowiedzią na temat buforów pośrednich), w rzeczy samej jest to również bardzo łatwa w użyciu opcja. Nie to miałem na myśli: moje użycie buforów pośrednich nie zastępuje za pomocą innego okna, ale pozwala na przykład zmienić widok z zawężeniem. Kiedy znajdę czas, dodam kilka słów do odpowiedzi.
T. Verron
56

Rejestry:

C-xrSPCbiegnie point-to-register
C-xrjbiegniejump-to-register

Po wyświetleniu monitu wpisz dowolny znak, aby określić rejestr. 1

Zakładki:

C-xrmbiegnie bookmark-set
C-xrbbiegniebookmark-jump

Oznacz pierścień:

C-SPCC-SPCprzesuwa bieżącą pozycję do pierścienia znacznika (bez pozostawiania go aktywnym).
C-uC-SPCwyskakuje znacznik, przeskakując do poprzedniej pozycji. Możesz użyć tego wielokrotnie, aby poruszać się po całym pierścieniu.

Zauważ, że niektóre polecenia (zwłaszcza te, które mogą przenieść cię w nieznaną lub dowolną odległość od twojej pierwotnej lokalizacji) automatycznie popchną do pierścienia znacznika, dzięki czemu będziesz mógł C-uC-SPCpóźniej wrócić. Obejmuje to isearch, więc po użyciu, C-saby gdzieś pójść, możesz łatwo wrócić ponownie.

Punkt wymiany i znak:

I jak komentuje Tu Do, C-xC-xbiegi, exchange-point-and-markktóre są bardzo przydatne do przeskakiwania między dwoma lokalizacjami. Aktywuje również znacznik / region, ale możesz użyć, C-SPCaby usunąć podświetlenie.


1 Jeśli korzystasz z funkcji rejestru w elisp, użyj nazwy bez konfliktu z nazwą zamiast znaku, aby nie można było konfliktować z rejestrami interaktywnymi (chyba że chcesz to zrobić że).

phils
źródło
2
Należy również dodać C-x C-x, ponieważ może przeskakiwać w obie strony między dwiema pozycjami. C-u C-SPCwyskakuje pierścień znaku i wykonanie ponownie spowoduje przesunięcie punktu w inne miejsce.
Tu Do
18

Oprócz odpowiedzi Phils istnieje jeszcze kilka opcji:

  • helm-all-mark-rings : Pozwala wyświetlić zawartość zarówno lokalnych, jak i globalnych pierścieni znaku w przyjaznym interfejsie, dzięki czemu zawsze możesz wrócić do miejsca, w którym byłeś. Możesz nacisnąć znak za pomocą C-SPC C-SPC. Próbny:

pierścienie steru

  • helm-semantic-or-imenu : Wyświetla wszystkie dostępne definicje w bieżącym pliku. Jeśli kursor znajduje się w definicji, podczas aktywacji zakreślacza wstępnie wybiera tę definicję.

  • sr-speedbar : przeglądarka plików, która wyświetla definicje w każdym pliku. Jest podobny do drzewa konspektu w IDE.

Do zrobienia
źródło
9

Oprócz rejestrów i znaczników (patrz odpowiedź @ phils na temat zarówno moich, jak i innych, Sople odpowiadają na temat znaczników), zakładki , szczególnie automatyczne lub tymczasowe, mogą być do tego pomocne. Potrzebujesz biblioteki Bookmark + dla tych specjalnych typów zakładek.

  • Automatycznie nazwana zakładka to taka, której nie trzeba nazywać. Tworzenie i usuwanie jest szybkie: wystarczy nacisnąć klawisz. Ten sam klucz tworzy lub usuwa zakładkę w punkcie. (Domyślnie jest to związane C-x p RET, ale oczywiście można użyć dowolnego klawisza).

  • Zakładki z automatyczną nazwą są, podobnie jak zakładki, trwałe. Ale możesz opcjonalnie usunąć je automatycznie.

  • Możesz także tworzyć tymczasowe zakładki lub tymczasowo tworzyć istniejące zakładki. Możesz na przykład zdecydować, aby automatycznie nazwane zakładki były tymczasowe automatycznie.

  • Możesz szybko przełączać się między danym zestawem zakładek. Na przykład, aby przełączać się między automatycznie zapisanymi zakładkami, używaj poleceń bmkp-next-autonamed-bookmark-repeati bmkp-previous-autonamed-bookmark-repeat(wiążąc je z klawiszami).

  • Lokalizacje oznaczone zakładkami można wyróżnić na różne sposoby, dzięki czemu łatwo je zauważyć.

Rysował
źródło
7

W odniesieniu do buforów pośrednich wymienionych w przyjętej odpowiedzi ...

M-x clone-indirect-bufferutworzy bufor pośredni dla bieżącego bufora. Do nazwy nowego bufora zostanie dodany „<2>” (lub większa liczba, jeśli masz już zduplikowane nazwy buforów). Nowy bufor zostanie otwarty w nowym oknie. Możesz wrócić do pojedynczego okna za pomocą C-x 0lub C-x 1.

Dzięki M-x winner-modemożesz łatwo przełączać się między dwiema lokalizacjami. C-c <left>/ M-x winner-undoi C-c <right>/ M-x winner-redoprzełącza między konfiguracjami okien. W takim przypadku konfiguracje będą pozycjami w dwóch buforach wyświetlających jeden plik.

Uwaga: funkcje winner-undoi winner-redodziałają na liście konfiguracji. Jeśli konfiguracja zostanie zmieniona, np. Punkt ruchomy, wówczas bieżąca konfiguracja stanie się głową listy i winner-redobędzie nieważna, w tym przypadku winner-undoprzywróci poprzednią pozycję.

W sytuacji PO prowadzi to do następującego procesu;

  1. Włącz tryb zwycięzcy M-x winner-mode
  2. Odwiedź plik (nazwa pliku: File1.txt, nazwa bufora: File1.txt)
  3. M-x clone-indirect-buffer (nowa nazwa bufora pośredniego: File1.txt <2>)
  4. Ustaw bieżące okno jako jedyne okno C-x 1
  5. Znajdź lokalizację pierwszej edycji, wprowadź zmiany.
  6. Przełącz do pliku odwiedzającego oryginalny bufor C-x b(domyślnie będzie to oryginalny bufor, chyba że od kroku 3 nastąpiła zmiana na inny bufor). Spowoduje to utworzenie nowej konfiguracji, z której zwycięzca będzie mógł wrócić.
  7. Znajdź alternatywną lokalizację edycji, wprowadź zmiany.

Przełączenie do poprzedniej lokalizacji edycji (konfiguracji okna) zależy od tego, czy zmiana konfiguracji okna jest dokonywana między przełącznikami;

  • Jeśli dokonano zmiany, przełącz za pomocą C-c <left>/ M-x winner-undo.
  • Jeśli nie zostanie wprowadzona żadna zmiana, przełącz za pomocą C-c <left>/ M-x winner-undodo tyłu i C-c <right>/ M-x winner-redodo przodu.

Zmiana to coś innego niż inny winner-undolub winner-redo.

użytkownik2542
źródło
3

jeśli użyjesz evil-modewarstwy vim, wtedy C-oi C-ibędzie działać tak samo.

Wykonują polecenia evil-jump-backward/ forward. C-oprzeskakuje do starszej pozycji na liście skoków, która jest ustawiana automatycznie (znaki są ustawiane w poleceniach ruchu). C-iidzie w odwrotną stronę. Możemy również użyć TABpo C-ozamiast C-i. Tak więc korzystanie z obu funkcji zabierze Cię tam iz powrotem w bieżącym buforze.

Jeśli chcesz, aby ta funkcja była buforami krzyżowymi, sprawdź evil-jumpers: http://melpa.org/#/evil-jumper

«
Evil-jumper to dodatek do trybu zła, który zastępuje implementację listy skoków, dzięki czemu lepiej naśladuje zachowanie Vima. W szczególności przeskoczy przez granice buforów i w razie potrzeby ożywi martwe bufory. Skróconą listę można również utrwalić w pliku i przywrócić między sesjami. »

Uwaga: nauczyłem się tego na tej wiki

Ehvince
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
Dan
1
D'oh i przez ten automatyczny komentarz mam na myśli, że odpowiedź wygląda tak, jakby miała być komentarzem do innej odpowiedzi. Jeśli chciałbyś, aby była to odpowiedź sama w sobie, czy mogłabyś trochę rozwinąć kwestię C-oi C-izrobić?
Dan
Masz rację ! gotowy.
Ehvince,
2

Jeśli używasz Sopli , możesz szybko nawigować między znacznikami w mark-ringkażdym buforze lub global-mark-ring(który ma jeden znacznik w każdym buforze).

Robisz to za pomocą wielu poleceń C-- C-SPC (dla bufora mark-ring) lub C-- C-x C-SPC(dla global-mark-ring). Po jednokrotnym naciśnięciu klawisza używasz zwykłych kluczy rowerowych Sople itp., Aby poruszać się między znacznikami pierścienia.

(Te same klucze bez przedrostka arg ustawiają odpowiednio mark ( set-mark-command) i pop globalnego mark ( pop-global-mark), tak jak robią to w waniliowym Emacsie.)

Tekst wiersza każdego znacznika jest używany jako kandydat do uzupełnienia. Podczas pisania dane wejściowe minibufora zawężają kandydatów do pasujących (np. Dopasowywanie podłańcuchów lub wyrażeń regularnych). Możesz szybko przełączać się między pasującymi znacznikami lub bezpośrednio odwiedzić dowolny z nich. Możesz nawet zmienić kolejność sortowania ( C-,) dla jazdy na rowerze.

Rysował
źródło
2

Minimalną, ale często pomocną możliwością - gdy chcesz tylko zerknąć na drugą funkcję - jest ustawienie

(setq scroll-preserve-screen-position t)

co przywraca dokładną początkową pozycję kursora podczas przełączania między C-vi M-v.

Dieter.Wilhelm
źródło
1

evil-modeimplementuje markery w stylu Vima . Możesz ustawić znaczniki za pomocą ( m, to znaczy evil-set-marker) i przeskoczyć do znaku za pomocą backsticka `( evil-goto-mark) lub do linii znaku '( evil-goto-mark-line).

Dlatego możesz utworzyć znak „a” w pierwszym miejscu za pomocą ma, utworzyć znak „b” w drugim miejscu za pomocą ma, a następnie 'aprzeskoczyć, aby zaznaczyć „a” i 'bprzeskoczyć, aby zaznaczyć „b”.

Dan
źródło
1

użyj imenu i poniżej kodu

(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
źródło
1

Przez ostatnie 20 lat korzystałem z tych dwóch klejnotów:

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

Wiążę je z C-. i C-, i używaj ich stale, nie zdając sobie z tego sprawy.

Tak, rejestry i znaczniki i tym podobne są znacznie bardziej elastyczne i wydajne, ale wciąż jest to jeden z tych małych, szybkich pomocników, które uniemożliwiają mi przejście do innych edytorów.

Stefan Kamphausen
źródło
1
Wow, używasz tego dłużej niż ja żyję.
Vedaad Shakib
Wydaje mi się, że tak się jeszcze nie stanie w świecie Node lub Visual Studio Code, ale kto wie ... :-) Cieszę się, że młodzi i sprytni ludzie wciąż wybierają Emacsa. Aha, a ja jeszcze nie mam 50 ;-)
Stefan Kamphausen
To jest niesamowite. Próbowałem znaleźć sposób na przełączanie między dwoma dowolnymi lokalizacjami z włączonym trybem przejściowego znacznika, a to rozwiązuje problem naprawdę dobrze :) Dziękuję.
PlagueHammer
0

Możesz również skorzystać z makr, ponieważ można je szybko powiązać z wygodnymi kluczami.

Na przykład zapisz skok do pozycji N za pomocą <F3> M-g g N <F4>i przypisz go do klawisza F5 za pomocą C-x C-k b <F5>. Następnie zrób to samo z pozycjami M i F6. Od teraz możesz po prostu zamieniać F5 i F6, aby przeskakiwać między N i M.

Jeszcze prostsze, ponieważ <F4>wykonuje ostatnie zarejestrowane makro i <C-u> F4następne do ostatniego, możesz pominąć krok wiązania klucza i po prostu zmieniać pozycje za pomocą <F4>i <C-u> F4.


Inną dość radykalną możliwością jest utworzenie bufora pośredniego w innym oknie za pomocą <C-x> 4 c. Bufor ma tę samą zawartość, ale może mieć inną pozycję punktu. Teraz po prostu zmieniaj okna <C-x> ow zwykły sposób.

memeplex
źródło