Comment changer de tampon rapidement?

68

Dans la vanille Emacs, je dois le faire C-x b, puis taper manuellement le nom du tampon à permuter. Si j'oublie le nom du tampon, je dois taper TABpour lister les achèvements possibles. Est-ce que je peux faire quelque chose pour accélérer ce processus?

nixeagle
la source
10
Cela devrait être marqué Wiki de la communauté. Mais Emacs a déjà un wiki géant. Par exemple, mon résultat principal sur Google est cette page sur la commutation de tampons . Les questions de style CW me semblent particulièrement déplacées sur emacs.SE.
purple_arrows
1
J'aime utiliser C-x C-<left/right>pour changer rapidement de tampon. Lorsque j'ai besoin de passer à un tampon "plus éloigné", je l'utilise IBuffer.
Kuanyui
J'utilise 'Cx x' pour changer de tampon (avec barre et casquettes mappées à contrôler). Je ne me suis jamais senti à l'aise de taper 'Cx b'.
mercredi
1
Utilisez l’une des solutions dans les réponses et n’utilisez pas Cx b. 3 touches sont trop pour une opération aussi fréquente. Personnellement, j'utilise une clé unique, la clé Windows droite que je n'utilise pas autrement.
Tom

Réponses:

50

Il y a un mode ido qui devrait aider.

MODIFIER:

mettez ceci dans votre fichier init, pour activer le mode ido par défaut:

(ido-mode 1)

Maintenant, C-x bva vous montrer une liste de candidats.

Mettez ceci dans votre fichier init, si vous préférez que les éléments soient affichés verticalement:

(setq ido-separator "\n")

Gracieuseté d' ergoemacs

Permettez-moi également de suggérer que cet article parle du passage au tampon précédent / suivant.

Nsukami _
la source
2
Nous devrions probablement essayer d'obtenir la plupart des informations importantes contenues dans ce message en réponse à cette question. De cette façon, les futurs utilisateurs n'auront pas à chasser les liens vers des sites éventuellement morts.
nixeagle
@nixeagle J'ai fait quelques modifications, j'espère que les informations les plus importantes sont présentes.
Nsukami _
J'ai voté pour le vôtre, car il est complet à présent, mais je vais attendre quelques jours avant de l'accepter au cas où d'autres apporteraient des réponses différentes ou meilleures. Merci!
nixeagle
@nixeagle ce n'est rien!
Nsukami _
1
@nixeagle avez-vous trouvé une meilleure réponse?
Utilisateur Emacs
44

J'ai récemment commencé à utiliser C-x <left>et C-x <right>. Ce sont deux liaisons Emacs standard - rien à configurer. Left vous ramène au tampon précédent (initialement le même que C-x b RET), mais vous le refait, vous amène au 3ème tampon le plus récemment visité. Si vous faites beaucoup de va-et-vient entre 3 ou 4 mémoires tampons, je trouve cela beaucoup plus facile que d'essayer de mémoriser les noms de mémoire tampon.

De plus, je viens de découvrir C-x C-<left>et d’ C-x C-<right>être lié aux mêmes fonctions afin que vous puissiez simplement maintenir la touche Ctrl enfoncée et alterner entre x et les flèches pour parcourir les tampons. Pas mal!

David Caldwell
la source
4
Je suis d'accord avec toi! Je suis un nouvel arrivant sur emacs et je ne veux pas être surchargé de paquets supplémentaires ni de configurations supplémentaires. Cette solution fonctionne pour moi! : D
ankush981
Cx C- <à gauche> et Cx C- <à droite> pour la victoire! J'avais l'habitude d'avoir le tampon précédent / suivant lié à CS- <gauche> / <droite>. Mais je trouve que taper Cx C-left est encore plus facile que d’utiliser deux clés méta. CS est difficile à appuyer.
Didier A.
Agréable! J'ai appris ces liaisons il y a une semaine, je me suis dit qu'elles étaient géniales et j'ai ensuite oublié ce qu'elles étaient. Impossible de les trouver sur le net pendant une semaine, jusqu'à maintenant. Merci!
Kirill Yunussov
41

Vous pouvez utiliser Helm .

Dans ma configuration, je suis passé C-x bpour M-l. Cet allié helm-buffers-listrend le processus assez rapide, du moins pour moi.

