all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Wolfgang Jenkner <wjenkner@inode.at>
Subject: patch for conf-space-mode glitches
Date: Mon, 04 Sep 2006 23:47:56 +0200	[thread overview]
Message-ID: <m2u03ni9rn.fsf@gaston.none> (raw)


Create a file (say, ./x) with the following content:

# -*-conf-*-

foo bar quux

# Local Variables:
# conf-space-keywords: "foo"
# End:

Visit it: C-x C-f x <return> y y

There is an inconvenience here, viz. that (by design) you are asked
twice about the same Local Variables.

Anyway, `foo' has the `font-lock-keyword-face' face text-property now
and is correctly highlighted.

Now type: C-u C-c SPC n f o o <return>

IIUC the result should be the same as above.  However `foo' has the
`font-lock-variable-name-face' face text-property instead (also, it
doesn't make sense to ask about the Local Variables here).

On the other hand,

C-u C-x C-v <return> n f o o <return> n

does give the expected result.  However, passing down like this the
prefix arg from a different command is quite problematic; for example,
`ffap-bindings' rebinds C-x C-f to `find-file-at-point', which also
plays tricks with `current-prefix-arg'.  In particular,

C-u C-x C-f / f t p . f o o . b a r : RET

surprises by asking for a "Regexp to match keywords: " (if you have a
valid ~/.netrc `ange-ftp-parse-netrc' inserts it in a buffer and calls
`normal-mode' etc.)

The following patch makes `conf-space-mode' behave like other modes,
while still not contradicting what is documented in the docstrings.
The disadvantage is that people who put some `conf-space-keywords'
dependent function on `conf-space-mode-hook' have to do some more work
now; see the comment at the end of the patch below.

Index: conf-mode.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/textmodes/conf-mode.el,v
retrieving revision 1.14
diff -c -r1.14 conf-mode.el
*** conf-mode.el	6 Feb 2006 12:12:26 -0000	1.14
--- conf-mode.el	4 Sep 2006 19:37:58 -0000
***************
*** 190,195 ****
--- 190,199 ----
  	  '("^[ \t]*\\([^\000- ]+\\)" 1 'font-lock-variable-name-face)))
    "Keywords to hilight in Conf Space mode.")
  
+ (defvar conf-space-change-flag nil
+   "Holds what the last call to `conf-space-hack-keywords' returned.
+ Might be useful if you put more stuff on `hack-local-variables-hook'.")
+ 
  (defvar conf-colon-font-lock-keywords
    `(;; [section] (do this first because it may look like a parameter)
      ("^[ \t]*\\[\\(.+\\)\\]" 1 'font-lock-type-face)
***************
*** 467,498 ****
    (conf-mode-initialize "#" 'conf-space-font-lock-keywords)
    (set (make-local-variable 'conf-assignment-sign)
         nil)
!   ;; This doesn't seem right, but the next two depend on conf-space-keywords
!   ;; being set, while after-change-major-mode-hook might set up imenu, needing
!   ;; the following result:
!   (hack-local-variables-prop-line)
!   (hack-local-variables)
!   (cond (current-prefix-arg
!          (set (make-local-variable 'conf-space-keywords)
!               (if (> (prefix-numeric-value current-prefix-arg) 0)
!                   (read-string "Regexp to match keywords: "))))
!         (conf-space-keywords)
!         (buffer-file-name
!          (set (make-local-variable 'conf-space-keywords)
!               (assoc-default buffer-file-name conf-space-keywords-alist
!                              'string-match))))
!   (set (make-local-variable 'conf-assignment-regexp)
!        (if conf-space-keywords
! 	   (concat "\\(?:" conf-space-keywords "\\)[ \t]+.+?\\([ \t]+\\|$\\)")
! 	 ".+?\\([ \t]+\\|$\\)"))
!   (setq imenu-generic-expression
! 	`(,@(cdr imenu-generic-expression)
! 	  ("Parameters"
! 	   ,(if conf-space-keywords
! 		(concat "^[ \t]*\\(?:" conf-space-keywords
! 			"\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
! 	      "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
! 	   1))))
  
  ;;;###autoload
  (define-derived-mode conf-colon-mode conf-unix-mode "Conf[Colon]"
--- 471,533 ----
    (conf-mode-initialize "#" 'conf-space-font-lock-keywords)
    (set (make-local-variable 'conf-assignment-sign)
         nil)
!   (let ((arg (and (eq this-command 'conf-space-mode) current-prefix-arg)))
!     (cond (arg
! 	   (set (make-local-variable 'conf-space-keywords)
! 		(if (> (prefix-numeric-value current-prefix-arg) 0)
! 		    (read-string "Regexp to match keywords: "))))
! 	  (conf-space-keywords)		;A global value.  Useful?
! 	  (buffer-file-name
! 	   (set (make-local-variable 'conf-space-keywords)
! 		(assoc-default buffer-file-name conf-space-keywords-alist
! 			       'string-match))))
!     (conf-space-hack-keywords t)
!     (unless arg
!       (add-hook 'hack-local-variables-hook 'conf-space-hack-keywords nil t))))
! 
! 
! (defun conf-space-hack-keywords (&optional mode-flag)
!   "Initialize or adjust variables depending on `conf-space-keywords'.
! Returns non-nil iff MODE-FLAG is nil and something actually changed."
!   (when (or mode-flag (eq major-mode 'conf-space-mode))
!     (let ((regexp (if conf-space-keywords
! 		      (concat "\\(?:" conf-space-keywords
! 			      "\\)[ \t]+.+?\\([ \t]+\\|$\\)")
! 		    ".+?\\([ \t]+\\|$\\)")))
!       (set (make-local-variable 'conf-space-change-flag)
! 	   (when (or mode-flag (not (string= conf-assignment-regexp regexp)))
! 	     (set (make-local-variable 'conf-assignment-regexp) regexp)
! 	     ;; Take care of `(eval ...)' in `conf-space-font-lock-keywords'.
! 	     (when (and font-lock-mode
! 			(boundp 'font-lock-keywords)) ;see `normal-mode'
! 	       (font-lock-add-keywords nil nil)
! 	       (font-lock-mode 1))
! 	     (setq imenu-generic-expression
! 		   `(,@(remq (assoc "Parameters" imenu-generic-expression)
! 			     imenu-generic-expression)
! 		     ("Parameters"
! 		      ,(if conf-space-keywords
! 			   (concat "^[ \t]*\\(?:" conf-space-keywords
! 				   "\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
! 			 "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
! 		      1)))
! 	     (not mode-flag))))))
! 
! ;; A comment in the original `conf-space-mode' states: [...]
! ;; `after-change-major-mode-hook' might set up imenu, needing [some
! ;; stuff depending on `conf-space-keywords'].
! 
! ;; The following snippet makes sure 'after-change-major-mode-hook' is
! ;; run at an appropriate time, though I think it would be cleaner to
! ;; run specific functions instead of the whole hook.
! 
! ;; (add-hook 'conf-space-mode-hook
! ;;	  (lambda ()
! ;;	    (add-hook 'hack-local-variables-hook
! ;;		      (lambda ()
! ;;			(when conf-space-change-flag
! ;;			  (run-hooks 'after-change-major-mode-hook))) ;Yuck!
! ;;		      t t)))
  
  ;;;###autoload
  (define-derived-mode conf-colon-mode conf-unix-mode "Conf[Colon]"

                 reply	other threads:[~2006-09-04 21:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=m2u03ni9rn.fsf@gaston.none \
    --to=wjenkner@inode.at \
    /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.