Jak szybko przełączać bufory?

67

W waniliowym Emacsie muszę to zrobić, C-x ba następnie ręcznie wpisać nazwę bufora, aby przełączyć. Jeśli zapomnę nazwę bufora, muszę nacisnąć przycisk, TABaby wyświetlić listę możliwych uzupełnień. Czy mogę coś zrobić, aby ten proces był szybszy?

Nixeagle
źródło
10
To powinno zostać oznaczone Wiki Wiki. Ale Emacs ma już gigantyczną wiki. Na przykład moim najlepszym wynikiem Google jest ta strona na temat przełączania buforów . Pytania w stylu CW wydają mi się szczególnie nie na miejscu na emacs.SE.
purple_arrows
1
Lubię używać C-x C-<left/right>do szybkiego przełączania buforów. Kiedy potrzebuję przełączyć na „dalszy” bufor, używam IBuffer.
kuanyui
Używam „Cx x” do przełączania buforów (ze sterem i czapkami zmapowanymi do kontroli). Nigdy nie czułem się komfortowo, wpisując „Cx b”.
wdkrnls,
1
Użyj jednego z rozwiązań zawartych w odpowiedziach i nie używaj Cx b. 3 klucze to za dużo na tak częste operacje. Osobiście używam jednego klucza, odpowiedniego klawisza systemu Windows, którego inaczej nie używam.
Tom

Odpowiedzi:

49

Jest tryb ido , który powinien pomóc.

EDYTOWAĆ:

umieść to w pliku init, aby domyślnie aktywować tryb ido:

(ido-mode 1)

Teraz C-x bpokaże ci listę kandydatów.

Umieść to w pliku init, jeśli wolisz, aby elementy były wyświetlane pionowo:

(setq ido-separator "\n")

Dzięki uprzejmości ergoemacs

Pozwól, że zasugeruję również ten post mówiący o przejściu na poprzedni / następny bufor.

Nsukami _
źródło
2
Prawdopodobnie powinniśmy spróbować uzyskać większość ważnych informacji w tym poście w odpowiedzi na to pytanie. W ten sposób przyszli użytkownicy nie będą musieli ścigać łączy do potencjalnie martwych stron.
nixeagle
@nixeagle Wprowadziłem kilka zmian, mam nadzieję, że najważniejsze informacje są obecne.
Nsukami _
Głosowałem za pańską, gdy jest już gotowa, ale poczekam kilka dni, zanim ją zaakceptuję, na wypadek, gdyby inni otrzymali inne lub lepsze odpowiedzi. Dzięki!
nixeagle
@nixeagle to nic!
Nsukami _
1
@nixeagle, czy znalazłeś lepszą odpowiedź?
Użytkownik Emacsa
42

Ostatnio zacząłem używać C-x <left>i C-x <right>. Oba są standardowymi powiązaniami Emacsa - nic do skonfigurowania. Lewy przenosi cię z powrotem do poprzedniego bufora (początkowo taki sam jak C-x b RET), ale powtórzenie tego powoduje powrót do trzeciego ostatnio odwiedzanego bufora. Jeśli często przeglądasz od 3 do 4 buforów, uważam, że jest to o wiele łatwiejsze niż zapamiętywanie nazw buforów.

Właśnie odkryłem C-x C-<left>i jestem C-x C-<right>związany tymi samymi funkcjami, więc możesz po prostu przytrzymać klawisz Ctrl i przełączać się między x i strzałkami, aby przewijać bufory. Nieźle!

David Caldwell
źródło
4
Zgadzam się z Tobą! Jestem nowicjuszem w emacs i nie chcę być przeciążony dodatkowymi pakietami i jeszcze więcej konfiguracji. To rozwiązanie działa dla mnie! : D
ankush981
Cx C- <left> i Cx C- <right> dla wygranej! Kiedyś bufor poprzedni / następny związany był z CS- <left> / <right>. Ale jakoś uważam, że pisanie Cx C-left jest jeszcze łatwiejsze niż używanie dwóch klawiszy meta. CS jest trudny do naciśnięcia.
Didier A.,
Miły! Nauczyłem się tych powiązań tydzień temu, pomyślałem, jak niesamowite są, a potem zapomniałem, jakie są. Przez tydzień nie mogłem ich znaleźć w sieci. Dzięki!
Kirill Yunussov
40

