Discussion:
text-scale-mode and switching major modes
Titus von der Malsburg
2012-01-06 17:00:36 UTC
Permalink
Hi list,

I use noweb-mode a lot. This mode allows to have several languages in
one file (e.g. latex and R) and switch major modes automatically
depending on where the cursor is -- very useful! However, every time
modes are switched the font size (which I set with text-scale-adjust)
changes back to the default. Is there a way to make the font size
persistent? Note that I'd like to use different font sizes in
different buffers, so setting the default font size a specific value
is not a solution.

Thanks!

Titus
Drew Adams
2012-01-06 17:10:10 UTC
Permalink
Post by Titus von der Malsburg
I use noweb-mode a lot. This mode allows to have several languages in
one file (e.g. latex and R) and switch major modes automatically
depending on where the cursor is -- very useful! However, every time
modes are switched the font size (which I set with text-scale-adjust)
changes back to the default. Is there a way to make the font size
persistent?
Note that I'd like to use different font sizes in
different buffers, so setting the default font size a specific value
is not a solution.
AFAIK, text scaling is on a per-buffer basis. You could perhaps implement a
workaround for your problem using `(after-)change-major-mode-hook'.

Another thing you could do, but which goes against your last sentence, is to
zoom the frame (yes, change its default font size) instead of scaling the text
of various buffers. See http://www.emacswiki.org/emacs/SetFonts#toc6 and
http://www.emacswiki.org/emacs/download/zoom-frm.el.
Titus von der Malsburg
2012-01-06 21:52:07 UTC
Permalink
Hi Drew, thanks for your suggestion. Below is my solution. I don't
know if this is the idiomatic way of doing these things but it seems
to work.

;; Restore text-scale after change of major mode.

(autoload 'text-scale-mode "face-remap")
(add-hook 'change-major-mode-hook (lambda ()
(put 'text-scale-mode-amount 'permanent-local t)))
(add-hook 'after-change-major-mode-hook 'text-scale-mode)

Cheers,
Titus
I use noweb-mode a lot.  This mode allows to have several languages in
one file (e.g. latex and R) and switch major modes automatically
depending on where the cursor is -- very useful!  However, every time
modes are switched the font size (which I set with text-scale-adjust)
changes back to the default.  Is there a way to make the font size
persistent?
Note that I'd like to use different font sizes in
different buffers, so setting the default font size a specific value
is not a solution.
AFAIK, text scaling is on a per-buffer basis.  You could perhaps implement a
workaround for your problem using `(after-)change-major-mode-hook'.
Another thing you could do, but which goes against your last sentence, is to
zoom the frame (yes, change its default font size) instead of scaling the text
of various buffers.  See http://www.emacswiki.org/emacs/SetFonts#toc6 and
http://www.emacswiki.org/emacs/download/zoom-frm.el.
--
Titus von der Malsburg
DFG Research Group 868: Mind and Brain Dynamics
Dept. of Linguistics, University of Potsdam
http://www.ling.uni-potsdam.de/~malsburg/
Stefan Monnier
2012-03-28 19:30:40 UTC
Permalink
Post by Titus von der Malsburg
(add-hook 'change-major-mode-hook (lambda ()
(put 'text-scale-mode-amount 'permanent-local t)))
This is fundamentally wrong: the `put' call has a global effect, so it
makes no sense to put it inside the `add-hook' since all it does is
delay the global effect to the first time a buffer sets up its
major mode.


Stefan
Titus v. d. Malsburg
2012-03-28 19:30:48 UTC
Permalink
Post by Stefan Monnier
  (add-hook 'change-major-mode-hook (lambda ()
    (put 'text-scale-mode-amount 'permanent-local t)))
This is fundamentally wrong: the `put' call has a global effect, so it
makes no sense to put it inside the `add-hook' since all it does is
delay the global effect to the first time a buffer sets up its
major mode.
Stefan, thanks for your response. I understand that making text-scale-
mode-amount permanent-local in the change-major-mode-hook is awkward
but I can't do it when a buffer is opened because the variable is
undefined then. It is only defined when I scale the font for the
first time. What do you suggest is the best way to do this (apart
from modifying text-scale-mode)? Is the following better?

(add-hook 'text-scale-mode-hook (lambda ()
(put 'text-scale-mode-amount 'permanent-local t)))

Titus
Stefan Monnier
2012-03-28 19:30:52 UTC
Permalink
Post by Titus v. d. Malsburg
Stefan, thanks for your response. I understand that making text-scale-
mode-amount permanent-local in the change-major-mode-hook is awkward
but I can't do it when a buffer is opened because the variable is
undefined then.
The `put' doesn't need the variable to be defined. Try it.


Stefan

Loading...