Renan Ranelli
la source
Ceci est fondamentalement la meilleure réponse maintenant. Bien sûr, vous pouvez toujours utiliser idoou iswitchbou des icicleschoses comme ça, mais ils sont fondamentalement obsolètes par Helm. Oui, ace-jump-bufferc'est cool, mais ce n'est pas aussi rapide que Helm, car avant de savoir sur quelle touche appuyer, vous devez trouver le tampon dans la liste. Helm vous permet de réduire la liste avec quelques frappes que vous connaissez déjà (comme le nom du tampon). J'utilise C-TABpour changer de tampon, charger des fichiers récents, des signets, etc. Rien n'est plus rapide.
Blujay
4
+1 pour helm. Mais je préfère utiliser helm-mini, qui vous montre aussi Recentfà helm-buffers-list.
Joon
1
Il y a aussi du lierre avec ivy-switch-buffer.
Oleksii Filonenko
Je trouve le lierre beaucoup plus vite que la barre, je le recommande donc à la barre.
Didier A.
10

Juste pour ajouter des réglages que j'utilise avec Ido déjà mentionné :

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

J'utilise également ace-windowpour basculer entre les tampons et ace-jump-modepour passer d' une fenêtre visible à une autre. Livré avec certains s'y habituer mais vaut la peine d'essayer.

Je l'ai combiné avec key-chord-modeet frappé sopour un saut rapide:

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

Tous les packages mentionnés ci-dessus sont disponibles via le gestionnaire de packages de Melpa.

Bartosz Kaliszuk
la source
J'ai modifié votre réponse pour la remplacer use-packagepar requirepour éviter toute confusion. Dans l'exemple donné, l'utilisateur n'a pas besoin d'installer un package supplémentaire pour implémenter cette solution.
Kaushal Modi
1
Je suggérerais de ne pas utiliser les combinaisons de lettres fréquentes en anglais (en supposant que vous tapez principalement en anglais dans emacs) comme accords clés. À mon avis, "so" est très facile à déclencher involontairement lorsque vous tapez des choses comme "so", "un peu", "personnel", etc. très rapidement.
Kaushal Modi
10

Comme @kuanyui le dit dans un commentaire, next-buffer& previous-buffersont très rapides, si vous ne disposez que de quelques mémoires tampons. (Pour plus que quelques-uns, et pour plus de fonctionnalités de choix de tampon, j'utilise icicle-buffer.)

Toutefois, par défaut, next-bufferet previous-buffersont sur une touche préfixe,C-x .

Cela signifie qu'ils ne sont pas répétables : vous ne pouvez pas simplement frapper C-x <right> <right> <right>.... Vous devez plutôt lier ces commandes à différentes clés pouvant être répétées, ou vous devez utiliser C-x <right> C-x <right> C-x <right>..., ce qui n’est pas très rapide.

Pour les versions répétables de ces commandes, chargez la bibliothèque misc-cmds.elet remappez les versions non répétables de la vanille sur celles répétables définies ici:

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

(De même, dans la même bibliothèque, vous trouverez une version undorépétable même sur une clé de préfixe:. undo-repeat)


En passant, vous pouvez faire à peu près toutes les commandes répétables (même sur une touche de préfixe), en utilisant function repeat-command(from misc-cmds.el). C'est tout ce qui était nécessaire pour définir la version répétable de 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))
A dessiné
la source
3
... ou simplement lier les tampons suivant / précédent à C-,et C-.pour gagner de la répétabilité, et quand vous y êtes, définissez C-x.et C-x,sur other-windowet (lambda()(interactive)(other-window -1)). Le cycle des fenêtres a probablement besoin de moins de répétabilité et vous vous évadez en une minute, sans forfait supplémentaire.
Andreas Spindler
2
@AndreasSpindler: Vous pouvez bien sûr placer n'importe quelle commande sur une touche répétable et la rendre ainsi répétable. Ce n'est pas le propos. Les clés reproductibles sont peu nombreuses et les clés non liées deviennent de plus en plus rares. C'est sur la façon de rendre une commande répétable lorsqu'elle est sur une clé de préfixe .
Drew
1
Je ne comprenais pas votre message, mais évoquais plus ou moins le sujet de ce fil de discussion "Comment changer rapidement de mémoire tampon?". À cette fin, j'ai trouvé votre astuce à utiliser next-bufferet previous-bufferla meilleure solution, indépendamment de toute liaison de clé spécifique. Par conséquent mon commentaire.
Andreas Spindler
@AndreasSpindler: compris Merci.
Drew
C’est génial, j’ai souvent besoin de commandes répétables même quand elles ont des clés de préfixe. Cela dit, j'ai trouvé les valeurs par défaut du tampon précédent / suivant Cx C-left et Cx C-right, ce qui vous permet d’utiliser l’ancien C, puis de répéter en appuyant sur x-left et x-right. Ce qui n'est pas trop mauvais par défaut.
Didier A.
9

Je suis surpris personne n'a iswitchbencore mentionné . Il n’est peut-être pas aussi puissant que ido, mais bien avant ido-modesa naissance iswitchb-modeétait déjà standard pour emacs, et il est toujours utile de nos jours. Pour l'essayer il suffit de mettre

(iswitchb-mode 1)

dans votre .emacs ou activer via M-x iswitchb-mode.

Jimmij
la source
4
iswitchbest obsolète depuis Emacs 24.4. Toutes ses fonctionnalités sont disponibles via idomaintenant.
Tyler
4
@ Tyler J'aime mieux le look par défaut d'iswitchb, car il est plus coloré, plus joli. Peut-être que ido peut être configuré pour avoir le même aspect, mais cela ne sert à rien (du moins pour moi) tant que iswitchb est disponible.
Tom
8

Utilisez helm-buffer-list ou helm-mini pour sélectionner visuellement l'entrée de mémoire tampon et la correspondance floue. Il peut faire beaucoup de choses en dehors du changement de tampon. Vous devriez voir la démo dans le lien.

Tu Do
la source
6

D'autres ont évoqué des packages utiles pour simplifier la vie en ce qui concerne la commutation tampon / fenêtre / trame. (J'utilise personnellement helmce qui est phénoménal.) Je souhaite discuter de modifications plus simples susceptibles de rendre l'expérience Emacs plus agréable.