Możesz użyć Hełmu .

W moim ustawieniu przełączyłem się C-x bna M-l. To w połączeniu z tym helm-buffers-listsprawia, że ​​proces jest dość szybki, przynajmniej dla mnie.

Renan Ranelli
źródło
To jest w zasadzie najlepsza odpowiedź teraz. Jasne, nadal możesz używać idolub iswitchblub iciclescoś w tym rodzaju, ale są one w zasadzie przestarzałe przez Helma. Tak, ace-jump-bufferjest fajny, ale nie jest tak szybki jak Helm, ponieważ zanim będziesz wiedział, który klawisz nacisnąć, musisz znaleźć bufor na liście. Hełm pozwala zawęzić listę kilkoma naciśnięciami klawiszy, które już znasz (np. Nazwa bufora). Używam C-TABdo przełączania buforów, ładowania ostatnich plików, zakładek itp. Nic nie jest szybsze.
blujay
4
+1 dla helm. Ale wolę korzystania helm-mini, które pokazuje również Recentfdo helm-buffers-list.
joon
1
Jest też bluszcz z ivy-switch-buffer.
Oleksii Filonenko
Bluszcz znajduję o wiele szybciej niż ster, więc polecam go ponad ster.
Didier A.,
10

Aby dodać poprawki, których używam ze wspomnianym już Ido :

