emacs-devel
[Top][All Lists]
Advanced

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

Re: sh-script.el and magic numbers


From: Luc Teirlinck
Subject: Re: sh-script.el and magic numbers
Date: Mon, 20 Jan 2003 18:45:02 -0600 (CST)

Ehud Karni wrote:

   The solution to that is simple. Don't put the "#!" magic number,
   instead change the 1st line to something like this:
   # <your comment> -*- mode: sh -*-

In certain situations it can get somewhat less simple.   

There is a problem here that is still relevant, even though (actually
especially since) a decision has been made on the #! problem.  A
problem I referred to but did not elaborate on, because I thought
(like you) that it could trivially be solved with file local variables
is, in fact, not really as easily solved (for people not familiar with
the sh-script.el source code) as I thought.

Please remember in the following that people could be experienced
shell programmers and even experienced Emacs users without knowing any
Elisp beyond routine customization.

Suppose your default sh-shell-file is bash and are working on a script
intended for csh.  You do not want to use a magic number and maybe do
not want to make the file executable, but you still want all of
sh-script.el to know that you are programming for csh.

The problem is that C-c : will not allow to change sh-shell-file
without inserting a magic number.  Somebody familiar with the
sh-script.el source code can get around this by executing, say 
M-: (sh-set-shell "/bin/csh"), but this is not mentioned in the mode
documentation.  It is also does not persist through different Emacs
sessions, anyway.  Do not try to add .csh or similar to the file name,
it is going to be ignored.  So obviously we try file local variables:

# <your comment> -*- mode: sh; sh-shell-file: /bin/csh; -*-  

Does not work.  sh-shell-file gets set after sh-mode has ran.  The
mode line still says [bash] and indeed, just try, for instance: 
C-c C-c, you get bash's version of case, not csh's switch.  What you 
have to do is:

# <your comment> -*- mode: sh; eval: (sh-set-shell "/bin/csh"); -*-

So it probably would be useful to mention in the mode documentation
that, to tell sh-mode the shell you are programming for, without using
a magic number, you have to do something like 
M-: (sh-set-shell "/bin/csh")
if you want it on a temporary basis and (probably more relevantly),
you have to put something like the previously mentioned line at the
beginning of the script, if you want it to persist.  There still is
the problem that enable-local-eval has to be non-nil (t or maybe) for
the line to work.  I do not know what to do about that.  At least, the
value does not need to be t.  One could, of course, make clear that
using a magic number is way simpler and, in nearly all situations,
vastly preferable.

Sincerely,

Luc.




reply via email to

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