all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "David J. Biesack" <David.Biesack@sas.com>
To: bug-gnu-emacs@gnu.org
Subject: bug#4450: 23.1; encoding error loading .elc locks file
Date: Wed, 16 Sep 2009 11:07:44 -0400	[thread overview]
Message-ID: <ytbocpblygv.fsf@sas.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 2265 bytes --]

I have .el files compiled in earlier versions of Emacs and
I get an error trying to load them in 23.1

  load-file: Invalid read syntax: "invalid multibyte form"

I try to recompile them, but I get an error:

  byte-compile-file: Removing old name: permission denied, c:/djb/emacs/filemenu.e

I must exit emacs to release the lock on the file, then
I can open and byte-compile the .el file and load the .elc

I've attached a copy of my existing filemenu.elc and filemenu.el
but this occurs on other .elc files as well.

In GNU Emacs 23.1.1 (i386-mingw-nt5.1.2600)
 of 2009-07-30 on SOFT-MJASON
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (4.4)'

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: ENU
  value of $XMODIFIERS: nil
  locale-coding-system: cp1252
  default-enable-multibyte-characters: t

Major mode: Emacs-Lisp

Minor modes in effect:
  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
  global-auto-composition-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
M-x l o a d - f i l e <return> d j b / e m a c s / 
f i l e m e n <tab> c <return> C-x C-f d j b / e m 
a c s / f i l e <tab> m e <tab> <return> M-x b y t 
e - c o m p i SPC f SPC <return> f i l e m e n u . 
e l <return> M-x r e p o r t - e m a c s - b u SPC 
<return>

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Loading c:/djb/emacs/filemenu.elc (compiled; note, source file is newer)...
load-file: Invalid read syntax: "invalid multibyte form"
Compiling c:/djb/emacs/filemenu.el...
Fontifying *Compile-Log*... (regexps.......................................................)
Compiling c:/djb/emacs/filemenu.el...done
byte-compile-file: Removing old name: permission denied, c:/djb/emacs/filemenu.elc


-- 
David J. Biesack, SAS
SAS Campus Dr. Cary, NC 27513
www.sas.com    (919) 531-7771