Pour moi, la solution à mes problèmes de tampon / trame (parce que je pense C-x oest le pire) n’était pas un paquet; c'était simplement:

  • mappage C-;sur other-window(en passant par les fenêtres)
  • mappage C-'sur other-frame(passage d'une image à l'autre). En fait, j’ai commencé à utiliser beaucoup plus de cadres après avoir ajouté ce raccourci).
  • mappage d'autres raccourcis clavier simples à des fonctions simples et personnalisées permettant de manipuler les tampons dans le cadre visible. Exemples: lancer un tampon dans l’autre fenêtre (dans une configuration à deux fenêtres), basculer entre le tampon actuel et le dernier tampon dans une fenêtre donnée, enterrer l’autre tampon (celui-ci est idéal pour remplacer la helpfenêtre qui s’ouvre (lors de la lecture de pages de manuel, à propos, etc.) quelle que soit la fenêtre précédemment visible).

J'ai également pensé partager quelques réflexions sur les raccourcis clavier que les débutants pourraient trouver utiles. (Désolé si c'est le mauvais endroit.) Je n'ai pas de suggestions spécifiques, mais plutôt une "philosophie" qui me permet de conserver un ensemble efficace de combinaisons de touches pour moi-même.

  1. Les commandes fréquemment utilisées ne méritent pas des raccourcis clavier faciles.

    • Téléchargez keyfreq.elet voyez ce que vous utilisez vraiment beaucoup. J'utilise une méthode de survie du plus apte pour décider quelles commandes attribuent le meilleur rapport qualité-prix sur mon clavier.
    • N'ayez pas peur de vous débarrasser des raccourcis clavier par défaut d'Emacs, dont certains sont simplement absurdes. C-\est un excellent raccourci (pour les raisons évoquées au point 2) ... et le laisser correspondre à sa commande par défaut serait un crime change-input-method. (Peut-être que certains d'entre vous l'utilisent beaucoup, ce n'est certainement pas le cas.)
  2. Les facteurs suivants déterminent la facilité et la rapidité d'un raccourci clavier (en commençant par le plus important):

    • Une pression continue sur la touche de modification (quel qu'il soit, Ctrl, Meta, etc.). Par exemple, il est beaucoup plus rapide pour moi de frapper C-c C-l C-pque de frapper C-x o. Je trouve personnellement très gênant de devoir retirer la Ctrlclé entre les touches successives d’une séquence de touches donnée; il est tellement plus facile de continuer à écraser le bouton de modification (dans ce cas, Ctrl). (Cet exemple spécifique peut être influencé par le fait que j'ai remappé ma Ctrlclé et ma Caps-Lockclé.)
    • Alternance chez votre ami . Il est beaucoup plus rapide pour moi de frapper C-c C-l C-pque de frapper C-p C-' C-;. (Essayez-le et cela devrait être évident.) En règle générale, il est beaucoup plus facile d'utiliser des séquences de frappe qui utilisent des mains alternées (ou, au moins, des doigts alternés sur la même main).
    • Degré de départ par rapport à la position des mains standard. Cela ne s'applique pas aux amateurs de chasse et picorage. Mais pour le reste d’entre nous, les raccourcis clavier les plus fréquemment utilisés devraient nous permettre de revenir rapidement et facilement à notre position de frappe habituelle.

Juste quelques réflexions qui, selon moi, pourraient être utiles aux débutants. J'en ajouterai peut-être plus tard.

iceman
la source
3

J'utilise windmove.elet bs.elpour changer de tampon rapidement. Les deux modes sont inclus avec Emacs.

  • windmove.el- bascule vers une fenêtre (un tampon actuellement affiché) dans une direction spécifiée, par exemple gauche, droite, haut, bas.

  • bs.el- J'utilise bs-cycle-nextet bs-cycle-previouspour passer au tampon suivant qui n'est pas affiché dans une fenêtre.

Vous pouvez windmove de configuration avec (windmove-default-keybindings)qui lieront les commandes appropriées à Shift-Left Arrow, Shift-Right Arrowetc.

Pour l'installation bs.el, quelque chose comme ceci fonctionnera:

 (global-set-key [(f9)]   'bs-cycle-previous)
 (global-set-key [(f10)]  'bs-cycle-next)
Joe
la source
Le tampon n'est PAS une fenêtre (cadre)! Ne les confondez pas!
Kuanyui
2
Et une fenêtre n'est pas un cadre. Quoi qu'il en soit, il se windmove.eltrouve dans la page EmacsWiki "Changer bs.elde tampon ", et fonctionne sur les tampons, pas sur les fenêtres.
Joe
J'ai clarifié ce que fait Windmove.
Joe
3

Le moyen le plus rapide de changer de tampon, à ma connaissance, est avec ace-jump-buffer. Un trait de touche ouvre le menu de la mémoire tampon, puis sélectionnez la lettre en regard de la mémoire tampon souhaitée ace-jump-line-mode. Cela fonctionne mieux pour les 26 mémoires tampons les plus récentes. Pour basculer vers des mémoires tampons plus loin dans votre historique d’utilisation, ido-switch-bufferc’est toujours un bon choix.

Waymondo
la source
3

Je préfère la navigation par onglets de style navigateur. J'ai lié Ctrl + Tab et Ctrl + Maj + Tab aux tampons suivant et précédent respectivement:

(global-set-key [C-tab] 'next-buffer)
(global-set-key [C-S-tab] 'previous-buffer)
Abbas
la source
2

D'une manière générale, il existe 2 façons de changer de tampon et la plupart des solutions tomberont dans l'une d'elles.

  1. Utiliser le mini buffer

C'est ce que C-x bfait par défaut. Ido vous donne une belle complétion automatique afin que vous n'ayez pas besoin de TAB TAB TAB. Des projets tels que helm, projectile, etc. vous facilitent la tâche en vous permettant de travailler avec des fichiers dans un projet, etc., et avec ido, ils peuvent être très utiles.

  1. Un tampon entier avec tous les éléments énumérés.

Ceci est utile lorsque vous avez autant de tampons et que vous voulez une liste de tous. Vous pouvez monter et descendre dans la mémoire tampon et appuyer sur enter pour visiter un fichier particulier. Ibuffer est très bon pour ça.

J'utilise les deux et voici comment vous pouvez le configurer.

 (global-set-key (kbd "C-x C-b") 'ido-switch-buffer)
 (global-set-key (kbd "C-x b") 'ibuffer)`
Jaseem
la source
Pour le second, Helm est aussi une bonne option
Tom
2

Ajout à ido, j'ai la configuration suivante.

  1. En cas de mode diabolique, utilisez les raccourcis clavier suivants pour changer de tampon.

    (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. Définissez le nom du tampon comme titre de la fenêtre. Cela vous aidera lors de la navigation avec les combinaisons de touches ci-dessus.

    (setq frame-title-format "%b")
    
  3. Si vous utilisez le mode maléfique, vous pouvez essayer evil-leader. Reliez les clés fréquemment utilisées au leader. par exemple, vous pouvez vous lier C-x bà <leader>-b.

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. Lier le mode dir à C-<f8>. Maintenant, lorsque vous voulez ouvrir un fichier dans un répertoire, appuyez sur C-<f8>, naviguez jusqu'au nom du fichier et appuyez sur aau lieu de RET. Le tampon ainsi dirigé sera tué immédiatement.

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. Utilisez le recentfmode pour parcourir les fichiers récents.C-x C-r

  6. Un dernier point important est - utilisez un clavier mécanique ergonomique. Ainsi, vous pouvez appuyer sur la touche "Ctrl" facilement et rapidement avec le poignet au lieu de vous faire mal.

J'espère que cela pourrait aider quelqu'un.

utilisateur
la source
1

Comme vous pouvez le constater dans les autres réponses, il existe de nombreuses façons de rationaliser cette tâche particulière. Personnellement, j'utilise Lusty Emacs en tant qu'appareil de commutation de mémoire tampon, car il gère assez bien la finition floue. Cela minimise le nombre de touches nécessaires à la sélection du nouveau tampon. Par exemple, il suffit de taper oxr pour basculer vers ox -veve.el , ou même juste la deuxième fois car il suit également l'historique des commutateurs.

stsquad
la source
0

Si vous voulez simplement continuer à parcourir vos tampons, ajoutez ceci à votre fichier init:

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

Vous avez besoin du paquet bind-key et vous pouvez modifier les raccourcis clavier selon vos souhaits, mais j'ai trouvé ces raccourcis clavier les plus confortables. Avant d’ajouter ce fragment de code, vous devez demander à bind-key de,

(require 'bind-key)
Shreyas Jamadagni
la source
0

J'utilise C-Tab et CS-Tab comme des applications générales.

(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
la source
0

Ce n’est pas une solution très élégante (car elle utilise des macros au lieu de fonctions) et elle ne dit pas comment passer rapidement à n’importe quel tampon, mais seulement comment accéder aux tampons récemment utilisés. Mais cela fonctionne très bien pour moi:

J'ai une série de macros à utiliser ido-switch-bufferpour accéder au tampon précédent, le tampon avant, le tampon avant, etc. Et j'ai lié ces macros à des liaisons de touches que je trouve commodes.

Pour sauter au dernier tampon:

(fset 'my-goto-previous-buffer
      [?\C-x ?b return])

Pour passer à l'avant dernier tampon:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n return])

Pour accéder au tampon antépénultième:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n ?\C-n return])

Etc. (vous pouvez en redire autant ?\C-nque vous le souhaitez, l'historique de la mémoire tampon visitée étant aussi lointain que vous le souhaitez).

Il existe une fonction intégrée pour accéder au tampon précédent, mais l’avantage de l’utilisation de macros ido-switch-bufferest que vous pouvez personnaliser la variable ido-ignore-bufferspour supprimer les tampons spéciaux tels que *Messages*ou *scratch*ou tout autre tampon indésirable de la liste. De cette façon, les seuls tampons auxquels vous accédez sont ceux que vous souhaitez vraiment utiliser.

prosoitos
la source
-1

Sur ma machine virtuelle, Cx ALT-RIGHT / LEFT est trop lent. Je dois attendre que Cx soit enregistré dans la barre d'état avant de pouvoir faire autre chose. en plus c'est juste trop de clés. Donc, j'ai mappé C-TAB et CM-TAB dans les tampons next et prev comme c'est ce que je fais dans la plupart des programmes Windows de toute façon. C'est facile à faire depuis emacs: M-xvous amène à la barre d'état. Puis tapez global-set-keyqui vous demandera la séquence de touches que vous souhaitez lier ( C-TAB), puis la commande à laquelle vous souhaitez lier ( next-buffer). C'est ça!

SN
la source
1
Bienvenue. D'autres réponses semblent déjà couvrir la correspondance de ces commandes avec d'autres clés.
Andrew Swann
Pas exactement - tout le monde parle de la façon de changer votre fichier de configuration .emacs. J'ai décrit comment le faire depuis emacs session
SN