2010-03-21 4 views
2

Je voudrais recentrer un tampon, appelé *Lense*, où j'ai inséré du texte. Je voulais en faire le tampon courant par (set-buffer "*Lense*"), puis (recenter 0)). Dans les segments de code suivants:Recentrer un tampon nommé qui n'est pas nécessairement le tampon courant dans Emacs Lisp

(save-excursion (set-buffer "*Lense*") 
       (recenter 0)) 

Cependant, il semble que le code ci-dessus ne ferait que le tampon qui recentrera est le tampon courant, et (set-buffer "*Lense*") n'a pas d'effet de rendre le tampon courant soit *Lense*.

S'il vous plaît aidez-moi à comprendre la bonne façon de recentrer le tampon nommé *Lense*.

+0

J'ai trouvé une réponse maintenant. Le code suivant ferait le travail: (sauvegarde-excursion (pop-à-tampon "* Lense *") (goto-char (point-max)) (recentrer 0)) La clé est d'utiliser " pop-to-buffer ". Le comportement de "set-buffer" est confus, pas fiable. –

+1

La confusion est causée par les différents contextes. 'set-buffer' sélectionne * buffer * pour les opérations d'édition et' recenter' fonctionne sur * window * not buffer. –

Répondre

7

Si le tampon que vous voulez recentrer est visible, vous voulez recentrer sa fenêtre.

(with-selected-window (get-buffer-window "*Lense*") 
    (recenter 0)) 

Cela va exploser si le tampon n'est pas affiché, vous voudrez peut-être à l'état-cas ou détendez-vous-protéger.

Si vous souhaitez gérer le cas où le tampon n'est pas visible, vous devez déplacer le point. La fenêtre qui affichera éventuellement le tampon sera centrée près du point, de sorte que vous devrez déplacer le point quelque part pour que cela se produise. On dirait que votre opération d'insertion sera DTRT, donc vous n'avez pas besoin de s'inquiéter dans ce cas.

+0

Ceci est une bonne solution. Cela répond à mes besoins. Le tampon "* Lense *" est visible. Merci beaucoup! Yu –

+3

Vous n'avez pas besoin d'utiliser 'condition-case' ou' unwind-protect'. En supposant que vous voulez seulement recentrer un tampon qui est en fait affiché, il suffit de rendre le code conditionnel à cela: '(quand (get-buffer-window" * Lense * "'visible) ...'. – Drew

0

Je n'ai pas trouvé (recenter) fonction, mais il y a (recenter-haut-bas). Vous pouvez essayer de l'utiliser au lieu de (recenter). La touche de raccourci standard C-l appelle exactement cette fonction (recenter-top-bottom), également avec argument facultatif, ligne de fenêtre, qui peut être passé par C-u arg C-l. PS: Je peux me tromper parce que je ne suis pas familier avec emacs-lisp, j'utilise simplement emacs avec des personnalisations minimales.

+0

Je crois que les fonctions * recenter * ont récemment subi quelques changements de nom, donc il y a une dépendance de version ici ... – dmckee

+0

'recenter est une fonction intégrée interactive dans' window.c '. ' – jrockway

+0

J'étais responsable de l'ajout de' recenter-top-bottom' et le lier à 'Cl'. La commande 'recenter' existe toujours, comme l'indique jrockway; il n'est plus lié par défaut à 'C-l'. – Drew

Questions connexes