[-- Attachment #2: filemenu.elc --]
[-- Type: application/octet-stream, Size: 3240 bytes --]

[-- Attachment #3: filemenu.el --]
[-- Type: application/octet-stream, Size: 17098 bytes --]

;;; filemenu.el --- Mode for buffers that present menus of files to visit

;; Copyright (C) 1998 Will Mengarini

;; Author: Will Mengarini <seldon@eskimo.com>
;; URL: <http://www.eskimo.com/~seldon>
;; Created: Sa 26 Jul 97
;; Version: 0.52, Mo 04 May 98
;; Keywords: abbrev, files, filemenu, menu

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; This package lets you set up one or more menus of names of files you visit
;; frequently, so you can select from that menu.  A mouse is supported but
;; not required.  The menus are stored in text files; they can have several
;; columns of file names, & can apply different default directories to
;; different groups of lines in the same file.  File names that contain
;; spaces, such as occur on Macs & on Windows {95,NT}, are supported.

;; To use this package, you need to hack 2 files: a file you'll create
;; containing a menu of names of files you access often, & your .emacs file,
;; where you'll autoload filemenu-mode & map loading your menu file to a key.

;; By default, the name of your menu file is "~/filemenu".  I suggest that to
;; get started, you copy this text to that file:
;;   ~/
;;   my-novel.txt   "My Invention.txt"    my-checklist.chl
;;   c:\emacs\emacs-19.34\lisp\simple.el
;; Delete the leading semicolons by putting the cursor in the top left corner
;; of the file, pressing C-SPC to set the mark, moving it to line 3 column 5
;; over the "c" in "c:", & pressing C-x r k to run (kill-rectangle).  Then
;; modify the file names to name files you really have on your system.  You
;; might as well leave the quotes around the middle-column file name just to
;; remind yourself that that format is available (you may need it on
;; Microsoft systems).  On a Microsoft OS, you can use either a virgule or a
;; bash as a directory delimiter; the bash need not be doubled or quadrupled
;; (as it is to cope with multiple levels of quoting in some contexts).  On a
;; Unix system, use a virgule.  "~/" works with all systems.  Note that
;; because it's alone on a line, it sets the default directory for all file
;; names on all following lines until another alone-on-a-line path ending in
;; a directory separator occurs; however, files that have their own absolute
;; directory specifiers are unaffected.  To edit the third line of that file
;; to reflect where your ELisp library actually is, type C-h v load-path; the
;; correct value is in there someplace; copy it.  That'll be enough to let
;; you experiment with filemenu; later you can edit ~/filemenu to add all the
;; files you visit frequently.  (The simple.el library file defines the most
;; frequently used Lisp functions that are standard in GNU Emacs, such as
;; `newline-and-indent'.  If you're a Lisp hacker you'll want to read these
;; occasionally just to understand how Emacs works.  This is also a
;; convenient way of accessing other library files, since once you've loaded
;; this one, its directory becomes the default directory for find-file, and
;; you can use completion to name other files.  (Using dired on the ELisp
;; library can be a bad idea except on fast machines because the library is
;; so big; I've seen building the dired buffer take > 30 s.)  Sparse package
;; documentation often makes it necessary to "Use the Source, Luke" to figure
;; out how to use Emacs features effectively.)

;; Next, put these lines in your .emacs (_emacs on Microsoft systems) file:
;;   (autoload 'filemenu "filemenu"
;;     "Load the file menu named by the variable filemenu-file-name."
;;     t)
;;   (autoload 'filemenu-mode "filemenu"
;;     "Major mode for picking a file to edit from a buffer offering a menu."
;;     t)
;;   (add-to-list auto-mode-alist '("[:/\\]filemenu\\'" . filemenu-mode))
;;   (global-set-key (read-kbd-macro "C-c f") 'filemenu)
;; You can modify the argument to (read-kbd-macro) to whatever is convenient
;; for you.

;; Next, move the cursor to the first of those (autoload) lines, type C-SPC
;; to set the mark, move it to the beginning of the line after the
;; `global-set-key', & type M-x eval-region.  You should then see "nil" in
;; the echo area; that's the value of the final form evaluated.  If you see
;; an error message, there's a typo.  You won't need to do this `eval-region'
;; again; in the future, when you load Emacs, that region will be evaluated
;; along with the rest of your .emacs at load time.  This is just for adding
;; lines to .emacs during a running session.

;; Now you're ready to try filemenu.  Type C-c f (or whatever you modified
;; the `read-kbd-macro' arg to).  You should find yourself in ~/filemenu,
;; which is the buffer into which you typed those 3 sample lines; the mode
;; line should show "Filemenu" ("T:Filemenu" on Microsoft systems) as the
;; major mode.  If anything else happens, review the instructions to be sure
;; you followed them correctly; if it still doesn't work, send me hate mail.

;; Now you're ready to select from the menu.  Try it first just using the
;; keyboard: use the usual motion keys to put point before or inside any of
;; those file names, and press RET.  The effect will be to visit the file.
;; Type C-x k to kill the buffer you just visited, & C-c f again (or
;; whatever) to get back to the filemenu buffer; then type v instead of RET,
;; & the effect will be to visit the file in view-mode.  Kill it again.  If
;; you're familiar with dired, you can try positioning point on the first
;; line (the "~/" line) & pressing RET; the effect will be to run dired on
;; your home directory & put you in the dired buffer.

;; If you're on a system that has a mouse, now try it.  Type C-c f or
;; whatever to get back to the filemenu buffer, move the mouse pointer to
;; some file, & press mouse-1 (which is usually the left button).  The effect
;; will be to visit the file for editing.  Kill it, C-c f again, & press
;; mouse-2 (which is usually the middle button, or a click on the mouse wheel
;; if you have an IntelliMouse, or the left & right buttons simultaneously if
;; you only have a 2-button mouse).  You'll visit the file in view-mode.

;; That's it; filemenu is installed.  Hack ~/filemenu to add the names of
;; files you visit frequently.  Watch out for a gotcha there: when you're
;; visiting that file, you're not in text-mode, you're in filemenu-mode, so
;; RET & v don't insert characters, they visit files.  Get around this by
;; preceding them with C-q.  If you're typing in a large # of file names at
;; once this could be a nuisance; in that case, you could type them into the
;; *scratch* buffer & cut-&-paste them to ~/filemenu.

;; Some customizations are possible; most people won't need these.

;; If you don't like the name "~/filemenu", put a line like
;;   (setq filemenu-file-name "c:/My Emacs Stuff/My Filemenu File.fmn")
;; or whatever pleases you in your .emacs or _emacs file.  Note that if you
;; used bashes instead of virgules as your directory separators there (that's
;; Lisp code, not filemenu buffer text) you'd need to double them:
;;   (setq filemenu-file-name "c:\\My Emacs Stuff\\My Filemenu File.fmm")
;; Virgules work with Emacs on Microsoft systems.

;; If you don't like the keymappings of filemenu-mode, put code like
;;   (defun 'my-filemenu-mode-hook ()
;;     (local-set-key (read-kbd-macro "H-M-f") 'filemenu-find-file-at-point)
;;     (local-set-key [down-mouse-3] 'mouse-set-point)
;;     (local-set-key [mouse-3] 'filemenu-view-file-at-point))
;;   (add-hook 'filemenu-mode-hook 'my-filemenu-mode-hook)
;; in your .emacs file.

;; Finally, if you want multiple filemenu files, take a deep breath, then
;; copy all of this code literally to the top of your .emacs file:
;;
;;   (require 'cl)
;;
;;   (defmacro interactive-lambda (argstring &rest list)
;;     (if (equal argstring "")
;;         `(lambda () (interactive) ,@list)
;;       `(lambda ,(car list) (interactive ,argstring) ,@(cdr list))))
;;
;;   (defmacro global-set-key-to-interactive-lambda (key argstring &rest list)
;;     `(global-set-key ,key (interactive-lambda ,argstring ,@list)))
;;
;;   (fset 'K 'global-set-key-to-interactive-lambda)
;;
;;   (defun multiple-actions-for-multiple-taps-on (key-sequence actions)
;;     (if (stringp key-sequence) (callf read-kbd-macro key-sequence))
;;     (let (keys)
;;       (while
;;           (progn
;;             (eval (car actions))
;;             (callf cdr actions)
;;             (setq keys (read-key-sequence nil))
;;             (and (equal keys key-sequence)
;;                  actions)))
;;       (setq unread-command-events (listify-key-sequence keys))))
;;
;;   (put 'multiple-actions-for-multiple-taps-on
;;        'lisp-indent-function
;;        'defun)
;;
;; Then do an `eval-region' as before on the code you just inserted.
;;
;; Next choose a way of recognizing files that are filemenu files.  On
;; Microsoft systems, this'll be the "extension" of the file, the chars that
;; follow its final dot; I'll assume that's your situation, since if you're
;; on a Unix system you must be smart enough to figure out for yourself how
;; to modify these instructions appropriately.  Let's say you chose ".fmn"
;; as the extension.  Add this line to your .emacs after the other
;; filemenu-related add-to-list line that you already put in:
;;   (add-to-list 'auto-mode-alist '("\\.fmn\\'" . filemenu-mode))
;; Then replace the global-set-key line you already put in with lines
;; equivalent to these (modify the find-file arguments to name your files):
;;   (K "\C-cf" "" (multiple-actions-for-multiple-taps-on "f"
;;                   '((filemenu)
;;                     (find-file "~/WorkMenu.fmm")
;;                     (find-file "~/PlayMenu.fmm")
;;                     (find-file "~/HomeMenu.fmm"))))
;; Do an `eval-region' on the `add-to-list' line & the `K' lines.
;; The effect will be that pressing C-c f will invoke (filemenu) as before,
;; but each subsequent press of f will move to one of the files in
;; "~/{Work,Play,Home}Menu.fmm".  Pressing any other key than f returns f to
;; its normal meaning; f also regains its normal meaning after the final
;; file in the list, "~/HomeMenu.fmm", has been visited.
;; As Ross Perot would say, "it's that simple".

;;; Code:

;; I know about ffap.el, but it has a different feature set.

(defvar filemenu-file-name "~/filemenu"
  "*Path to default file menu used by the filemenu command.")

(defvar filemenu-mode-hook nil
  "Normal hook run after loading a buffer in filemenu mode.")

(eval-when-compile (require 'cl))

(defvar filemenu-map nil
  "Keymap for filemenu mode.")

;;;###autoload
(defun filemenu-mode ()
  "Major mode for picking a file to edit from a buffer offering a menu.
The intended use is on a file you will create listing the files you visit
so frequently you want them on a menu.  The command 'filemenu visits that
file in filemenu-mode.  An example of the format:
   /etc/passwd
   /home/myself/
      diary  \"File with spaces in its name.Doc\"  c:\\DOS\\Nibbles.Bas
      foo.spoo  woo.hoo  /usr/local/bin/ballyhoo.u  oops.oof
   /etc/hosts\\<filemenu-map>
Any # of file names may appear on a line.  If the name contains no
directory separator characters (virgules or backslashes), any preceding
line that ended with such a character is used as the directory.
Indentation is optional & ignored.  You pick a file to visit by
positioning point on its name & typing \\[filemenu-find-file-at-point],
or by mouse-clicking it.  Turning on filemenu mode calls the value of the
variable `filemenu-mode-hook', if that value is non-nil.

\\{filemenu-map}"
;;Note that the above documentation is an ELisp string; the bashes are
;;doubled there only because of that; use single bashes in ~/filemenu.
  (interactive)
  (kill-all-local-variables)
  (setq major-mode 'filemenu-mode
	mode-name "Filemenu")
  (use-local-map filemenu-map)
  (run-hooks 'filemenu-mode-hook))

;;;###autoload
(defun filemenu ()
  "Load the file named by the variable filemenu-file-name."
  (interactive)
  (find-file filemenu-file-name)
  (filemenu-mode))

(if filemenu-map
    ()
  (setq filemenu-map (make-sparse-keymap))
  ;; Remember that M-o whatever can still be used for orthodox functions,
  ;; if you're using my orthodox.el package.
  (define-key filemenu-map "\C-m"         'filemenu-find-file-at-point)
  (define-key filemenu-map [mouse-1]      'filemenu-find-file-at-point)
  ;; That alone isn't good enough because the global [down-mouse-1] mapping
  ;; can eat the [mouse-1] event, so it must be modally overridden:
  (define-key filemenu-map [down-mouse-1] 'mouse-set-point)
  ;; I find that I'm accustomed to using [mouse-2] as in *Apropos* & dired,
  ;; but I'd also like the option of view-mode, so:
  (define-key filemenu-map "v"            'filemenu-view-file-at-point)
  ;; Use C-q v to enter a literal "v"
  (define-key filemenu-map [down-mouse-2] 'mouse-set-point)
  (define-key filemenu-map [mouse-2]      'filemenu-view-file-at-point)
  )

(defun filemenu-find-file-at-point ()
  (interactive)
  (filemenu-visit-file-at-point-using 'find-file))

(defun filemenu-view-file-at-point ()
  (interactive)
  (filemenu-visit-file-at-point-using 'view-file))

(defun filemenu-visit-file-at-point-using (function)
  (or (symbolp function) (error "Internal failure 3322"))
  (if (and (bolp) (eolp)) (error "Empty line"))
  (let (point-bol point-start point-end file)
    (save-excursion
      (beginning-of-line)
      (if (looking-at "[ \t]+$") (error "Line is all whitespace"))
      (setq point-bol (point)))
    (save-excursion
      ;; Now we must get inside any quotes.  Because the quote search starts
      ;; with a search-backward, it's OK to be on the trailing quote of
      ;; "file", but not on the leading one; so if we're on a quote followed
      ;; by nonwhitespace we must move forward.  Also, we could be invoked
      ;; after the last quoted string on the line; in that case we must move
      ;; backward to the closing quote, or the search-backward intended
      ;; to find the opening quote will find the closing one instead.
      (when (< (current-column) (current-indentation))
        (back-to-indentation))
      (if (looking-at "\"[^ \t\n]")
          (forward-char)
        (while (looking-at "[ \t\]*$") (backward-char)))
      ;; Buglettino not worth fixing: in a line like
      ;;   "file1"  "file2"  "file3"
      ;; this works if dot is before or after the nonwhitespace on the line,
      ;; but if it's invoked *between* files, it'll interpret the surrounding
      ;; quotes as quoting a file whose name is whitespace.  It could avoid
      ;; that by counting quotes & realizing an even # preceded dot, but hey.
      (if (search-backward "\"" point-bol t)
          (progn
            ;; There was one quote, so require the other
            (forward-char)
            (setq point-start (point))
            (search-forward "\"")
            (backward-char)
            (setq point-end (point)))
        (re-search-backward "^\\|[ \t]")
        (if (looking-at "[ \t]")
            (forward-char))
        (setq point-start (point))
        (re-search-forward "\\([ \t]\\)\\|$")
        (if (match-beginning 1)
            (backward-char))
        (setq point-end (point)))
      (setq file (buffer-substring point-start point-end))
      (if (= (length file) 0) (error "No file name specified"))
      ;; If this file name included no directory, search backward in the
      ;; menu buffer for a line defining the directory & prepend it.
      (if (string-match "[/\\]" file)
          ()
        (when (re-search-backward "\\([/\\]\\)\\s-*$" nil t)
          (back-to-indentation)
          (setq point-bol (point))
          (goto-char (1+ (match-beginning 1)))
          (setq file (concat (buffer-substring point-bol (point)) file)))))
    (if (string-match "[*?]" file)
        (progn
          (message "(dired %S)" file)
          (dired file))
      (message "(%S %S)" function file)
      (let ((jiggle-enabled nil));see my jiggle.el
        (bury-buffer))
      (funcall function file))))

(provide 'filemenu)

;;; filemenu.el ends here

             reply	other threads:[~2009-09-16 15:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-16 15:07 David J. Biesack [this message]
  -- strict thread matches above, loose matches on Subject: below --
2009-09-18 18:32 bug#4450: 23.1; encoding error loading .elc locks file Chong Yidong
2009-09-18 19:26 ` Juanma Barranquero
2009-09-18 20:54   ` Eli Zaretskii
2009-09-21 12:46     ` David J. Biesack

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ytbocpblygv.fsf@sas.com \
    --to=david.biesack@sas.com \
    --cc=4450@emacsbugs.donarmstrong.com \
    --cc=bug-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.