(require 'ido)
(require 'ido-hacks)
(require 'flx-ido)
(require 'ido-vertical-mode)

(ido-mode 1)
(flx-ido-mode 1)
(ido-hacks-mode 1)
(ido-everywhere 1)
(ido-vertical-mode 1)

(setq ido-enable-flex-matching t
      ido-use-filename-at-point 'guess
      ido-vertical-define-keys 'C-n-C-p-up-down-left-right))

Używam również ace-windowdo przełączania między buforami oraz ace-jump-modedo przeskakiwania między widocznymi oknami. Pochodzi z przyzwyczajenia, ale warto spróbować.

Połączyłem go key-chord-modei uderzyłem sodo szybkiego skoku:

(key-chord-define-global "so" 'ace-window)

Wszystkie wyżej wymienione pakiety są dostępne za pośrednictwem menedżera pakietów od Melpa.

Bartosz Kaliszuk
źródło
Zredagowałem twoją odpowiedź, aby zastąpić use-packageją, requireaby zapobiec pomyłkom. W podanym przykładzie użytkownik nie musi instalować dodatkowego pakietu w celu wdrożenia tego rozwiązania.
Kaushal Modi
1
Sugeruję, aby nie używać kombinacji liter, które występują często w języku angielskim (zakładając, że piszesz głównie po angielsku w emacs) jako klawiszy-akordów. Moim zdaniem „tak” jest bardzo łatwe do niezamierzonego uruchomienia, gdy piszesz takie rzeczy jak „tak”, „niektóre”, „osobiste” itp. Bardzo szybko.
Kaushal Modi
10

Jak mówi @kuanyui w komentarzu, next-bufferi previous-buffersą bardzo szybkie, jeśli masz tylko kilka buforów między cyklami. (Używam więcej niż kilku i więcej funkcji wyboru bufora icicle-buffer).

Jednak domyślnie, next-bufferi previous-buffersą na klucz prefiksu,C-x .

Oznacza to, że nie są powtarzalne : nie można po prostu trafić C-x <right> <right> <right>.... Zamiast tego musisz albo powiązać te polecenia z różnymi, powtarzalnymi klawiszami, albo musisz użyć C-x <right> C-x <right> C-x <right>..., co nie jest bardzo szybkie.

W przypadku powtarzalnych wersji tych poleceń załaduj bibliotekę misc-cmds.eli przypisz waniliowe, niepowtarzalne wersje do zdefiniowanych tam powtarzalnych:

(global-set-key [remap previous-buffer] 'previous-buffer-repeat)
(global-set-key [remap next-buffer]     'next-buffer-repeat)

(Podobnie, w tej samej bibliotece znajdziesz wersję, undoktóra jest powtarzalna, nawet jeśli używasz klucza prefiksu:. undo-repeat)


BTW, możesz uczynić praktycznie każdą komendę powtarzalną (nawet na klawiszu prefiksu), używając funkcji repeat-command(z misc-cmds.el). To wszystko, co było potrzebne do zdefiniowania powtarzalnej wersji next-buffer:

(defun previous-buffer-repeat ()
  "Switch to the previous buffer in the selected window.
You can repeat this by hitting the last key again..."
  (interactive)
  (require 'repeat nil t) ; Library `repeat.el' is in Emacs 22.1 and later
  (repeat-command 'next-buffer))
Rysował
źródło
3
... lub po prostu powiąż następny / poprzedni bufor z C-,i, C-.aby uzyskać powtarzalność, a mimo to i tak ustaw, ustaw C-x.i C-x,do other-windoworaz (lambda()(interactive)(other-window -1)). Okna rowerowe prawdopodobnie wymagają mniej powtarzalności, a uciekniesz za minutę, bez dodatkowych pakietów.
Andreas Spindler
2
@AndreasSpindler: Możesz oczywiście umieścić dowolne polecenie na powtarzalnym klawiszu, aby w ten sposób było powtarzalne. Nie o to chodzi. Powtarzalnych kluczy jest niewiele, a niezwiązane stają się coraz rzadsze. Chodzi o to, jak sprawić, by polecenie było powtarzalne, gdy znajduje się na klawiszu prefiksu .
Drew
1
Nie zrozumiałem twojego postu, ale odniosłem się mniej więcej do tematu tego wątku „Jak szybko przełączać bufory?”. W tym celu znalazłem wskazówkę do użycia next-bufferi previous-buffernajlepsze rozwiązanie, niezależnie od konkretnego przypisania klucza. Dlatego mój komentarz.
Andreas Spindler,
@AndreasSpindler: Rozumiem; dzięki.
Drew
To świetnie, wiele razy potrzebuję powtarzalnych poleceń, nawet jeśli mają klucze prefiksowe. To powiedziawszy, znalazłem domyślnie bufor poprzedni / następny Cx C-lewy i Cx C-prawy, co pozwala ci na stare C, i po prostu powtarzam wciskając x-lewy i x-prawy. Co nie jest takie złe jak domyślnie.
Didier A.,
9

Dziwię się, że nikt iswitchbjeszcze o tym nie wspomniał . Może nie jest tak potężny ido, ale na długo przed ido-modenarodzinami iswitchb-modebył już standardem dla emacsa i jest nadal użyteczny w dzisiejszych czasach. Aby spróbować, po prostu włóż

(iswitchb-mode 1)

do .emacs lub aktywuj przez M-x iswitchb-mode.

jimmij
źródło
4
iswitchbjest przestarzały od Emacsa 24.4. Cała jego funkcjonalność jest już dostępna ido.
Tyler
4
@Tyler Bardziej podoba mi się domyślny wygląd iswitchb, ponieważ jest bardziej kolorowy, ładniejszy. Być może ido można skonfigurować tak, aby wyglądało tak samo, ale nie ma sensu (przynajmniej dla mnie), gdy iswitchb jest dostępny.
Tom
7

Użyj helm-buffer-list lub helm-mini, aby wizualnie wybrać pozycję bufora i dopasowanie rozmyte. Może robić wiele rzeczy poza przełączaniem buforów. Powinieneś zobaczyć demo w linku.

Do zrobienia
źródło
6

Inni dyskutowali o pakietach, które są przydatne, aby ułatwić życie w odniesieniu do przełączania bufora / okna / ramki. (Osobiście używam tego, helmco jest fenomenalne.) Chcę omówić prostsze zmiany, które mogą sprawić, że Emacs będzie przyjemniejszy.

Dla mnie rozwiązaniem moich problemów z buforami / ramkami (bo myślę, że C-x ojest najgorszy) nie było pakietem; to było po prostu:

  • mapowanie C-;na other-window(cykliczne przechodzenie przez okna)
  • mapowanie C-'na other-frame(przechodzenie między ramkami). Po dodaniu tego skrótu zacząłem używać ramek dużo więcej).
  • mapowanie innych łatwych przypisań do pojedynczego naciśnięcia klawisza na proste, niestandardowe funkcje do manipulowania buforami w widocznej ramce. Przykłady obejmują: rzucanie bufora do drugiego okna (w konfiguracji 2-okienkowej), przełączanie między bieżącym i ostatnim buforem w danym oknie, zakopywanie drugiego bufora (ten jest świetny do zastąpienia helpokna, które się wyskakuje (podczas czytania stron podręcznika, apropos itp.) z dowolnym oknem, które wcześniej było widoczne).

Pomyślałem też, że podzielę się kilkoma przemyśleniami na temat powiązań klawiszy, które dla początkujących mogą być pomocne. (Przepraszam, jeśli to niewłaściwe miejsce.) Nie mam konkretnych sugestii, ale raczej „filozofię”, która pozwala mi zachować dla siebie skuteczny zestaw skrótów klawiszowych.

  1. Często używane polecenia nie zasługują na łatwe przypisywanie klawiszy.

    • Pobierz keyfreq.eli przekonaj się, czego tak często używasz. Korzystam z najlepszej metody przetrwania, aby zdecydować, które komendy są nagradzane za najcenniejszą nieruchomość na mojej klawiaturze.
    • Nie bój się pozbyć domyślnych skrótów klawiszowych Emacsa, z których niektóre są po prostu absurdalne. C-\Jest to świetny skrót (z powodów omówionych w # 2) ... i to byłoby zbrodnią zostawić to odwzorowane do domyślnej komendy: change-input-method. (Może niektórzy z was często go używają, na pewno nie.)
  2. Następujące czynniki określają łatwość i szybkość skrótu klawiaturowego (zaczynając od najważniejszego):

    • Ciągle naciskając klawisz modyfikujący (cokolwiek to może być, Ctrl, Meta, itd.). Na przykład uderzenie C-c C-l C-pjest dla mnie znacznie szybsze niż trafienie C-x o. Osobiście uważam, że bardzo niewygodne jest zdejmowanie Ctrlklucza pomiędzy kolejnymi naciśnięciami klawiszy w danej sekwencji klawiszy; o wiele łatwiej jest po prostu dalej mashować przycisk modyfikatora (w tym przypadku, Ctrl). (Na ten konkretny przykład może mieć wpływ fakt, że ponownie przypisałem Ctrlklucz i Caps-Lockklucz).
    • Alternacja u twojego przyjaciela . Uderzenie C-c C-l C-pjest dla mnie znacznie szybsze niż trafienie C-p C-' C-;. (Spróbuj i powinno być oczywiste.) Ogólnie rzecz biorąc, o wiele łatwiej jest używać sekwencji klawiszy, które używają naprzemiennych rąk (lub przynajmniej naprzemiennych palców tej samej ręki).
    • Stopień odejścia od standardowej pozycji ręki. Nie dotyczy to entuzjastów polowań i dziobania. Ale dla reszty z nas, nasze najczęściej używane skróty klawiaturowe powinny pozwolić nam szybko i łatwo wrócić do standardowej pozycji pisania na klawiaturze.

Kilka myśli, które moim zdaniem mogą być pomocne dla początkujących. Mogę dodać trochę później.

lodziarz
źródło
3

Używam windmove.eli bs.eldo szybkiego przełączania buforów. Oba tryby są dołączone do Emacsa.

  • windmove.el- przełącza do okna (aktualnie wyświetlany bufor) w określonym kierunku, np. w lewo, w prawo, w górę, w dół.

  • bs.el- Używam bs-cycle-nexti, bs-cycle-previousaby przejść do następnego bufora, który nie jest aktualnie wyświetlany w oknie.

Można skonfigurować windmove z (windmove-default-keybindings)którym zwiąże odpowiednie rozkazy Shift-Left Arrow, Shift-Right Arrowitp

Do konfiguracji bs.elzadziała coś takiego:

 (global-set-key [(f9)]   'bs-cycle-previous)
 (global-set-key [(f10)]  'bs-cycle-next)
Joe
źródło
Bufor NIE jest oknem (ramka)! Nie myl ich!
kuanyui
2
A okno nie jest ramą. Niezależnie od tego, windmove.elznajduje się na stronie EmacsWiki „Przełączanie buforów”, plus bs.eldziała na buforach, a nie na Windowsie .
Joe
Wyjaśniłem, co robi Windmove.
Joe
3

Najszybszym sposobem przełączania buforów, o którym wiem, jest ace-jump-buffer. Jedno naciśnięcie klawisza otwiera menu bufora, a następnie wybierz literę obok odpowiedniego bufora ace-jump-line-mode. Działa to najlepiej w przypadku około 26 najnowszych buforów. Aby przełączyć się na bufory z powrotem w historii użytkowania, ido-switch-bufferzawsze jest dobrym wyborem.

waymondo
źródło
3

Wolę nawigację po kartach w stylu przeglądarki. Ctrl + Tab i Ctrl + Shift + Tab powiązałem odpowiednio z następnymi i poprzednimi buforami:

(global-set-key [C-tab] 'next-buffer)
(global-set-key [C-S-tab] 'previous-buffer)
Abbas
źródło
2

Mówiąc ogólnie, istnieją 2 sposoby przełączania buforów i większość rozwiązań mieści się w jednym z nich.

  1. Korzystanie z mini bufora

To właśnie C-x brobi domyślnie. Ido zapewnia ładne automatyczne uzupełnianie, dzięki czemu nie musisz tak dużo TAB TAB TAB. Projekty takie jak ster, pocisk itp. Ułatwiają pracę, umożliwiając pracę z plikami w projekcie itp., A wraz z ido mogą być bardzo przydatne.

  1. Cały bufor z wymienionymi wszystkimi elementami.

Jest to przydatne, gdy masz tyle buforów i potrzebujesz ich wszystkich. Możesz przejść w górę i w dół bufora i nacisnąć enter, aby przejść do określonego pliku. Ibuffer jest do tego całkiem dobry.

Używam obu i tak możesz to skonfigurować.

 (global-set-key (kbd "C-x C-b") 'ido-switch-buffer)
 (global-set-key (kbd "C-x b") 'ibuffer)`
Jaseem
źródło
Dla drugiego Hełma jest również dobrą opcją
Tom
2

Oprócz ido mam następującą konfigurację.

  1. W przypadku trybu zła użyj następujących przypisań klawiszy, aby przełączyć bufory

    (define-key evil-normal-state-map (kbd "C-j") 'next-buffer)
    (define-key evil-normal-state-map (kbd "C-k") 'previous-buffer)
    (define-key evil-normal-state-map (kbd "C-S-h") 'evil-window-left)
    (define-key evil-normal-state-map (kbd "C-S-j") 'evil-window-down)
    (define-key evil-normal-state-map (kbd "C-S-k") 'evil-window-up)
    (define-key evil-normal-state-map (kbd "C-S-l") 'evil-window-right)
    
  2. Ustaw nazwę bufora jako tytuł okna. Pomoże to w nawigacji z powyższymi skrótami klawiszowymi

    (setq frame-title-format "%b")
    
  3. Jeśli używasz trybu zła, możesz spróbować evil-leader. Powiąż często używane klucze z liderem. Na przykład można związać C-x bsię <leader>-b.

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. Powiązanie trybu diodowego z C-<f8>. Teraz, gdy chcesz otworzyć plik w katalogu, naciśnij C-<f8>, przejdź do nazwy pliku i naciśnij azamiast RET. Tak więc bufor buforowy zostanie natychmiast zabity.

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. Użyj recentftrybu do nawigacji po najnowszych plikach.C-x C-r

  6. Ostatnim ważnym punktem jest - użycie ergonomicznej klawiatury mechanicznej. Możesz więc łatwo i szybko nacisnąć klawisz „Ctrl” za pomocą nadgarstka zamiast zranić pinky.

Mam nadzieję, że to może komuś pomóc.

userx
źródło
1

Jak widać z innych odpowiedzi, istnieje wiele sposobów usprawnienia tego konkretnego zadania. Osobiście używam Lusty Emacsa jako mojego aparatu do przełączania buforów, ponieważ całkiem dobrze radzi sobie z rozmytym zakończeniem. To minimalizuje liczbę naciśnięć klawiszy potrzebnych do wybrania nowego bufora, na przykład muszę tylko wpisać oxr, aby przełączyć się na ox-wyjawienie. El , a nawet tylko o drugiej rundzie, ponieważ śledzi również historię przełączników.

stsquad
źródło
0

Jeśli chcesz po prostu przeczesywać bufory, dodaj to do pliku init:

(bind-key* "M-l" 'next-buffer)
(bind-key* "M-k" 'previous-buffer)

Trzeba się bind-key pakiet można zmienić skróty klawiszowe do życzenia, ale znalazłem te Skróty klawiszowe się najbardziej komfortowo. Przed dodaniem tego fragmentu musisz wymagać klucza powiązania,

(require 'bind-key)
Shreyas Jamadagni
źródło
0

Używam C-Tab i CS-Tab jak aplikacji ogólnych.

(defun change-buffer-until-normal (change-fn)
  (let (current (buffer-name))
    (funcall change-fn)
    (while (and (string-prefix-p "*" (buffer-name))
        (not (eq current (buffer-name))))
      (funcall change-fn))))

(defun my-next-buffer ()
  (interactive)
  (change-buffer-until-normal 'next-buffer))

(defun my-prev-buffer ()
  (interactive)
  (change-buffer-until-normal 'previous-buffer))

(global-set-key [C-tab] 'my-next-buffer)
(global-set-key [C-S-iso-lefttab] 'my-prev-buffer)
hasgel
źródło
-1

Na mojej maszynie wirtualnej Cx ALT-RIGHT / LEFT jest zbyt wolny. Muszę poczekać, aż Cx zarejestruje się na pasku stanu, zanim będę mógł zrobić cokolwiek innego. plus jego zbyt wiele kluczy. Więc zamapowałem C-TAB i CM-TAB na następny i poprzedni bufor, ponieważ i tak robię w większości programów Windows. Łatwo to zrobić z poziomu emacsa: M-xprzeniesie Cię do paska stanu. Następnie wpisz, global-set-keyktóry wyświetli monit o sekwencję klawiszy, którą chcesz powiązać ( C-TAB), a następnie polecenie, z którym chcesz ją powiązać ( next-buffer). Otóż ​​to!

SN
źródło
1
Witamy. Inne odpowiedzi wydają się już obejmować mapowanie tych poleceń na inne klawisze.
Andrew Swann,
Niezupełnie - wszyscy mówią o tym, jak zmienić plik konfiguracyjny .emacs. Opisałem, jak to zrobić z poziomu sesji emacsa
SN