emacs-devel
[Top][All Lists]
Advanced

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

Re: find-file-hook as illustration of Custom problems


From: Luc Teirlinck
Subject: Re: find-file-hook as illustration of Custom problems
Date: Wed, 9 Feb 2005 23:12:21 -0600 (CST)

Richard Stallman wrote:

   This is the wrong solution.  The right solution for variables such as
   minibuffer-prompt-properties is to set up a valid expression for its
   standard value.  It may be necessary to store the current default
   value in a new variable so that the standard value can use that
   variable.  This is easy and simple, it's just that each variable needs
   to be looked at separately.  Would you like to do this for some
   of the variables?

Yes, for some.  Here is a try at one.

Actually, I started out with my least favorite Emacs feature,
`blink-cursor'.  Reason for that is that this one had a very
intriguing bug.  This extra bug is unrelated to the stuff we have been
discussing here, but we should fix it anyway.  It is confusing and
annoying.

Description of bug:

Do `emacs -q --eval "(blink-cursor-mode 0)" &'.  Then:

M-x customize-rogue (actually, `C-h v blink-cursor' works too).

We now see that blink-cursor is t, even though the cursor does not blink.

If we do `M-x load-library RET frame", the cursor _does_ start blinking.
(Courtesy of custom-initialize-reset.  I looked away as fast as I
could and typed `C-x C-c'.)

The problem is that the function `blink-cursor-mode' sets the value of
the variable blink-cursor-mode, but not of blink-cursor.  The patch
below does get rid of blink-cursor altogether and uses
blink-cursor-mode instead.  I know there must have been some reason
why that was not done all along, but I guess it must have been related
to the fake defcustom stuff, which the patch also gets rid of (that
was the original purpose).

One problem is that this will mess things up for the (I suppose many)
people who have set blink-cursor to nil_in their custom-set-variables
form.  The patch keeps blink-cursor as an alias for blink-cursor-mode,
but Custom does apparently not recognize aliases.  (That is probably
something we could and should fix still for Emacs 22.)

I do not know whether the combination phony-defvar, then
defvar-mimicking setq, then makunbound, then non-top-level defcustom
in startup.el is acceptable.  It seems to do the job.  The problem
with a temporary variable, as you suggested, seems to be that code
should use the same variable during startup and after that, so it did
not seem like it would work very well.

As a minor detail:

`blink-cursor-timer' now seems to call `blink-cursor-timer-function'
instead of `blink-cursor'.  The patch addresses this too.

===File ~/frame.el-diff=====================================
*** frame.el    09 Feb 2005 15:59:13 -0600      1.215
--- frame.el    09 Feb 2005 22:50:04 -0600      
***************
*** 1253,1262 ****
  
  (defvar blink-cursor-timer nil
    "Timer started from `blink-cursor-start'.
! This timer calls `blink-cursor' every `blink-cursor-interval' seconds.")
  
! (defvar blink-cursor-mode nil
!   "Non-nil means blinking cursor is active.")
  
  (defun blink-cursor-mode (arg)
    "Toggle blinking cursor mode.
--- 1253,1267 ----
  
  (defvar blink-cursor-timer nil
    "Timer started from `blink-cursor-start'.
! This timer calls `blink-cursor-timer-function' every
! `blink-cursor-interval' seconds.")
  
! ;; This will be unbound and defcustomed in startup.el.  We can not
! ;; defcustom it  here because the default depends on the operating system.
! (defvar blink-cursor-mode)
! (defvaralias 'blink-cursor 'blink-cursor-mode)
! (make-obsolete-variable 'blink-cursor 'blink-cursor-mode "22.1")
! (unless (boundp 'blink-cursor-mode) (setq blink-cursor-mode nil))
  
  (defun blink-cursor-mode (arg)
    "Toggle blinking cursor mode.
***************
*** 1289,1306 ****
          (setq blink-cursor-mode t))
        (internal-show-cursor nil t))))
  
- ;; Note that this is really initialized from startup.el before
- ;; the init-file is read.
- 
- (defcustom blink-cursor nil
-   "*Non-nil means blinking cursor mode is active."
-   :group 'cursor
-   :tag "Blinking cursor"
-   :type 'boolean
-   :set #'(lambda (symbol value)
-          (set-default symbol value)
-          (blink-cursor-mode (or value 0))))
- 
  (defun blink-cursor-start ()
    "Timer function called from the timer `blink-cursor-idle-timer'.
  This starts the timer `blink-cursor-timer', which makes the cursor blink
--- 1294,1299 ----
============================================================

===File ~/startup.el-diff===================================
*** startup.el  28 Dec 2004 09:50:38 -0600      1.337
--- startup.el  09 Feb 2005 19:46:22 -0600      
***************
*** 735,747 ****
                (<= (frame-parameter nil 'tool-bar-lines) 0))
      (tool-bar-mode 1))
  
!   ;; Can't do this init in defcustom because window-system isn't set.
!   (unless (or noninteractive
!             emacs-quick-startup
!               (eq system-type 'ms-dos)
!               (not (memq window-system '(x w32))))
!     (setq-default blink-cursor t)
!     (blink-cursor-mode 1))
  
    (unless noninteractive
      ;; DOS/Windows systems have a PC-type keyboard which has both
--- 735,753 ----
                (<= (frame-parameter nil 'tool-bar-lines) 0))
      (tool-bar-mode 1))
  
!   (makunbound 'blink-cursor-mode)
!   (defcustom blink-cursor-mode
!     (not (or noninteractive
!            emacs-quick-startup
!            (eq system-type 'ms-dos)
!            (not (memq window-system '(x w32)))))
!     "*Non-nil means Blinking Cursor mode is active."
!     :group 'cursor
!     :tag "Blinking cursor"
!     :type 'boolean
!     :set #'(lambda (symbol value)
!            (set-default symbol value)
!            (blink-cursor-mode (or value 0))))
  
    (unless noninteractive
      ;; DOS/Windows systems have a PC-type keyboard which has both
============================================================
 LocalWords:  defvar




reply via email to

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