Subject: bug#3354: tcl-mode regression in Emacs 22

From: Will Parsons <[email-masked]>
Date: Sat, 23 May 2009 13:56:22 -0400 (EDT)

Please write in English if possible, because the Emacs maintainers
usually do not have translators to read other languages for them.

Your bug report will be posted to the [email-masked] mailing list,
and to the gnu.emacs.bug news group.

Please describe exactly what actions triggered the bug
and the precise symptoms of the bug:

(This is a repeat of a bug report sent to gnu.emacs.bugs on 29 Mar 2008.)

The following valid Tcl script is recognized automatically as Tcl mode
under Emacs 21 but as shell mode under Emacs 22:

------
isis% cat test.tcl
#!/bin/sh
#\
exec tclsh "$0" ${1+"$@"}
puts test
------

i.e., the shebang overrides the .tcl extension in determining programming
mode.

The original bug report was closed out with the response:

> If the shebang specified /bin/tcl, it would be recognized as a Tcl file.
> In ambiguous situations like this, it's better to use a `-*-' line or
> local variables list (see the node "Choosing Modes" in the Emacs
> manual).

I responded:

  Using a shebang of "#!/bin/tclsh" is not portable, since tclsh may be
  installed elsewhere (typically /usr/local/bin).  The idiom cited in the
  original message is commonly used in Tcl scripts to allow for this.  I am
  aware that "-*-" can be used to force recognition of Tcl mode, but this
  should not be necessary if the script has a ".tcl" extension, and in fact
  it is not necessary in versions of Emacs prior to version 22, so the
  current behaviour is a regression.  If for some reason a decision was
  made to have the shebang override the extension to determine the mode,
  then there should be an easy way of getting back the previous behaviour,
  *without* having to add instructions to Emacs to the script files
  themselves.

This has continued to bite me.  Yes, I *know* that I can stick a -*-tcl-*-
string in the file to force recognition as a Tcl file, but if the order of
precedence was changed in going from Emacs 21 to Emacs 22, there should be
a way of getting back the former behaviour.  I tried adding to my .emacs
file the line:

  (add-to-list 'auto-mode-alist '("\\.tcl$" . tcl-mode))

but files ending in ".tcl" but have a shebang of "#!/bin/sh" are still
being treated as shell mode.  I would like to re-open this as being a
genuine bug.

---

In GNU Emacs 22.3.1 (i386-portbld-freebsd7.0, GTK+ Version 2.12.11)
 of 2008-12-06 on nephthys.thalatta.eme
Windowing system distributor `The X.Org Foundation', version 11.0.60900000
configured using `configure  '--with-gtk' '--x-libraries=/usr/local/lib' '--x-includes=/usr/local/include' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=i386-portbld-freebsd7.0' 'build_alias=i386-portbld-freebsd7.0' 'CC=cc' 'CFLAGS=-O2 -fno-strict-aliasing -pipe''

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: nil
  locale-coding-system: nil
  default-enable-multibyte-characters: t

Major mode: Shell-script

Minor modes in effect:
  display-time-mode: t
  delete-selection-mode: t
  recentf-mode: t
  tooltip-mode: t
  tool-bar-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  unify-8859-on-encoding-mode: t
  utf-translate-cjk-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  abbrev-mode: t