help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Why didn't setq work here?


From: Eric Lilja
Subject: Re: Why didn't setq work here?
Date: Fri, 07 Jan 2011 13:43:47 +0100
User-agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7

On 2011-01-07 04:40, Deniz Dogan wrote:
2011/1/7 Eric Lilja<mindcooler@gmail.com>:
Hello, I'm running "GNU Emacs 24.0.50.1 (i386-mingw-nt6.1.7600) of
2011-01-03 on 3249CTO" (a build provided by Mr Sean Sieger) under Windows 7
x64.

I don't really know how to configure emacs so please excuse any stupidity
found below and improper use terminology.

For LaTeX buffers, I wanted to turn on the minor mode auto-fill-mode, with a
fill-column of 76.

After a bit of investigating, I found that I could run "commands" (if that's
what they're called) when major mode latex is loaded/activated for a buffer
by using hooks, like this:

(defun my-latex-hook ()
  (message "Running my-latex-hook")
)
(add-hook 'latex-mode-hook 'my-latex-hook)

I added the statement above and launched emacs like this:
$ emacs foo.tex&
and I could see from the message output that my hook was indeed working.
Good. Just what I wanted.

So now I just need to turn on the minor mode auto-fill-mode with fill-column
set to 76 when this hook is "executed".

In my naivety, I tried this:

(defun my-latex-hook ()
  (message "Running my-latex-hook")
  (setq auto-fill-mode 1)
  (setq fill-column 76)
)
(add-hook 'latex-mode-hook 'my-latex-hook)

I saw a warning when I byte-compiled my .emacs:
In my-latex-hook:
.emacs:42:9:Warning: assignment to free variable `auto-fill-mode'

but tried anyway. Closed emacs and restarted as I did above ($ emacs
foo.tex&)

I noticed straight away that the minor mode auto-fill-mode had not been
turned on.
However, C-h v fill-column showed that my fill-column had been set though
since its value was now the desired 76 instead of the default 70.

In order to solve the problem of auto-fill-mode not being turned on and
getting rid of the byte compiler warning, I rewrote my hook like this:

(defun my-latex-hook ()
  (message "Running my-latex-hook")
  (auto-fill-mode 1)
  (set-fill-column 76)
)
(add-hook 'latex-mode-hook 'my-latex-hook)

Now auto-fill-mode is indeed turned on and I don't get a warning by the byte
compiler when I set fill column. Ok, so I am happy. Problem solved! :)

But here's my question: Why didn't setq work as I thought it would? By not
work I meant I the minor mode auto-fill-mode was not turned on and even
though the fill column was set as I desired, the statement produced a
warning as I showed above.

Thanks for any replies! :)

- EL




`setq' only sets the value of a variable. The variable you tried to
set, auto-fill-mode, has not been defined -- it doesn't "exist" yet.
The warning about a "free variable" in this context means that the
variable is not defined in the current scope.

The correct way to turn auto-fill-mode on or off is to call the
function with the same name, which you figured out later. The
_variable_ auto-fill-mode doesn't exist in this case, though in many
other modes there is a variable named identically to the function to
turn it on or off. In some modes where that is the case, setting the
variable has effect. In some other modes, it doesn't.

By the way, in Emacs a function is a function and a "command" is a
function that can be called interactively, i.e. using e.g. M-x.

I hope that makes things a bit clearer.

--
Deniz Dogan



Hello Mr Dogan, and thank you for your polite and informative reply. Using your information, I added the following comment to my .emacs:

(defun my-latex-hook ()
  (message "Running my-latex-hook")
  ;; Using setq does not work, because setq is for setting values of
  ;; variables and there is no variable called auto-fill-mode (as can
  ;; be observed by performing C-h v auto-fill-mode). The correct way
  ;; to turn on auto-fill-mode is to call the funcion auto-fill-mode
  ;; with a positive argument. In some modes there exists a variable
  ;; with the same name as the function which disables or enables that
  ;; mode (a variable that can be used for the same purpose), but
  ;; auto-fill-mode is not one of those modes.
  (auto-fill-mode 1)
  (set-fill-column 76)
)
(add-hook 'latex-mode-hook 'my-latex-hook)

I have one final question though. fill-column does seem to be a variable. It can be described using C-h v and set using M-x set-variable. However, if I replace (set-fill-column 76) with (setq fill-column 76) the variable value is never changed (and no byte compiler warning btw). I see now that I was mistaken in my first post, btw, I thought that using setq worked for fill-column but produced a warning, but this is not the case. It didn't work and the byte compiler warning was for auto-fill-mode. So my final question, before I can lay this entire topic to rest, is: why didn't setq work for fill-column, which seems to satisfy the requirements of being a variable?

Thanks!

- EL




reply via email to

[Prev in Thread] Current Thread [Next in Thread]