summaryrefslogtreecommitdiff
path: root/lisp/hexl.el
diff options
context:
space:
mode:
authorMasatake YAMATO <jet@gyve.org>2004-03-15 07:27:02 +0000
committerMasatake YAMATO <jet@gyve.org>2004-03-15 07:27:02 +0000
commit9fd76d04e8b93bb6116dffe49b8fdabdac71286f (patch)
treefe6d8918286e794fb0f8cd66991abf78f3c4f180 /lisp/hexl.el
parent6e54fa536d7848031898ae11a228d40ca2c81a61 (diff)
downloademacs-9fd76d04e8b93bb6116dffe49b8fdabdac71286f.tar.gz
2004-03-15 Masatake YAMATO <jet@gyve.org>
* hl-line.el (hl-line-range-function): New variable. (hl-line-move): New function. (global-hl-line-highlight): Use `hl-line-move'. (hl-line-highlight): Ditto. * scroll-bar.el (scroll-bar-columns): New function derived from ruler-mode.el. * fringe.el (fringe-columns): New function derived from ruler-mode.el. * ruler-mode.el (top-level): Require scroll-bar and fringe. (ruler-mode-left-fringe-cols) (ruler-mode-right-fringe-cols): Use `fringe-columns'. (ruler-mode-right-scroll-bar-cols) (ruler-mode-left-scroll-bar-cols): Use `scroll-bar-columns'. (ruler-mode-ruler-function): New variable. (ruler-mode-header-line-format): Call `ruler-mode-ruler-function' if the value for `ruler-mode-ruler-function'is given. * hexl.el (hexl-mode-hook): Make the hook customizable. (hexl-address-area, hexl-ascii-area, hexl-ascii-cursor): New customize variables. (hexlify-buffer): Put font-lock-faces on the address area and the ascii area. (hexl-activate-ruler): New function. (hexl-follow-line): New function. (hexl-highlight-line-range): New function. (hexl-mode-ruler): New function.
Diffstat (limited to 'lisp/hexl.el')
-rw-r--r--lisp/hexl.el82
1 files changed, 82 insertions, 0 deletions
diff --git a/lisp/hexl.el b/lisp/hexl.el
index 9fd21824f26..66aceeaee71 100644
--- a/lisp/hexl.el
+++ b/lisp/hexl.el
@@ -78,6 +78,22 @@ Quoting cannot be used, so the arguments cannot themselves contain spaces."
: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 turn-on-eldoc-mode)
+ :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)
+
(defvar hexl-max-address 0
"Maximum offset into hexl buffer.")
@@ -648,6 +664,15 @@ This discards the buffer's undo information."
(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 +890,32 @@ Customize the variable `hexl-follow-ascii' to disable this feature."
(remove-hook 'post-command-hook 'hexl-follow-ascii-find t)
)))))
+(defun hexl-activate-ruler ()
+ "Activate `ruler-mode'"
+ (require 'ruler-mode)
+ (set (make-local-variable 'ruler-mode-ruler-function)
+ 'hexl-mode-ruler)
+ (ruler-mode 1))
+
+(defun hexl-follow-line ()
+ "Activate `hl-line-mode'"
+ (require 'frame)
+ (require 'fringe)
+ (require 'hl-line)
+ (set (make-local-variable 'hl-line-range-function)
+ 'hexl-highlight-line-range)
+ (set (make-local-variable 'hl-line-face)
+ 'highlight)
+ (hl-line-mode 1))
+
+(defun hexl-highlight-line-range ()
+ "Return the range of address area for the point.
+This function is assumed to be used as call back function for `hl-line-mode'."
+ (cons
+ (line-beginning-position)
+ ;; 9 stands for (length "87654321:")
+ (+ (line-beginning-position) 9)))
+
(defun hexl-follow-ascii-find ()
"Find and highlight the ASCII element corresponding to current point."
(let ((pos (+ 51
@@ -873,6 +924,37 @@ Customize the variable `hexl-follow-ascii' to disable this feature."
(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 '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.
(if hexl-mode-map