* ruler support in hexl mode @ 2004-03-05 5:29 Masatake YAMATO 2004-03-08 20:05 ` Stefan Monnier 2004-03-08 21:00 ` Miles Bader 0 siblings, 2 replies; 26+ messages in thread From: Masatake YAMATO @ 2004-03-05 5:29 UTC (permalink / raw) I've added a ruler to hexl mode. Please, review the patch. Masatake YAMATO 2004-03-05 Masatake YAMATO <jet@gyve.org> * hexl.el (top-level): Add ruler support in hexl-mode. Require ruler.el. (hexl-follow-line, hexl-use-ruler) (hexl-use-face-on-address-area, hexl-address-area-face) (hexl-use-face-on-ascii-area, hexl-ascii-area-face): New customizable variables. (hexl-mode-old-header-line-format): New internal variable. (hexl-line-overlay): New internal variable. (hexl-mode-header-line-format): New constant. (hexl-mode): Store old `header-line-format' and set new value(ruler) to it. Turn on `hexl-follow-line'. (hexl-mode-exit): remove `hexl-follow-line-find' from `post-command-hook'. Clear `hexl-line-overlay'. (hexl-mode-exit): Restore old `header-line-format'. (hexlify-buffer): Put faces on hexl address area and ascii area. (hexl-follow-line): New function. (hexl-follow-line-find): New function. (hexl-mode-ruler): New function. cvs diff: warning: unrecognized response `access control disabled, clients can connect from any host' from cvs server Index: lisp/hexl.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/hexl.el,v retrieving revision 1.84 diff -u -r1.84 hexl.el --- lisp/hexl.el 4 Mar 2004 18:19:18 -0000 1.84 +++ lisp/hexl.el 5 Mar 2004 05:26:29 -0000 @@ -43,6 +43,7 @@ ;;; Code: (require 'eldoc) +(require 'ruler-mode) ;; ;; vars here @@ -78,6 +79,34 @@ :group 'hexl :version "20.3") +(defcustom hexl-follow-line t + "If non-nil then highlight the line address corresponding to point." + :type 'boolean + :group 'hexl) + +(defcustom hexl-use-ruler t + "If non-nil then show the ruler for hexl mode." + :type 'boolean + :group 'hexl) + +(defcustom hexl-use-face-on-address-area t + "If non-nil then put `hexl-address-area-face' on adderss area of hexl-mode buffer." + :type 'face + :group 'hexl) + +(defface hexl-address-area-face + '((t (:inherit header-line))) + "Face used in address are of hexl-mode buffer.") + +(defcustom hexl-use-face-on-ascii-area t + "If non-nil then put `hexl-ascii-area-face' on ascii area of hexl-mode buffer." + :type 'face + :group 'hexl) + +(defface hexl-ascii-area-face + '((t (:inherit header-line))) + "Face used in ascii are of hexl-mode buffer.") + (defvar hexl-max-address 0 "Maximum offset into hexl buffer.") @@ -89,11 +118,20 @@ (defvar hexl-mode-old-isearch-search-fun-function) (defvar hexl-mode-old-require-final-newline) (defvar hexl-mode-old-syntax-table) +(defvar hexl-mode-old-header-line-format) (defvar hexl-ascii-overlay nil "Overlay used to highlight ASCII element corresponding to current point.") (make-variable-buffer-local 'hexl-ascii-overlay) +(defvar hexl-line-overlay nil + "Overlay used to highlight the address of line corresponding to current point.") +(make-variable-buffer-local 'hexl-line-overlay) + +(defconst hexl-mode-header-line-format + '(:eval (hexl-mode-ruler)) + "`header-line-format' used in hexl mode.") + ;; routines (put 'hexl-mode 'mode-class 'special) @@ -245,8 +283,13 @@ (eldoc-remove-command "hexl-save-buffer" "hexl-current-address") - (if hexl-follow-ascii (hexl-follow-ascii 1))) - (run-hooks 'hexl-mode-hook)) + (make-variable-buffer-local 'hexl-mode-old-header-line-format) + (setq hexl-mode-old-header-line-format header-line-format) + (setq header-line-format hexl-mode-header-line-format) + + (if hexl-follow-ascii (hexl-follow-ascii 1)) + (if hexl-follow-line (hexl-follow-line 1)) + (run-hooks 'hexl-mode-hook))) (defun hexl-isearch-search-function () @@ -333,7 +376,10 @@ (remove-hook 'after-revert-hook 'hexl-after-revert-hook t) (remove-hook 'change-major-mode-hook 'hexl-maybe-dehexlify-buffer t) (remove-hook 'post-command-hook 'hexl-follow-ascii-find t) + (remove-hook 'post-command-hook 'hexl-follow-line-find t) + (setq hexl-ascii-overlay nil) + (setq hexl-line-overlay nil) (setq require-final-newline hexl-mode-old-require-final-newline) (setq mode-name hexl-mode-old-mode-name) @@ -341,6 +387,7 @@ (use-local-map hexl-mode-old-local-map) (set-syntax-table hexl-mode-old-syntax-table) (setq major-mode hexl-mode-old-major-mode) + (setq header-line-format hexl-mode-old-header-line-format) (force-mode-line-update)) (defun hexl-maybe-dehexlify-buffer () @@ -648,6 +695,17 @@ (apply 'call-process-region (point-min) (point-max) (expand-file-name hexl-program exec-directory) t t nil (split-string hexl-options)) + (save-excursion + (when hexl-use-face-on-address-area + (goto-char (point-min)) + (while (re-search-forward "^[0-9a-f]\\{8\\}:" nil t) + (put-text-property (match-beginning 0) (match-end 0) + 'face 'hexl-address-area-face))) + (goto-char (point-min)) + (when hexl-use-face-on-ascii-area + (while (re-search-forward " \\( .+$\\)" nil t) + (put-text-property (match-beginning 1) (match-end 1) + 'face 'hexl-ascii-area-face)))) (if (> (point) (hexl-address-to-marker hexl-max-address)) (hexl-goto-address hexl-max-address)))) @@ -865,6 +923,34 @@ (remove-hook 'post-command-hook 'hexl-follow-ascii-find t) ))))) +(defun hexl-follow-line (&optional arg) + "Toggle following line address in Hexl buffers. +With prefix ARG, turn on following if and only if ARG is positive. +When following is enabled, the line address corresponding to the +element under the point is highlighted. +Customize the variable `hexl-follow-line' to disable this feature." + (interactive "P") + (let ((on-p (if arg + (> (prefix-numeric-value arg) 0) + (not hexl-line-overlay)))) + + (if on-p + ;; turn it on + (if (not hexl-line-overlay) + (progn + (setq hexl-line-overlay (make-overlay 1 1) + hexl-follow-line t) + (overlay-put hexl-line-overlay 'face 'highlight) + (add-hook 'post-command-hook 'hexl-follow-line-find nil t))) + ;; turn it off + (if hexl-line-overlay + (progn + (delete-overlay hexl-line-overlay) + (setq hexl-line-overlay nil + hexl-follow-line nil) + (remove-hook 'post-command-hook 'hexl-follow-line-find t) + ))))) + (defun hexl-follow-ascii-find () "Find and highlight the ASCII element corresponding to current point." (let ((pos (+ 51 @@ -872,6 +958,64 @@ (mod (hexl-current-address) 16)))) (move-overlay hexl-ascii-overlay pos (1+ pos)) )) + +(defun hexl-follow-line-find () + "Find and highlight the line address corresponding to current point." + (move-overlay hexl-line-overlay + (line-beginning-position) + (+ (line-beginning-position) 8))) + +;; ruler + +;; This function is derived from `ruler-mode-ruler' in ruler-mode.el. +(defun hexl-mode-ruler () + "Return a string ruler for hexl mode." + (when hexl-use-ruler + (let* ((fullw (ruler-mode-full-window-width)) + (w (window-width)) + (m (window-margins)) + (lsb (ruler-mode-left-scroll-bar-cols)) + (lf (ruler-mode-left-fringe-cols)) + (lm (or (car m) 0)) + (ruler (make-string fullw ?\ )) + (o (+ lsb lf lm)) + (x o) + (highlight (mod (hexl-current-address) 16))) + ;; "87654321" + (do ((i 8 (1- i))) + ((= i 0)) + (aset ruler x (aref (number-to-string i) 0)) + (setq x (1+ x))) + ;; "87654321 " + (setq x (+ x 2)) ; ": " + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff" + (do* ((i 0 (1+ i)) + (c (format "%x" i) (format "%x" i))) + ((= i 16)) + (aset ruler x (aref c 0)) + (setq x (1+ x)) + (aset ruler x (aref c 0)) + (setq x (1+ x)) + (if (= highlight i) + (put-text-property (- x 2) x + 'face 'highlight + ruler)) + (when (= (mod i 2) 1) + (aset ruler x ?\ ) + (setq x (1+ x)))) + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff " + (setq x (1+ x)) ; " " + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef" + (do* ((i 0 (1+ i)) + (c (format "%x" i) (format "%x" i))) + ((= i 16)) + (aset ruler x (aref c 0)) + (setq x (1+ x)) + (if (= highlight i) + (put-text-property (1- x) x + 'face 'highlight + ruler))) + ruler))) ;; startup stuff. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-05 5:29 ruler support in hexl mode Masatake YAMATO @ 2004-03-08 20:05 ` Stefan Monnier 2004-03-09 12:11 ` Masatake YAMATO ` (2 more replies) 2004-03-08 21:00 ` Miles Bader 1 sibling, 3 replies; 26+ messages in thread From: Stefan Monnier @ 2004-03-08 20:05 UTC (permalink / raw) Cc: emacs-devel > +(defcustom hexl-follow-line t > + "If non-nil then highlight the line address corresponding to point." > + :type 'boolean > + :group 'hexl) Any reason why you do not simply use hl-line-mode ? Or, better yet, let the user select hl-line-mode if he wants it? > +(defcustom hexl-use-face-on-address-area t > + "If non-nil then put `hexl-address-area-face' on adderss area of hexl-mode buffer." > + :type 'face > + :group 'hexl) > +(defcustom hexl-use-face-on-ascii-area t > + "If non-nil then put `hexl-ascii-area-face' on ascii area of hexl-mode buffer." > + :type 'face > + :group 'hexl) You can probably just remove these variables and place the faces on the `font-lock-face' property, so the user can use M-x global-font-lock-mode to turn highlighting on/off. > @@ -89,11 +118,20 @@ > (defvar hexl-mode-old-isearch-search-fun-function) > (defvar hexl-mode-old-require-final-newline) > (defvar hexl-mode-old-syntax-table) > +(defvar hexl-mode-old-header-line-format) > (defvar hexl-ascii-overlay nil > "Overlay used to highlight ASCII element corresponding to current point.") > (make-variable-buffer-local 'hexl-ascii-overlay) > +(defvar hexl-line-overlay nil > + "Overlay used to highlight the address of line corresponding to current point.") > +(make-variable-buffer-local 'hexl-line-overlay) > + > +(defconst hexl-mode-header-line-format > + '(:eval (hexl-mode-ruler)) > + "`header-line-format' used in hexl mode.") > + > ;; routines > (put 'hexl-mode 'mode-class 'special) > @@ -245,8 +283,13 @@ > (eldoc-remove-command "hexl-save-buffer" > "hexl-current-address") > - (if hexl-follow-ascii (hexl-follow-ascii 1))) > - (run-hooks 'hexl-mode-hook)) > + (make-variable-buffer-local 'hexl-mode-old-header-line-format) > + (setq hexl-mode-old-header-line-format header-line-format) That should be (set (make-local-variable 'hexl-mode-old-header-line-format) header-line-format) `make-variable-buffer-local' should almost never be called from inside a function. > + (while (re-search-forward "^[0-9a-f]\\{8\\}:" nil t) I'd use `+' rather than `\\{8\\}' because it's shorter, easier to read, more efficient, and most importantly future-proof (for very large files). > + (put-text-property (match-beginning 0) (match-end 0) > + 'face 'hexl-address-area-face))) > + (goto-char (point-min)) > + (when hexl-use-face-on-ascii-area > + (while (re-search-forward " \\( .+$\\)" nil t) > + (put-text-property (match-beginning 1) (match-end 1) > + 'face 'hexl-ascii-area-face)))) Why do you put the face property on the space before the actual "ascii" data? > +;; This function is derived from `ruler-mode-ruler' in ruler-mode.el. > +(defun hexl-mode-ruler () > + "Return a string ruler for hexl mode." > + (when hexl-use-ruler > + (let* ((fullw (ruler-mode-full-window-width)) > + (w (window-width)) > + (m (window-margins)) > + (lsb (ruler-mode-left-scroll-bar-cols)) > + (lf (ruler-mode-left-fringe-cols)) > + (lm (or (car m) 0)) > + (ruler (make-string fullw ?\ )) We really need to move this out of ruler-mode into frame.el or some other "global" file. And to give it a clean interface so its implementation can be improved later. > + (o (+ lsb lf lm)) > + (x o) > + (highlight (mod (hexl-current-address) 16))) > + ;; "87654321" > + (do ((i 8 (1- i))) > + ((= i 0)) > + (aset ruler x (aref (number-to-string i) 0)) > + (setq x (1+ x))) > + ;; "87654321 " > + (setq x (+ x 2)) ; ": " > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff" > + (do* ((i 0 (1+ i)) > + (c (format "%x" i) (format "%x" i))) > + ((= i 16)) > + (aset ruler x (aref c 0)) > + (setq x (1+ x)) > + (aset ruler x (aref c 0)) > + (setq x (1+ x)) > + (if (= highlight i) > + (put-text-property (- x 2) x > + 'face 'highlight > + ruler)) > + (when (= (mod i 2) 1) > + (aset ruler x ?\ ) > + (setq x (1+ x)))) > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff " > + (setq x (1+ x)) ; " " > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef" > + (do* ((i 0 (1+ i)) > + (c (format "%x" i) (format "%x" i))) > + ((= i 16)) > + (aset ruler x (aref c 0)) > + (setq x (1+ x)) > + (if (= highlight i) > + (put-text-property (1- x) x > + 'face 'highlight > + ruler))) > + ruler))) Isn't this always building the exact same string, except for the size (which really does not need to depend on the window's width), the leading space (to align it), and the highlighting of the current column? Couldn't we just do (100% untested code, inspired from buff-menu.el): (let ((spaces (+ lsb lf lm)) (s "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") (pos 0)) ;; Turn spaces in the header into stretch specs so they work ;; regardless of the header-line face. (while (string-match "[ \t]+" s pos) (setq pos (match-end 0)) (put-text-property (match-beginning 0) pos 'display ;; Assume fixed-size chars `(space :align-to ,(+ spaces pos)) s)) ;; Highlight the current column. (put-text-property (+ 10 (/ (* 5 highlight) 2)) (+ 12 (/ (* 5 highlight) 2)) 'face 'highlight s) ;; Add the leading space. (concat (propertize (make-string (floor spaces) ? ) 'display `(space :width ,spaces)) s)) Note that the use of the display property also allows us to deal with fractional sizes, although lsb and lf don't take advantage of it yet. Also I wish we could put some more useful info up there, but admittedly, I can't think of any. Stefan ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-08 20:05 ` Stefan Monnier @ 2004-03-09 12:11 ` Masatake YAMATO 2004-03-11 6:59 ` Masatake YAMATO 2004-03-11 16:27 ` Kim F. Storm 2 siblings, 0 replies; 26+ messages in thread From: Masatake YAMATO @ 2004-03-09 12:11 UTC (permalink / raw) Cc: emacs-devel > > +(defcustom hexl-follow-line t > > + "If non-nil then highlight the line address corresponding to point." > > + :type 'boolean > > + :group 'hexl) > > Any reason why you do not simply use hl-line-mode ? > Or, better yet, let the user select hl-line-mode if he wants it? Using hl-line-mode is good idea. However, hl-line-mode hides the highlighted character associated with the point in ascii area. I will put other face than highlight on the character associated with the point. > > +;; This function is derived from `ruler-mode-ruler' in ruler-mode.el. > > +(defun hexl-mode-ruler () > > + "Return a string ruler for hexl mode." > > + (when hexl-use-ruler > > + (let* ((fullw (ruler-mode-full-window-width)) > > + (w (window-width)) > > + (m (window-margins)) > > + (lsb (ruler-mode-left-scroll-bar-cols)) > > + (lf (ruler-mode-left-fringe-cols)) > > + (lm (or (car m) 0)) > > + (ruler (make-string fullw ?\ )) > > We really need to move this out of ruler-mode into frame.el or some other > "global" file. And to give it a clean interface so its implementation can > be improved later. Are You talking about each functions or generic ruler mechanism? About former, I have inspect ruler-mode.el again. (let* ((w (window-width)) (m (window-margins)) (lsb (ruler-mode-left-scroll-bar-cols)) (lf (ruler-mode-left-fringe-cols t)) (lm (or (car m) 0)) (rsb (ruler-mode-right-scroll-bar-cols)) (rf (ruler-mode-right-fringe-cols t)) (rm (or (cdr m) 0)) (ruler (make-string w ruler-mode-basic-graduation-char)) (i 0) (j (window-hscroll)) k c l1 l2 r2 r1 h1 h2 f1 f2) Next two functions should be in "global" file: ruler-mode-left-scroll-bar-cols and ruler-mode-left-fringe-cols. I think these should be renamed to scroll-bar-columns and fringe-columns. How do you think? > > + (o (+ lsb lf lm)) > > + (x o) > > + (highlight (mod (hexl-current-address) 16))) > > + ;; "87654321" > > + (do ((i 8 (1- i))) > > + ((= i 0)) > > + (aset ruler x (aref (number-to-string i) 0)) > > + (setq x (1+ x))) > > + ;; "87654321 " > > + (setq x (+ x 2)) ; ": " > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff" > > + (do* ((i 0 (1+ i)) > > + (c (format "%x" i) (format "%x" i))) > > + ((= i 16)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (if (= highlight i) > > + (put-text-property (- x 2) x > > + 'face 'highlight > > + ruler)) > > + (when (= (mod i 2) 1) > > + (aset ruler x ?\ ) > > + (setq x (1+ x)))) > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff " > > + (setq x (1+ x)) ; " " > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef" > > + (do* ((i 0 (1+ i)) > > + (c (format "%x" i) (format "%x" i))) > > + ((= i 16)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (if (= highlight i) > > + (put-text-property (1- x) x > > + 'face 'highlight > > + ruler))) > > + ruler))) > > Isn't this always building the exact same string, except for the size > (which really does not need to depend on the window's width), the leading > space (to align it), and the highlighting of the current column? > > Couldn't we just do (100% untested code, inspired from buff-menu.el): ... After modifying a bit, your code works fine. Masatake YAMATO ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-08 20:05 ` Stefan Monnier 2004-03-09 12:11 ` Masatake YAMATO @ 2004-03-11 6:59 ` Masatake YAMATO 2004-03-11 16:27 ` Kim F. Storm 2 siblings, 0 replies; 26+ messages in thread From: Masatake YAMATO @ 2004-03-11 6:59 UTC (permalink / raw) [resending] > > +(defcustom hexl-follow-line t > > + "If non-nil then highlight the line address corresponding to point." > > + :type 'boolean > > + :group 'hexl) > > Any reason why you do not simply use hl-line-mode ? > Or, better yet, let the user select hl-line-mode if he wants it? Using hl-line-mode is good idea. However, hl-line-mode hides the highlighted character associated with the point in ascii area. I will put other face than highlight on the character associated with the point. > > +;; This function is derived from `ruler-mode-ruler' in ruler-mode.el. > > +(defun hexl-mode-ruler () > > + "Return a string ruler for hexl mode." > > + (when hexl-use-ruler > > + (let* ((fullw (ruler-mode-full-window-width)) > > + (w (window-width)) > > + (m (window-margins)) > > + (lsb (ruler-mode-left-scroll-bar-cols)) > > + (lf (ruler-mode-left-fringe-cols)) > > + (lm (or (car m) 0)) > > + (ruler (make-string fullw ?\ )) > > We really need to move this out of ruler-mode into frame.el or some other > "global" file. And to give it a clean interface so its implementation can > be improved later. Are You talking about each functions or generic ruler mechanism? About former, I have inspect ruler-mode.el again. (let* ((w (window-width)) (m (window-margins)) (lsb (ruler-mode-left-scroll-bar-cols)) (lf (ruler-mode-left-fringe-cols t)) (lm (or (car m) 0)) (rsb (ruler-mode-right-scroll-bar-cols)) (rf (ruler-mode-right-fringe-cols t)) (rm (or (cdr m) 0)) (ruler (make-string w ruler-mode-basic-graduation-char)) (i 0) (j (window-hscroll)) k c l1 l2 r2 r1 h1 h2 f1 f2) Next two functions should be in "global" file: ruler-mode-left-scroll-bar-cols and ruler-mode-left-fringe-cols. I think these should be renamed to scroll-bar-columns and fringe-columns. How do you think? > > + (o (+ lsb lf lm)) > > + (x o) > > + (highlight (mod (hexl-current-address) 16))) > > + ;; "87654321" > > + (do ((i 8 (1- i))) > > + ((= i 0)) > > + (aset ruler x (aref (number-to-string i) 0)) > > + (setq x (1+ x))) > > + ;; "87654321 " > > + (setq x (+ x 2)) ; ": " > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff" > > + (do* ((i 0 (1+ i)) > > + (c (format "%x" i) (format "%x" i))) > > + ((= i 16)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (if (= highlight i) > > + (put-text-property (- x 2) x > > + 'face 'highlight > > + ruler)) > > + (when (= (mod i 2) 1) > > + (aset ruler x ?\ ) > > + (setq x (1+ x)))) > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff " > > + (setq x (1+ x)) ; " " > > + ;; "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef" > > + (do* ((i 0 (1+ i)) > > + (c (format "%x" i) (format "%x" i))) > > + ((= i 16)) > > + (aset ruler x (aref c 0)) > > + (setq x (1+ x)) > > + (if (= highlight i) > > + (put-text-property (1- x) x > > + 'face 'highlight > > + ruler))) > > + ruler))) > > Isn't this always building the exact same string, except for the size > (which really does not need to depend on the window's width), the leading > space (to align it), and the highlighting of the current column? > > Couldn't we just do (100% untested code, inspired from buff-menu.el): ... After modifying a bit, your code works fine. Masatake YAMATO ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-08 20:05 ` Stefan Monnier 2004-03-09 12:11 ` Masatake YAMATO 2004-03-11 6:59 ` Masatake YAMATO @ 2004-03-11 16:27 ` Kim F. Storm 2004-03-11 17:43 ` Stefan Monnier 2 siblings, 1 reply; 26+ messages in thread From: Kim F. Storm @ 2004-03-11 16:27 UTC (permalink / raw) Cc: Masatake YAMATO, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: > > > +;; This function is derived from `ruler-mode-ruler' in ruler-mode.el. > > +(defun hexl-mode-ruler () > > + "Return a string ruler for hexl mode." > > + (when hexl-use-ruler > > + (let* ((fullw (ruler-mode-full-window-width)) > > + (w (window-width)) > > + (m (window-margins)) > > + (lsb (ruler-mode-left-scroll-bar-cols)) > > + (lf (ruler-mode-left-fringe-cols)) > > + (lm (or (car m) 0)) > > + (ruler (make-string fullw ?\ )) > > We really need to move this out of ruler-mode into frame.el or some other > "global" file. And to give it a clean interface so its implementation can > be improved later. You can drop all of that ruler-mode- stuff if you use the advanced pixel-alignment form of :align-to (see xdisp.c around line 17990): (let ((s " 87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") (pos 0)) ;; Turn spaces in the header into stretch specs so they work ;; regardless of the header-line face. (while (string-match "[ \t]+" s pos) (setq pos (match-end 0)) (put-text-property (match-beginning 0) pos 'display ;; Assume fixed-size chars `(space :align-to (+ (scroll-bar . left) left-fringe left-margin ,(1- pos))) s)) ;; Highlight the current column. (put-text-property (+ 11 (/ (* 5 highlight) 2)) (+ 13 (/ (* 5 highlight) 2)) 'face 'highlight s)) > Note that the use of the display property also allows us to deal with > fractional sizes, although lsb and lf don't take advantage of it yet. The above code snippet does exact pixel alignment ! > Also I wish we could put some more useful info up there, but admittedly, > I can't think of any. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-11 16:27 ` Kim F. Storm @ 2004-03-11 17:43 ` Stefan Monnier 2004-03-11 23:56 ` Kim F. Storm 2004-03-15 4:55 ` Richard Stallman 0 siblings, 2 replies; 26+ messages in thread From: Stefan Monnier @ 2004-03-11 17:43 UTC (permalink / raw) Cc: Masatake YAMATO, emacs-devel > You can drop all of that ruler-mode- stuff if you use the advanced > pixel-alignment form of :align-to (see xdisp.c around line 17990): Hey neat. When was this added? > (let ((s " 87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") > (pos 0)) > ;; Turn spaces in the header into stretch specs so they work > ;; regardless of the header-line face. > (while (string-match "[ \t]+" s pos) > (setq pos (match-end 0)) > (put-text-property (match-beginning 0) pos 'display > ;; Assume fixed-size chars > `(space :align-to (+ (scroll-bar . left) > left-fringe left-margin > ,(1- pos))) > s)) Note that if there's no margin (i.e. 99% of the time) this will not align things properly on a text terminal. This is the reason why I do a `make-string' for the leading space: the size of the string is used for alignment in text-terminals while the `display' prop is used otherwise. Of course, the text-terminal display engine should ideally be improved to understand :align-to and such things, but I won't be the one to implement it. Also, how about adding a `text-start' special case which would stand for (+ (scroll-bar . left) left-fringe left-margin) so that we don't have to remember all the possible display elements and so that when we decide to add yet another display element we won't have to update the code. Stefan ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-11 17:43 ` Stefan Monnier @ 2004-03-11 23:56 ` Kim F. Storm 2004-03-12 6:05 ` Masatake YAMATO 2004-03-15 4:55 ` Richard Stallman 1 sibling, 1 reply; 26+ messages in thread From: Kim F. Storm @ 2004-03-11 23:56 UTC (permalink / raw) Cc: Masatake YAMATO, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: > > You can drop all of that ruler-mode- stuff if you use the advanced > > pixel-alignment form of :align-to (see xdisp.c around line 17990): > > Hey neat. When was this added? > > > (let ((s " 87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") > > (pos 0)) > > ;; Turn spaces in the header into stretch specs so they work > > ;; regardless of the header-line face. > > (while (string-match "[ \t]+" s pos) > > (setq pos (match-end 0)) > > (put-text-property (match-beginning 0) pos 'display > > ;; Assume fixed-size chars > > `(space :align-to (+ (scroll-bar . left) > > left-fringe left-margin > > ,(1- pos))) > > s)) > > Note that if there's no margin (i.e. 99% of the time) this will not align > things properly on a text terminal. This is the reason why I do > a `make-string' for the leading space: the size of the string is used > for alignment in text-terminals while the `display' prop is used otherwise. Clever! I didn't consider that. > > Of course, the text-terminal display engine should ideally be improved to > understand :align-to and such things, but I won't be the one to implement it. I can give it a try. > > Also, how about adding a `text-start' special case which would stand for > (+ (scroll-bar . left) left-fringe left-margin) so that we don't have to > remember all the possible display elements and so that when we decide to > add yet another display element we won't have to update the code. That's a good idea. I'll do that. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-11 23:56 ` Kim F. Storm @ 2004-03-12 6:05 ` Masatake YAMATO 2004-03-12 21:24 ` Stefan Monnier 0 siblings, 1 reply; 26+ messages in thread From: Masatake YAMATO @ 2004-03-12 6:05 UTC (permalink / raw) Based on Stefan and Kim's suggestions, I have revised the patch. I've moved the essential functions(`scroll-bar-columns' and `fringe-columns') in ruler-mode.el to frame.el and fringe.el and use new functions in ruler-mode.el and hexl.el. Index: lisp/ruler-mode.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/ruler-mode.el,v retrieving revision 1.17 diff -u -r1.17 ruler-mode.el --- lisp/ruler-mode.el 20 Oct 2003 23:27:52 -0000 1.17 +++ lisp/ruler-mode.el 12 Mar 2004 06:01:27 -0000 @@ -107,7 +107,9 @@ \f ;;; Code: (eval-when-compile - (require 'wid-edit)) + (require 'wid-edit) + (require 'frame) + (require 'fringe)) (defgroup ruler-mode nil "Display a ruler in the header line." @@ -298,42 +300,21 @@ "Return the width, measured in columns, of the left fringe area. If optional argument REAL is non-nil, return a real floating point number instead of a rounded integer value." - (funcall (if real '/ 'ceiling) - (or (car (window-fringes)) 0) - (float (frame-char-width)))) + (fringe-columns 'left real)) (defsubst ruler-mode-right-fringe-cols (&optional real) "Return the width, measured in columns, of the right fringe area. If optional argument REAL is non-nil, return a real floating point number instead of a rounded integer value." - (funcall (if real '/ 'ceiling) - (or (nth 1 (window-fringes)) 0) - (float (frame-char-width)))) - -(defun ruler-mode-scroll-bar-cols (side) - "Return the width, measured in columns, of the vertical scrollbar on SIDE. -SIDE must be the symbol `left' or `right'." - (let* ((wsb (window-scroll-bars)) - (vtype (nth 2 wsb)) - (cols (nth 1 wsb))) - (cond - ((not (memq side '(left right))) - (error "`left' or `right' expected instead of %S" side)) - ((and (eq vtype side) cols)) - ((eq (frame-parameter nil 'vertical-scroll-bars) side) - ;; nil means it's a non-toolkit scroll bar, and its width in - ;; columns is 14 pixels rounded up. - (ceiling (or (frame-parameter nil 'scroll-bar-width) 14) - (frame-char-width))) - (0)))) + (fringe-columns 'right real)) (defmacro ruler-mode-right-scroll-bar-cols () "Return the width, measured in columns, of the right vertical scrollbar." - '(ruler-mode-scroll-bar-cols 'right)) + '(scroll-bar-columns 'right)) (defmacro ruler-mode-left-scroll-bar-cols () "Return the width, measured in columns, of the left vertical scrollbar." - '(ruler-mode-scroll-bar-cols 'left)) + '(scroll-bar-columns 'left)) (defsubst ruler-mode-full-window-width () "Return the full width of the selected window." Index: lisp/hexl.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/hexl.el,v retrieving revision 1.85 diff -u -r1.85 hexl.el --- lisp/hexl.el 9 Mar 2004 01:25:27 -0000 1.85 +++ lisp/hexl.el 12 Mar 2004 06:01:27 -0000 @@ -42,7 +42,11 @@ ;;; Code: -(require 'eldoc) +(eval-when-compile + (require 'frame) + (require 'fringe) + (require 'eldoc) + (require 'hl-line)) ;; ;; vars here @@ -78,6 +82,33 @@ :group 'hexl :version "20.3") +(defcustom hexl-follow-line t + "If non-nil then turn `hl-line-mode' on." + :type 'boolean + :group 'hexl) + +(defcustom hexl-use-ruler t + "If non-nil then show the ruler for hexl mode." + :type 'boolean + :group 'hexl) + +(defface hexl-address-area + '((t (:inherit header-line))) + "Face used in address are of hexl-mode buffer." + :group 'hexl) + +(defface hexl-ascii-area + '((t (:inherit header-line))) + "Face used in ascii are of hexl-mode buffer." + :group 'hexl) + +(defface hexl-ascii-overlay + ;; Definition borrowed from vcursor.el. + '((((class color)) (:foreground "blue" :background "cyan" :underline t)) + (t (:inverse-video t :underline t))) + "Face for the overlay in ascii area of hexl mode buffer." + :group 'hexl) + (defvar hexl-max-address 0 "Maximum offset into hexl buffer.") @@ -89,11 +120,16 @@ (defvar hexl-mode-old-isearch-search-fun-function) (defvar hexl-mode-old-require-final-newline) (defvar hexl-mode-old-syntax-table) +(defvar hexl-mode-old-header-line-format) (defvar hexl-ascii-overlay nil "Overlay used to highlight ASCII element corresponding to current point.") (make-variable-buffer-local 'hexl-ascii-overlay) +(defconst hexl-mode-header-line-format + '(:eval (hexl-mode-ruler)) + "`header-line-format' used in hexl mode.") + ;; routines (put 'hexl-mode 'mode-class 'special) @@ -245,7 +281,11 @@ (eldoc-remove-command "hexl-save-buffer" "hexl-current-address") - (if hexl-follow-ascii (hexl-follow-ascii 1))) + (set (make-local-variable 'hexl-mode-old-header-line-format) header-line-format) + (setq header-line-format hexl-mode-header-line-format) + + (if hexl-follow-ascii (hexl-follow-ascii 1)) + (if hexl-follow-line (hexl-follow-line 1))) (run-hooks 'hexl-mode-hook)) @@ -341,6 +381,7 @@ (use-local-map hexl-mode-old-local-map) (set-syntax-table hexl-mode-old-syntax-table) (setq major-mode hexl-mode-old-major-mode) + (setq header-line-format hexl-mode-old-header-line-format) (force-mode-line-update)) (defun hexl-maybe-dehexlify-buffer () @@ -648,6 +689,15 @@ (apply 'call-process-region (point-min) (point-max) (expand-file-name hexl-program exec-directory) t t nil (split-string hexl-options)) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "^[0-9a-f]+:" nil t) + (put-text-property (match-beginning 0) (match-end 0) + 'font-lock-face 'hexl-address-area)) + (goto-char (point-min)) + (while (re-search-forward " \\(.+$\\)" nil t) + (put-text-property (match-beginning 1) (match-end 1) + 'font-lock-face 'hexl-ascii-area))) (if (> (point) (hexl-address-to-marker hexl-max-address)) (hexl-goto-address hexl-max-address)))) @@ -854,7 +904,7 @@ (progn (setq hexl-ascii-overlay (make-overlay 1 1) hexl-follow-ascii t) - (overlay-put hexl-ascii-overlay 'face 'highlight) + (overlay-put hexl-ascii-overlay 'face 'hexl-ascii-overlay) (add-hook 'post-command-hook 'hexl-follow-ascii-find nil t))) ;; turn it off (if hexl-ascii-overlay @@ -865,6 +915,20 @@ (remove-hook 'post-command-hook 'hexl-follow-ascii-find t) ))))) +(defun hexl-follow-line (&optional arg) + "Toggle following line address in Hexl buffers. +With prefix ARG, turn on following if and only if ARG is positive. +When following is enabled, the line address corresponding to the +element under the point is highlighted. +Customize the variable `hexl-follow-line' to disable this feature." + (interactive "P") + (let ((on-p (if arg + (> (prefix-numeric-value arg) 0) + (not hexl-follow-line)))) + + (setq hexl-follow-line on-p) + (hl-line-mode (if on-p 1 -1)))) + (defun hexl-follow-ascii-find () "Find and highlight the ASCII element corresponding to current point." (let ((pos (+ 51 @@ -872,6 +936,38 @@ (mod (hexl-current-address) 16)))) (move-overlay hexl-ascii-overlay pos (1+ pos)) )) + +(defun hexl-mode-ruler () + "Return a string ruler for hexl mode." + (when hexl-use-ruler + (let* ((highlight (mod (hexl-current-address) 16)) + (s "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") + (pos 0) + (spaces (+ (scroll-bar-columns 'left) + (fringe-columns 'left) + (or (car (window-margins)) 0)))) + (set-text-properties 0 (length s) nil s) + ;; Turn spaces in the header into stretch specs so they work + ;; regardless of the header-line face. + (while (string-match "[ \t]+" s pos) + (setq pos (match-end 0)) + (put-text-property (match-beginning 0) pos 'display + ;; Assume fixed-size chars + `(space :align-to (+ (scroll-bar . left) + left-fringe left-margin + ,pos)) + s)) + ;; Highlight the current column. + (put-text-property (+ 10 (/ (* 5 highlight) 2)) + (+ 12 (/ (* 5 highlight) 2)) + 'face 'highlight s) + ;; Highlight the current ascii column + (put-text-property (+ 12 39 highlight) (+ 12 40 highlight) + 'face 'highlight s) + ;; Add the leading space. + (concat (propertize (make-string (floor spaces) ? ) + 'display `(space :width ,spaces)) + s)))) ;; startup stuff. Index: lisp/fringe.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/fringe.el,v retrieving revision 1.10 diff -u -r1.10 fringe.el --- lisp/fringe.el 8 Feb 2004 23:33:16 -0000 1.10 +++ lisp/fringe.el 12 Mar 2004 06:01:27 -0000 @@ -218,6 +218,17 @@ (list (cons 'left-fringe (if (consp mode) (car mode) mode)) (cons 'right-fringe (if (consp mode) (cdr mode) mode))))) +(defsubst fringe-columns (side &optional real) + "Return the width, measured in columns, of the fringe area on SIDE. +If optional argument REAL is non-nil, return a real floating point +number instead of a rounded integer value. +SIDE must be the symbol `left' or `right'." + (funcall (if real '/ 'ceiling) + (or (funcall (if (eq side 'left) 'car 'cadr) + (window-fringes)) + 0) + (float (frame-char-width)))) + (provide 'fringe) ;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d Index: lisp/frame.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/frame.el,v retrieving revision 1.206 diff -u -r1.206 frame.el --- lisp/frame.el 29 Dec 2003 19:17:24 -0000 1.206 +++ lisp/frame.el 12 Mar 2004 06:01:27 -0000 @@ -1215,6 +1215,22 @@ :group 'scrolling) (defvaralias 'automatic-hscrolling 'auto-hscroll-mode) +(defun scroll-bar-columns (side) + "Return the width, measured in columns, of the vertical scrollbar on SIDE. +SIDE must be the symbol `left' or `right'." + (let* ((wsb (window-scroll-bars)) + (vtype (nth 2 wsb)) + (cols (nth 1 wsb))) + (cond + ((not (memq side '(left right))) + (error "`left' or `right' expected instead of %S" side)) + ((and (eq vtype side) cols)) + ((eq (frame-parameter nil 'vertical-scroll-bars) side) + ;; nil means it's a non-toolkit scroll bar, and its width in + ;; columns is 14 pixels rounded up. + (ceiling (or (frame-parameter nil 'scroll-bar-width) 14) + (frame-char-width))) + (0)))) \f ;; Blinking cursor ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-12 6:05 ` Masatake YAMATO @ 2004-03-12 21:24 ` Stefan Monnier 2004-03-13 18:13 ` Masatake YAMATO 0 siblings, 1 reply; 26+ messages in thread From: Stefan Monnier @ 2004-03-12 21:24 UTC (permalink / raw) Cc: emacs-devel > Based on Stefan and Kim's suggestions, I have revised the patch. > I've moved the essential functions(`scroll-bar-columns' and `fringe-columns') > in ruler-mode.el to frame.el and fringe.el and use new functions in > ruler-mode.el and hexl.el. Comments: > +(defcustom hexl-use-ruler t > + "If non-nil then show the ruler for hexl mode." > + :type 'boolean > + :group 'hexl) I'd call it hexl-use-header-line, but maybe that's just me. > +(defface hexl-ascii-overlay > + ;; Definition borrowed from vcursor.el. > + '((((class color)) (:foreground "blue" :background "cyan" :underline t)) > + (t (:inverse-video t :underline t))) > + "Face for the overlay in ascii area of hexl mode buffer." > + :group 'hexl) I'd call it `hexl-ascii-cursor' since the user might not know it's an overlay (and it could actually be implemented as a text-property tomorrow). Also I'd stick to just `:inverse-video' as much as possible or more specifically I'd try to make it look just like the normal cursor (since there's conceptually no difference between the two). > +(defcustom hexl-follow-line t > + "If non-nil then turn `hl-line-mode' on." > + :type 'boolean > + :group 'hexl) [...] > + (if hexl-follow-line (hexl-follow-line 1))) > (run-hooks 'hexl-mode-hook)) [...] > +(defun hexl-follow-line (&optional arg) > + "Toggle following line address in Hexl buffers. > +With prefix ARG, turn on following if and only if ARG is positive. > +When following is enabled, the line address corresponding to the > +element under the point is highlighted. > +Customize the variable `hexl-follow-line' to disable this feature." > + (interactive "P") > + (let ((on-p (if arg > + (> (prefix-numeric-value arg) 0) > + (not hexl-follow-line)))) > + > + (setq hexl-follow-line on-p) > + (hl-line-mode (if on-p 1 -1)))) You could define this with `define-minor-mode'. But I'd recommend to go even further and replace the above with: (defcustom hexl-mode-hook () "Blabla" :type 'hook :options '(hexl-follow-line)) (defun hexl-follow-line () (hl-line-mode 1)) -- Stefan ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-12 21:24 ` Stefan Monnier @ 2004-03-13 18:13 ` Masatake YAMATO 2004-03-15 7:37 ` Masatake YAMATO 0 siblings, 1 reply; 26+ messages in thread From: Masatake YAMATO @ 2004-03-13 18:13 UTC (permalink / raw) Cc: emacs-devel > > +(defcustom hexl-use-ruler t > > + "If non-nil then show the ruler for hexl mode." > > + :type 'boolean > > + :group 'hexl) > > I'd call it hexl-use-header-line, but maybe that's just me. I will use hexl-use-ruler. After thinking I have defined `ruler-mode-ruler-function' in ruler-mode.el. With the variable, you can define a mode specific ruler. I have used `ruler-mode-ruler-function' in hexl-mode.el. As the result I dont have to create a backup of header format; ruler-mode does it. > > +(defface hexl-ascii-overlay > > + ;; Definition borrowed from vcursor.el. > > + '((((class color)) (:foreground "blue" :background "cyan" :underline t)) > > + (t (:inverse-video t :underline t))) > > + "Face for the overlay in ascii area of hexl mode buffer." > > + :group 'hexl) > > I'd call it `hexl-ascii-cursor' since the user might not know it's an > overlay (and it could actually be implemented as a text-property tomorrow). > Also I'd stick to just `:inverse-video' as much as possible or more > specifically I'd try to make it look just like the normal cursor (since > there's conceptually no difference between the two). You are right. I have changed the code as you wrote. > You could define this with `define-minor-mode'. > But I'd recommend to go even further and replace the above with: > > (defcustom hexl-mode-hook () > "Blabla" > :type 'hook > :options '(hexl-follow-line)) > > (defun hexl-follow-line () > (hl-line-mode 1)) Smart. I use this technique both in follow-line and ruler. I've turned hl-line and ruler on in default. Summary of changes since last review: - scroll-bar-columns is moved from frame.el to scroll-bar.el, and - ruler-mode-current-column-face is used in hexl's ruler, and - ruler-mode-ruler-function is introduced in ruler-mode.el. Regards, Masatake YAMATO Index: lisp/scroll-bar.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/scroll-bar.el,v retrieving revision 1.48 diff -u -r1.48 scroll-bar.el --- lisp/scroll-bar.el 20 Sep 2003 23:33:37 -0000 1.48 +++ lisp/scroll-bar.el 13 Mar 2004 17:58:41 -0000 @@ -54,6 +54,23 @@ ;; with a large scroll bar portion can easily overflow a lisp int. (truncate (/ (* (float (car num-denom)) whole) (cdr num-denom)))) +(defun scroll-bar-columns (side) + "Return the width, measured in columns, of the vertical scrollbar on SIDE. +SIDE must be the symbol `left' or `right'." + (let* ((wsb (window-scroll-bars)) + (vtype (nth 2 wsb)) + (cols (nth 1 wsb))) + (cond + ((not (memq side '(left right))) + (error "`left' or `right' expected instead of %S" side)) + ((and (eq vtype side) cols)) + ((eq (frame-parameter nil 'vertical-scroll-bars) side) + ;; nil means it's a non-toolkit scroll bar, and its width in + ;; columns is 14 pixels rounded up. + (ceiling (or (frame-parameter nil 'scroll-bar-width) 14) + (frame-char-width))) + (0)))) + \f ;;;; Helpful functions for enabling and disabling scroll bars. Index: lisp/ruler-mode.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/ruler-mode.el,v retrieving revision 1.17 diff -u -r1.17 ruler-mode.el --- lisp/ruler-mode.el 20 Oct 2003 23:27:52 -0000 1.17 +++ lisp/ruler-mode.el 13 Mar 2004 17:58:42 -0000 @@ -94,6 +94,9 @@ ;; WARNING: To keep ruler graduations aligned on text columns it is ;; important to use the same font family and size for ruler and text ;; areas. +;; +;; You can override the ruler format by defining an appropriate +;; function as the buffer-local value of `ruler-mode-ruler-function'. ;; Installation ;; @@ -108,6 +111,8 @@ ;;; Code: (eval-when-compile (require 'wid-edit)) +(require 'scroll-bar) +(require 'fringe) (defgroup ruler-mode nil "Display a ruler in the header line." @@ -298,42 +303,21 @@ "Return the width, measured in columns, of the left fringe area. If optional argument REAL is non-nil, return a real floating point number instead of a rounded integer value." - (funcall (if real '/ 'ceiling) - (or (car (window-fringes)) 0) - (float (frame-char-width)))) + (fringe-columns 'left real)) (defsubst ruler-mode-right-fringe-cols (&optional real) "Return the width, measured in columns, of the right fringe area. If optional argument REAL is non-nil, return a real floating point number instead of a rounded integer value." - (funcall (if real '/ 'ceiling) - (or (nth 1 (window-fringes)) 0) - (float (frame-char-width)))) - -(defun ruler-mode-scroll-bar-cols (side) - "Return the width, measured in columns, of the vertical scrollbar on SIDE. -SIDE must be the symbol `left' or `right'." - (let* ((wsb (window-scroll-bars)) - (vtype (nth 2 wsb)) - (cols (nth 1 wsb))) - (cond - ((not (memq side '(left right))) - (error "`left' or `right' expected instead of %S" side)) - ((and (eq vtype side) cols)) - ((eq (frame-parameter nil 'vertical-scroll-bars) side) - ;; nil means it's a non-toolkit scroll bar, and its width in - ;; columns is 14 pixels rounded up. - (ceiling (or (frame-parameter nil 'scroll-bar-width) 14) - (frame-char-width))) - (0)))) + (fringe-columns 'right real)) (defmacro ruler-mode-right-scroll-bar-cols () "Return the width, measured in columns, of the right vertical scrollbar." - '(ruler-mode-scroll-bar-cols 'right)) + '(scroll-bar-columns 'right)) (defmacro ruler-mode-left-scroll-bar-cols () "Return the width, measured in columns, of the left vertical scrollbar." - '(ruler-mode-scroll-bar-cols 'left)) + '(scroll-bar-columns 'left)) (defsubst ruler-mode-full-window-width () "Return the full width of the selected window." @@ -568,9 +552,17 @@ "Hold previous value of `header-line-format'.") (make-variable-buffer-local 'ruler-mode-header-line-format-old) +(defvar ruler-mode-ruler-function nil + "If non-nil, function to call to return ruler string. +This variable is expected to be made buffer-local by modes.") + (defconst ruler-mode-header-line-format - '(:eval (ruler-mode-ruler)) - "`header-line-format' used in ruler mode.") + '(:eval (funcall (if ruler-mode-ruler-function + ruler-mode-ruler-function + 'ruler-mode-ruler))) + "`header-line-format' used in ruler mode. +If the non-nil value for ruler-mode-ruler-function is given, use it. +Else use `ruler-mode-ruler' is used as default value.") ;;;###autoload (define-minor-mode ruler-mode Index: lisp/hexl.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/hexl.el,v retrieving revision 1.85 diff -u -r1.85 hexl.el --- lisp/hexl.el 9 Mar 2004 01:25:27 -0000 1.85 +++ lisp/hexl.el 13 Mar 2004 17:58:42 -0000 @@ -43,6 +43,11 @@ ;;; Code: (require 'eldoc) +(require 'ruler-mode) +(require 'frame) +(require 'fringe) +(eval-when-compile + (require 'hl-line)) ;; ;; vars here @@ -78,6 +83,27 @@ :group 'hexl :version "20.3") +(defcustom hexl-mode-hook '(hexl-follow-line hexl-activate-ruler) + "Normal hook run when entering Hexl mode." + :type 'hook + :options '(hexl-follow-line hexl-activate-ruler)) + +(defface hexl-address-area + '((t (:inherit header-line))) + "Face used in address are of hexl-mode buffer." + :group 'hexl) + +(defface hexl-ascii-area + '((t (:inherit header-line))) + "Face used in ascii are of hexl-mode buffer." + :group 'hexl) + +(defface hexl-ascii-cursor + '((((class color)) (:foreground "blue" :background "cyan" :underline t)) + (t (:inverse-video t))) + "Face for the cursor in ascii area of hexl mode buffer." + :group 'hexl) + (defvar hexl-max-address 0 "Maximum offset into hexl buffer.") @@ -245,6 +271,10 @@ (eldoc-remove-command "hexl-save-buffer" "hexl-current-address") + ;; Set a callback function for ruler. + (set (make-local-variable 'ruler-mode-ruler-function) + 'hexl-mode-ruler) + (if hexl-follow-ascii (hexl-follow-ascii 1))) (run-hooks 'hexl-mode-hook)) @@ -648,6 +678,15 @@ (apply 'call-process-region (point-min) (point-max) (expand-file-name hexl-program exec-directory) t t nil (split-string hexl-options)) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "^[0-9a-f]+:" nil t) + (put-text-property (match-beginning 0) (match-end 0) + 'font-lock-face 'hexl-address-area)) + (goto-char (point-min)) + (while (re-search-forward " \\(.+$\\)" nil t) + (put-text-property (match-beginning 1) (match-end 1) + 'font-lock-face 'hexl-ascii-area))) (if (> (point) (hexl-address-to-marker hexl-max-address)) (hexl-goto-address hexl-max-address)))) @@ -865,6 +904,14 @@ (remove-hook 'post-command-hook 'hexl-follow-ascii-find t) ))))) +(defun hexl-activate-ruler () + "Activate `ruler-mode'" + (ruler-mode 1)) + +(defun hexl-follow-line () + "Activate `hl-line-mode'" + (hl-line-mode 1)) + (defun hexl-follow-ascii-find () "Find and highlight the ASCII element corresponding to current point." (let ((pos (+ 51 @@ -872,6 +919,37 @@ (mod (hexl-current-address) 16)))) (move-overlay hexl-ascii-overlay pos (1+ pos)) )) + +(defun hexl-mode-ruler () + "Return a string ruler for hexl mode." + (let* ((highlight (mod (hexl-current-address) 16)) + (s "87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef") + (pos 0) + (spaces (+ (scroll-bar-columns 'left) + (fringe-columns 'left) + (or (car (window-margins)) 0)))) + (set-text-properties 0 (length s) nil s) + ;; Turn spaces in the header into stretch specs so they work + ;; regardless of the header-line face. + (while (string-match "[ \t]+" s pos) + (setq pos (match-end 0)) + (put-text-property (match-beginning 0) pos 'display + ;; Assume fixed-size chars + `(space :align-to (+ (scroll-bar . left) + left-fringe left-margin + ,pos)) + s)) + ;; Highlight the current column. + (put-text-property (+ 10 (/ (* 5 highlight) 2)) + (+ 12 (/ (* 5 highlight) 2)) + 'face 'ruler-mode-current-column-face s) + ;; Highlight the current ascii column + (put-text-property (+ 12 39 highlight) (+ 12 40 highlight) + 'face 'ruler-mode-current-column-face s) + ;; Add the leading space. + (concat (propertize (make-string (floor spaces) ? ) + 'display `(space :width ,spaces)) + s))) ;; startup stuff. Index: lisp/fringe.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/fringe.el,v retrieving revision 1.10 diff -u -r1.10 fringe.el --- lisp/fringe.el 8 Feb 2004 23:33:16 -0000 1.10 +++ lisp/fringe.el 13 Mar 2004 17:58:42 -0000 @@ -218,6 +218,17 @@ (list (cons 'left-fringe (if (consp mode) (car mode) mode)) (cons 'right-fringe (if (consp mode) (cdr mode) mode))))) +(defsubst fringe-columns (side &optional real) + "Return the width, measured in columns, of the fringe area on SIDE. +If optional argument REAL is non-nil, return a real floating point +number instead of a rounded integer value. +SIDE must be the symbol `left' or `right'." + (funcall (if real '/ 'ceiling) + (or (funcall (if (eq side 'left) 'car 'cadr) + (window-fringes)) + 0) + (float (frame-char-width)))) + (provide 'fringe) ;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-13 18:13 ` Masatake YAMATO @ 2004-03-15 7:37 ` Masatake YAMATO 0 siblings, 0 replies; 26+ messages in thread From: Masatake YAMATO @ 2004-03-15 7:37 UTC (permalink / raw) I've installed "ruler support in hexl mode" code. I've changed a bit from the last posted patch; I'm using hl-line but the whole line is not highlighted. Only address prefix area is highlighted. See `hl-line-range-function' in hl-line.el. Thank the reviewers. Masatake YAMATO ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-11 17:43 ` Stefan Monnier 2004-03-11 23:56 ` Kim F. Storm @ 2004-03-15 4:55 ` Richard Stallman 2004-03-15 11:00 ` Kim F. Storm 1 sibling, 1 reply; 26+ messages in thread From: Richard Stallman @ 2004-03-15 4:55 UTC (permalink / raw) Cc: jet, emacs-devel, storm Note that if there's no margin (i.e. 99% of the time) this will not align things properly on a text terminal. This is the reason why I do a `make-string' for the leading space: the size of the string is used for alignment in text-terminals while the `display' prop is used otherwise. Should this be documented in the Lisp manual along with the :align-to feature? Also, how about adding a `text-start' special case which would stand for (+ (scroll-bar . left) left-fringe left-margin) so that we don't have to Could you be more specific about the change you have in mind? ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-15 4:55 ` Richard Stallman @ 2004-03-15 11:00 ` Kim F. Storm 2004-03-16 19:02 ` Richard Stallman 0 siblings, 1 reply; 26+ messages in thread From: Kim F. Storm @ 2004-03-15 11:00 UTC (permalink / raw) Cc: jet, Stefan Monnier, emacs-devel Richard Stallman <rms@gnu.org> writes: > Note that if there's no margin (i.e. 99% of the time) this will not align > things properly on a text terminal. This is the reason why I do > a `make-string' for the leading space: the size of the string is used > for alignment in text-terminals while the `display' prop is used otherwise. > > Should this be documented in the Lisp manual along with the :align-to > feature? I think it would be better do add :align-to support to the text terminal. It is on my to-do list to add that. > > Also, how about adding a `text-start' special case which would stand for > (+ (scroll-bar . left) left-fringe left-margin) so that we don't have to > > Could you be more specific about the change you have in mind? > > It should be possible to say :align-to 'text-left to have text in the header line (or mode line) exactly aligned to the left edge of the text area of the window. That is possible with the expression given above, but it is the wrong approach for that purpose. I will work on it. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-15 11:00 ` Kim F. Storm @ 2004-03-16 19:02 ` Richard Stallman 2004-03-17 0:08 ` Kim F. Storm 0 siblings, 1 reply; 26+ messages in thread From: Richard Stallman @ 2004-03-16 19:02 UTC (permalink / raw) Cc: jet, monnier, emacs-devel > Should this be documented in the Lisp manual along with the :align-to > feature? I think it would be better do add :align-to support to the text terminal. It is on my to-do list to add that. That would be a step forward. However, I don't know how soon you will have time to work on this. If it won't be soon, maybe we should document the current situation in the manual now. It should be possible to say :align-to 'text-left to have text in the header line (or mode line) exactly aligned to the left edge of the text area of the window. Ok, that feature makes sense. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-16 19:02 ` Richard Stallman @ 2004-03-17 0:08 ` Kim F. Storm 2004-03-17 0:42 ` Stefan Monnier ` (2 more replies) 0 siblings, 3 replies; 26+ messages in thread From: Kim F. Storm @ 2004-03-17 0:08 UTC (permalink / raw) Cc: jet, monnier, emacs-devel Richard Stallman <rms@gnu.org> writes: > > Should this be documented in the Lisp manual along with the :align-to > > feature? > > I think it would be better do add :align-to support to the text terminal. > It is on my to-do list to add that. > > That would be a step forward. However, I don't know how soon > you will have time to work on this. If it won't be soon, maybe > we should document the current situation in the manual now. I can work on it quite soon. > > It should be possible to say :align-to 'text-left to have text in the > header line (or mode line) exactly aligned to the left edge of the text > area of the window. I have been thinking about a different (and IMHO much better) approach for :align-to on header line and mode line: Currently, :align-to on normal text lines are relative to the left text area margin, while for header and mode lines, :align-to is relative to the left edge of the window (outside fringes, scroll-bar, and display margin). My suggestion is that (by default) :align-to in header and mode lines should also be relative to the left edge of the text area, e.g. :align-to 0 would align exactly to the first column of the text area. The advantage of this approach is that we would then use the same values for alignment as in the text area, and consequently not require any special parameters for the "normal" case. If you want to align header or mode line to a specific "non-text" display element, use something like :align-to 'left-fringe :align-to '(+ left-margin 2) :align-to 'left-scroll-bar This seems much more logical than the current approach. The only real problem with this is that it isn't backwards compatible with the 21.1 behaviour. But I suppose there are not that many packages using :align-to in header line (yet). WDYT? -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-17 0:08 ` Kim F. Storm @ 2004-03-17 0:42 ` Stefan Monnier 2004-03-17 2:23 ` Kim F. Storm 2004-03-19 5:01 ` Richard Stallman 2 siblings, 0 replies; 26+ messages in thread From: Stefan Monnier @ 2004-03-17 0:42 UTC (permalink / raw) Cc: jet, rms, emacs-devel > My suggestion is that (by default) :align-to in header and mode lines > should also be relative to the left edge of the text area, > e.g. :align-to 0 would align exactly to the first column of the text > area. Sounds right to me, Stefan ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-17 0:08 ` Kim F. Storm 2004-03-17 0:42 ` Stefan Monnier @ 2004-03-17 2:23 ` Kim F. Storm 2004-03-19 5:01 ` Richard Stallman 2 siblings, 0 replies; 26+ messages in thread From: Kim F. Storm @ 2004-03-17 2:23 UTC (permalink / raw) Cc: jet, monnier, emacs-devel storm@cua.dk (Kim F. Storm) writes: > Richard Stallman <rms@gnu.org> writes: > > > > Should this be documented in the Lisp manual along with the :align-to > > > feature? > > > > I think it would be better do add :align-to support to the text terminal. > > It is on my to-do list to add that. > > > > That would be a step forward. However, I don't know how soon > > you will have time to work on this. If it won't be soon, maybe > > we should document the current situation in the manual now. > > I can work on it quite soon. I already have something which is working... Will commit later this week. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-17 0:08 ` Kim F. Storm 2004-03-17 0:42 ` Stefan Monnier 2004-03-17 2:23 ` Kim F. Storm @ 2004-03-19 5:01 ` Richard Stallman 2004-03-19 10:06 ` Kim F. Storm 2 siblings, 1 reply; 26+ messages in thread From: Richard Stallman @ 2004-03-19 5:01 UTC (permalink / raw) Cc: jet, monnier, emacs-devel My suggestion is that (by default) :align-to in header and mode lines should also be relative to the left edge of the text area, e.g. :align-to 0 would align exactly to the first column of the text area. certainly simpler. you cd use negative number if youreally want a pos before the text area. so no loss of function. sounds good. The only real problem with this is that it isn't backwards compatible with the 21.1 behaviour. But I suppose there are not that many packages using :align-to in header line (yet). exactly. please do it. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-19 5:01 ` Richard Stallman @ 2004-03-19 10:06 ` Kim F. Storm 2004-03-19 13:33 ` Kim F. Storm 0 siblings, 1 reply; 26+ messages in thread From: Kim F. Storm @ 2004-03-19 10:06 UTC (permalink / raw) Cc: jet, monnier, emacs-devel Richard Stallman <rms@gnu.org> writes: > My suggestion is that (by default) :align-to in header and mode lines > should also be relative to the left edge of the text area, > e.g. :align-to 0 would align exactly to the first column of the text > area. > > certainly simpler. you cd use negative number if youreally want > a pos before the text area. so no loss of function. sounds good. > please do it. Done. To clarify: With my fixes, the default position for header and mode lines (if no :align-to is used) is still the left edge of the window (mode lines certainly expect that). With :align-to N (N is a number, also negative) you offset from the left edge of the text area. With :align-to (+ left-margin N) you offset from the left edge of the left margin. This also works in normal text rows, so you can align normal text relative to the various window "decorations" (I'm not sure when that would be useful, but it works nevertheless). To center something above the left-margin, you can use :align-to (+ left-margin (0.5 . left-margin)) You can also align relative to the right edge of the text area, e.g. 10 character positions from the right margin is specified with: :align-to (- right 10) And it works on text terminals as well! I still need to write the necessary info in NEWS and display.texi. Will do so asap. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-19 10:06 ` Kim F. Storm @ 2004-03-19 13:33 ` Kim F. Storm 0 siblings, 0 replies; 26+ messages in thread From: Kim F. Storm @ 2004-03-19 13:33 UTC (permalink / raw) Cc: emacs-devel FYI, I have adapted hexl-mode-ruler to the new :align-to semantics. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-05 5:29 ruler support in hexl mode Masatake YAMATO 2004-03-08 20:05 ` Stefan Monnier @ 2004-03-08 21:00 ` Miles Bader 2004-03-11 14:41 ` Juanma Barranquero 1 sibling, 1 reply; 26+ messages in thread From: Miles Bader @ 2004-03-08 21:00 UTC (permalink / raw) Cc: emacs-devel On Fri, Mar 05, 2004 at 02:29:15PM +0900, Masatake YAMATO wrote: > +(defface hexl-address-area-face > +(defface hexl-ascii-area-face Please do not use a `-face' suffix for face names -- it's unnecessary and redundant (faces have their own namespace). These faces should be called just `hexl-address-area' and `hexl-ascii-area'. Thanks, -Miles -- `Life is a boundless sea of bitterness' ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-08 21:00 ` Miles Bader @ 2004-03-11 14:41 ` Juanma Barranquero 2004-03-17 3:59 ` Miles Bader 0 siblings, 1 reply; 26+ messages in thread From: Juanma Barranquero @ 2004-03-11 14:41 UTC (permalink / raw) On Mon, 8 Mar 2004 16:00:06 -0500 Miles Bader <miles@gnu.org> wrote: > Please do not use a `-face' suffix for face names -- it's unnecessary and > redundant (faces have their own namespace). These faces should be called > just `hexl-address-area' and `hexl-ascii-area'. A cursory look (find, really) on the lisp/ tree brings out 292 cases of faces named *-face (or, in some instances, *-face*). Time for a `make-obsolete-face' function? :) Juanma Buffer-menu-buffer-face Info-title-1-face Info-title-2-face Info-title-3-face Info-title-4-face antlr-font-lock-default-face antlr-font-lock-keyword-face antlr-font-lock-literal-face antlr-font-lock-ruledef-face antlr-font-lock-ruleref-face antlr-font-lock-syntax-face antlr-font-lock-tokendef-face antlr-font-lock-tokenref-face breakpoint-disabled-bitmap-face breakpoint-enabled-bitmap-face c-invalid-face calendar-today-face change-log-acknowledgement-face change-log-conditionals-face change-log-date-face change-log-email-face change-log-file-face change-log-function-face change-log-list-face change-log-name-face compare-windows-face cperl-array-face cperl-hash-face cperl-nonoverridable-face cua-global-mark-face cua-rectangle-face cua-rectangle-noselect-face custom-button-face custom-button-pressed-face custom-changed-face custom-comment-face custom-comment-tag-face custom-documentation-face custom-face-tag-face custom-group-tag-face custom-group-tag-face-1 custom-invalid-face custom-modified-face custom-rogue-face custom-saved-face custom-set-face custom-state-face custom-variable-button-face custom-variable-tag-face cvs-filename-face cvs-handled-face cvs-header-face cvs-marked-face cvs-msg-face cvs-need-action-face cvs-unknown-face diary-button-face diary-face diff-added-face diff-changed-face diff-context-face diff-file-header-face diff-function-face diff-header-face diff-hunk-header-face diff-index-face diff-nonexistent-face diff-removed-face ebrowse-default-face ebrowse-file-name-face ebrowse-member-attribute-face ebrowse-member-class-face ebrowse-progress-face ebrowse-root-class-face ebrowse-tree-mark-face ediff-current-diff-face-A ediff-current-diff-face-Ancestor ediff-current-diff-face-B ediff-current-diff-face-C ediff-even-diff-face-A ediff-even-diff-face-Ancestor ediff-even-diff-face-B ediff-even-diff-face-C ediff-fine-diff-face-A ediff-fine-diff-face-Ancestor ediff-fine-diff-face-B ediff-fine-diff-face-C ediff-odd-diff-face-A ediff-odd-diff-face-Ancestor ediff-odd-diff-face-B ediff-odd-diff-face-C eshell-ls-archive-face eshell-ls-backup-face eshell-ls-clutter-face eshell-ls-directory-face eshell-ls-executable-face eshell-ls-missing-face eshell-ls-product-face eshell-ls-readonly-face eshell-ls-special-face eshell-ls-symlink-face eshell-ls-unreadable-face eshell-prompt-face eshell-test-failed-face eshell-test-ok-face flyspell-duplicate-face flyspell-incorrect-face font-lock-builtin-face font-lock-comment-face font-lock-constant-face font-lock-doc-face font-lock-function-name-face font-lock-keyword-face font-lock-preprocessor-face font-lock-string-face font-lock-type-face font-lock-variable-name-face font-lock-warning-face gnus-cite-attribution-face gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4 gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8 gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11 gnus-group-mail-1-empty-face gnus-group-mail-1-face gnus-group-mail-2-empty-face gnus-group-mail-2-face gnus-group-mail-3-empty-face gnus-group-mail-3-face gnus-group-mail-low-empty-face gnus-group-mail-low-face gnus-group-news-1-empty-face gnus-group-news-1-face gnus-group-news-2-empty-face gnus-group-news-2-face gnus-group-news-3-empty-face gnus-group-news-3-face gnus-group-news-4-empty-face gnus-group-news-4-face gnus-group-news-5-empty-face gnus-group-news-5-face gnus-group-news-6-empty-face gnus-group-news-6-face gnus-group-news-low-empty-face gnus-group-news-low-face gnus-header-content-face gnus-header-from-face gnus-header-name-face gnus-header-newsgroups-face gnus-header-subject-face gnus-signature-face gnus-splash-face gnus-summary-cancelled-face gnus-summary-high-ancient-face gnus-summary-high-read-face gnus-summary-high-ticked-face gnus-summary-high-unread-face gnus-summary-low-ancient-face gnus-summary-low-read-face gnus-summary-low-ticked-face gnus-summary-low-unread-face gnus-summary-normal-ancient-face gnus-summary-normal-read-face gnus-summary-normal-ticked-face gnus-summary-normal-unread-face gnus-summary-selected-face gomoku-font-lock-O-face gomoku-font-lock-X-face highlight-changes-delete-face highlight-changes-face holiday-face idlwave-help-link-face idlwave-shell-bp-face ido-first-match-face ido-indicator-face ido-only-match-face ido-subdir-face isearch-lazy-highlight-face ld-script-location-counter-face log-view-file-face log-view-message-face makefile-space-face message-cited-text-face message-header-cc-face message-header-name-face message-header-newsgroups-face message-header-other-face message-header-subject-face message-header-to-face message-header-xheader-face message-mml-face message-separator-face mh-folder-body-face mh-folder-cur-msg-face mh-folder-cur-msg-number-face mh-folder-date-face mh-folder-followup-face mh-folder-msg-number-face mh-folder-refiled-face mh-folder-subject-face mh-folder-tick-face mh-folder-to-face mh-index-folder-face mh-show-cc-face mh-show-date-face mh-show-from-face mh-show-header-face mh-show-to-face mh-show-xface-face mh-speedbar-folder-face mh-speedbar-folder-with-unseen-messages-face mh-speedbar-selected-folder-face mh-speedbar-selected-folder-with-unseen-messages-face mpuz-solved-face mpuz-text-face mpuz-trivial-face mpuz-unsolved-face ruler-mode-column-number-face ruler-mode-comment-column-face ruler-mode-current-column-face ruler-mode-default-face ruler-mode-fill-column-face ruler-mode-fringes-face ruler-mode-goal-column-face ruler-mode-margins-face ruler-mode-pad-face ruler-mode-tab-stop-face sgml-namespace-face sh-heredoc-face show-paren-match-face show-paren-mismatch-face show-tabs-space-face show-tabs-tab-face smerge-base-face smerge-markers-face smerge-mine-face smerge-other-face speedbar-button-face speedbar-directory-face speedbar-file-face speedbar-highlight-face speedbar-selected-face speedbar-tag-face strokes-char-face table-cell-face testcover-1value-face testcover-nohits-face tex-math-face tex-verbatim-face texinfo-heading-face vhdl-font-lock-attribute-face vhdl-font-lock-directive-face vhdl-font-lock-enumvalue-face vhdl-font-lock-function-face vhdl-font-lock-prompt-face vhdl-font-lock-reserved-words-face vhdl-font-lock-translate-off-face vhdl-speedbar-architecture-face vhdl-speedbar-architecture-selected-face vhdl-speedbar-configuration-face vhdl-speedbar-configuration-selected-face vhdl-speedbar-entity-face vhdl-speedbar-entity-selected-face vhdl-speedbar-instantiation-face vhdl-speedbar-instantiation-selected-face vhdl-speedbar-library-face vhdl-speedbar-package-face vhdl-speedbar-package-selected-face vhdl-speedbar-subprogram-face viper-minibuffer-emacs-face viper-minibuffer-insert-face viper-minibuffer-vi-face viper-replace-overlay-face viper-search-face whitespace-highlight-face widget-button-face widget-button-pressed-face widget-documentation-face widget-field-face widget-inactive-face widget-single-line-field-face woman-addition-face woman-bold-face woman-italic-face woman-unknown-face ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-11 14:41 ` Juanma Barranquero @ 2004-03-17 3:59 ` Miles Bader 2004-03-18 0:53 ` Juanma Barranquero 0 siblings, 1 reply; 26+ messages in thread From: Miles Bader @ 2004-03-17 3:59 UTC (permalink / raw) Cc: emacs-devel Juanma Barranquero <jmbarranquero@wke.es> writes: > > Please do not use a `-face' suffix for face names -- it's unnecessary and > > redundant (faces have their own namespace). These faces should be called > > just `hexl-address-area' and `hexl-ascii-area'. > > Time for a `make-obsolete-face' function? :) It'd be nice... [also for modeline vs. mode-line -- both `work', but not very well, you can end with customizations attached to both, which can be very confusing!] -Miles -- Any man who is a triangle, has thee right, when in Cartesian Space, to have angles, which when summed, come to know more, nor no less, than nine score degrees, should he so wish. [TEMPLE OV THEE LEMUR] ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-17 3:59 ` Miles Bader @ 2004-03-18 0:53 ` Juanma Barranquero 2004-03-20 4:48 ` Richard Stallman 0 siblings, 1 reply; 26+ messages in thread From: Juanma Barranquero @ 2004-03-18 0:53 UTC (permalink / raw) On 17 Mar 2004 12:59:31 +0900, Miles Bader <miles@lsi.nec.co.jp> wrote: > Juanma Barranquero <jmbarranquero@wke.es> writes: > > Time for a `make-obsolete-face' function? :) > > It'd be nice... Well, if there's really interest, I could commit the following patch: ------ cut here ------ cut here ------ cut here ------ cut here ------ Index: faces.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/faces.el,v retrieving revision 1.282 diff -u -2 -r1.282 faces.el --- faces.el 27 Feb 2004 17:30:23 -0000 1.282 +++ faces.el 17 Mar 2004 10:16:35 -0000 @@ -1243,5 +1243,6 @@ (if (not (facep f)) (insert " undefined face.\n") - (let ((customize-label "customize this face")) + (let ((customize-label "customize this face") + (obsolete (get f 'byte-obsolete-face))) (princ (concat " (" customize-label ")\n")) (insert "Documentation: " @@ -1249,4 +1250,12 @@ "Not documented as a face.") "\n\n") + (when obsolete + (princ "This face is obsolete") + (if (cdr obsolete) (princ (format " since %s" (cdr obsolete)))) + (princ ";") (terpri) + (princ (if (stringp (car obsolete)) (car obsolete) + (format "use `%s' instead." (car obsolete)))) + (terpri) + (terpri)) (with-current-buffer standard-output (save-excursion Index: emacs-lisp/byte-run.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/emacs-lisp/byte-run.el,v retrieving revision 1.3 diff -u -2 -r1.3 byte-run.el --- emacs-lisp/byte-run.el 18 Mar 2004 00:17:17 -0000 1.3 +++ emacs-lisp/byte-run.el 17 Mar 2004 10:21:16 -0000 @@ -106,4 +106,21 @@ var) +(defun make-obsolete-face (face new &optional when) + "Make the byte-compiler warn that FACE is obsolete. +The warning will say that NEW should be used instead. +If NEW is a string, that is the `use instead' message. +If provided, WHEN should be a string indicating when the face +was first made obsolete, for example a date or a release number." + (interactive + (list + (let ((old (read-face-name "Make face obsolete"))) + (if (equal old nil) (error "")) + old) + (let ((new (read-face-name "Obsoletion replacement"))) + (if (equal new nil) (error "No replacement face")) + new))) + (put face 'byte-obsolete-face (cons new when)) + face) + (put 'dont-compile 'lisp-indent-hook 0) (defmacro dont-compile (&rest body) ------ cut here ------ cut here ------ cut here ------ cut here ------ but the problem is, how to make the byte-compiler warn when using an obsolete face? AFAICS, face names are just symbols, so other uses of the symbol would trigger the warning too. For example, with this patch (just a proof of concept, I know almost nothing about bytecomp.el): ------ cut here ------ cut here ------ cut here ------ cut here ------ Index: bytecomp.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/emacs-lisp/bytecomp.el,v retrieving revision 2.143 diff -u -2 -r2.143 bytecomp.el --- bytecomp.el 12 Mar 2004 10:09:59 -0000 2.143 +++ bytecomp.el 18 Mar 2004 00:47:31 -0000 @@ -2788,5 +2788,14 @@ (setq for-effect nil) (when (symbolp const) - (byte-compile-set-symbol-position const)) + (byte-compile-set-symbol-position const) + (if (and (get const 'byte-obsolete-face) + (memq 'obsolete byte-compiler-warnings)) + (let* ((ob (get const 'byte-obsolete-face)) + (when (cdr ob))) + (byte-compile-warn "%s is an obsolete face%s; %s" const + (if when (concat " since " when) "") + (if (stringp (car ob)) + (car ob) + (format "use %s instead." (car ob))))))) (byte-compile-out 'byte-constant (byte-compile-get-constant const)))) ------ cut here ------ cut here ------ cut here ------ cut here ------ you can certainly do (make-obsolete-face 'modeline 'mode-line "21.5") and get a warning in compilation, but then so does every other use of 'modeline, even if it's not used as a a face. Any easy way to solve this or do it right? /L/e/k/t/u ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-18 0:53 ` Juanma Barranquero @ 2004-03-20 4:48 ` Richard Stallman 2004-03-22 11:52 ` Juanma Barranquero 0 siblings, 1 reply; 26+ messages in thread From: Richard Stallman @ 2004-03-20 4:48 UTC (permalink / raw) Cc: emacs-devel but the problem is, how to make the byte-compiler warn when using an obsolete face? AFAICS, face names are just symbols, so other uses of the symbol would trigger the warning too. That is indeed the hard part. Perhaps one could make a list of functions that faces are commonly specified to, and check for use of an obsolete face name quoted as an argument. For instance, (overlay-put ... 'face 'OBSOLETE-FACE-NAME) would trigger the warning. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: ruler support in hexl mode 2004-03-20 4:48 ` Richard Stallman @ 2004-03-22 11:52 ` Juanma Barranquero 0 siblings, 0 replies; 26+ messages in thread From: Juanma Barranquero @ 2004-03-22 11:52 UTC (permalink / raw) On Fri, 19 Mar 2004 23:48:23 -0500 Richard Stallman <rms@gnu.org> wrote: > Perhaps one could make a list of > functions that faces are commonly specified to, and check for use > of an obsolete face name quoted as an argument. I had thought of adding a property to face-using functions, which would say what arguments can be faces, i.e.: (put 'copy-face 'byte-compile-uses-faces '(1 2)) and then checking when compiling. There should be also a way to mark functions that can receive faces in generic arguments, like `overlay-put'. I favor this kind of answer because assigning the property would be close to the function declaration, so harder to forget than going to emacs-lisp/bytecomp.el to update a list. But perhaps what you propose is better/easier, don't know. In any case, I'm no expert in emacs-lisp/byte*.el, so any pointer about when/how to check the arguments would be welcome. Juanma ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2004-03-22 11:52 UTC | newest] Thread overview: 26+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-03-05 5:29 ruler support in hexl mode Masatake YAMATO 2004-03-08 20:05 ` Stefan Monnier 2004-03-09 12:11 ` Masatake YAMATO 2004-03-11 6:59 ` Masatake YAMATO 2004-03-11 16:27 ` Kim F. Storm 2004-03-11 17:43 ` Stefan Monnier 2004-03-11 23:56 ` Kim F. Storm 2004-03-12 6:05 ` Masatake YAMATO 2004-03-12 21:24 ` Stefan Monnier 2004-03-13 18:13 ` Masatake YAMATO 2004-03-15 7:37 ` Masatake YAMATO 2004-03-15 4:55 ` Richard Stallman 2004-03-15 11:00 ` Kim F. Storm 2004-03-16 19:02 ` Richard Stallman 2004-03-17 0:08 ` Kim F. Storm 2004-03-17 0:42 ` Stefan Monnier 2004-03-17 2:23 ` Kim F. Storm 2004-03-19 5:01 ` Richard Stallman 2004-03-19 10:06 ` Kim F. Storm 2004-03-19 13:33 ` Kim F. Storm 2004-03-08 21:00 ` Miles Bader 2004-03-11 14:41 ` Juanma Barranquero 2004-03-17 3:59 ` Miles Bader 2004-03-18 0:53 ` Juanma Barranquero 2004-03-20 4:48 ` Richard Stallman 2004-03-22 11:52 ` Juanma Barranquero
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).