]> code.delx.au - gnu-emacs/blobdiff - lisp/hexl.el
(goto-address-mail-regexp): Allow = in username.
[gnu-emacs] / lisp / hexl.el
index 66aceeaee7120da50235bc7b5c727c0cf483f947..af996940f868040535ebe5515d59fbdf8ce34fe3 100644 (file)
@@ -99,17 +99,31 @@ Quoting cannot be used, so the arguments cannot themselves contain spaces."
 
 (defvar hexl-mode-map nil)
 
+(defvar ruler-mode)
+(defvar ruler-mode-ruler-function)
+(defvar hl-line-mode)
+
+(defvar hexl-mode-old-hl-line-mode)
 (defvar hexl-mode-old-local-map)
 (defvar hexl-mode-old-mode-name)
 (defvar hexl-mode-old-major-mode)
+(defvar hexl-mode-old-ruler-mode)
 (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-font-lock-keywords)
 
 (defvar hexl-ascii-overlay nil
   "Overlay used to highlight ASCII element corresponding to current point.")
 (make-variable-buffer-local 'hexl-ascii-overlay)
 
+(defvar hexl-font-lock-keywords
+  '(("^\\([0-9a-f]+:\\).\\{40\\}  \\(.+$\\)"
+     ;; "^\\([0-9a-f]+:\\).+  \\(.+$\\)"
+     (1 'hexl-address-area t t)
+     (2 'hexl-ascii-area t t)))
+  "Font lock keywords used in `hexl-mode'.")
+
 ;; routines
 
 (put 'hexl-mode 'mode-class 'special)
@@ -217,7 +231,9 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
         (set-buffer-modified-p modified))
       (make-local-variable 'hexl-max-address)
       (setq hexl-max-address max-address)
-      (hexl-goto-address original-point))
+      (condition-case nil
+         (hexl-goto-address original-point)
+       (error nil)))
 
     ;; We do not turn off the old major mode; instead we just
     ;; override most of it.  That way, we can restore it perfectly.
@@ -238,6 +254,14 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
     (setq hexl-mode-old-major-mode major-mode)
     (setq major-mode 'hexl-mode)
 
+    (make-local-variable 'hexl-mode-old-ruler-mode)
+    (setq hexl-mode-old-ruler-mode
+         (and (boundp 'ruler-mode) ruler-mode))
+
+    (make-local-variable 'hexl-mode-old-hl-line-mode)
+    (setq hexl-mode-old-hl-line-mode
+         (and (boundp 'hl-line-mode) hl-line-mode))
+
     (make-local-variable 'hexl-mode-old-syntax-table)
     (setq hexl-mode-old-syntax-table (syntax-table))
     (set-syntax-table (standard-syntax-table))
@@ -249,6 +273,11 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
     (make-local-variable 'require-final-newline)
     (setq require-final-newline nil)
 
+    (make-local-variable 'hexl-mode-old-font-lock-keywords)
+    (setq hexl-mode-old-font-lock-keywords font-lock-defaults)
+    (make-local-variable 'font-lock-defaults)
+    (setq font-lock-defaults '(hexl-font-lock-keywords t))
+
     ;; Add hooks to rehexlify or dehexlify on various events.
     (add-hook 'after-revert-hook 'hexl-after-revert-hook nil t)
 
@@ -351,11 +380,16 @@ With arg, don't unhexlify buffer."
   (remove-hook 'post-command-hook 'hexl-follow-ascii-find t)
   (setq hexl-ascii-overlay nil)
 
+  (if (and (boundp 'ruler-mode) ruler-mode (not hexl-mode-old-ruler-mode))
+      (ruler-mode 0))
+  (if (and (boundp 'hl-line-mode) hl-line-mode (not hexl-mode-old-hl-line-mode))
+      (hl-line-mode 0))
   (setq require-final-newline hexl-mode-old-require-final-newline)
   (setq mode-name hexl-mode-old-mode-name)
   (setq isearch-search-fun-function hexl-mode-old-isearch-search-fun-function)
   (use-local-map hexl-mode-old-local-map)
   (set-syntax-table hexl-mode-old-syntax-table)
+  (setq font-lock-defaults hexl-mode-old-font-lock-keywords)
   (setq major-mode hexl-mode-old-major-mode)
   (force-mode-line-update))
 
@@ -405,7 +439,7 @@ This function is indented to be used as eldoc callback."
 Signal error if ADDRESS out of range."
   (interactive "nAddress: ")
   (if (or (< address 0) (> address hexl-max-address))
-         (error "Out of hexl region"))
+      (error "Out of hexl region"))
   (goto-char (hexl-address-to-marker address)))
 
 (defun hexl-goto-hex-address (hex-address)
@@ -664,15 +698,6 @@ 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))))
 
@@ -900,7 +925,6 @@ Customize the variable `hexl-follow-ascii' to disable this feature."
 (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)
@@ -927,11 +951,8 @@ This function is assumed to be used as call back function for `hl-line-mode'."
 (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))))
+        (s " 87654321  0011 2233 4455 6677 8899 aabb ccdd eeff  0123456789abcdef")
+        (pos 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.
@@ -939,21 +960,16 @@ This function is assumed to be used as call back function for `hl-line-mode'."
       (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))
+                        `(space :align-to ,(1- pos))
                         s))
     ;; Highlight the current column.
-    (put-text-property (+ 10 (/ (* 5 highlight) 2))
-                      (+ 12 (/ (* 5 highlight) 2))
+    (put-text-property (+ 11 (/ (* 5 highlight) 2))
+                      (+ 13 (/ (* 5 highlight) 2))
                       'face 'highlight s)
     ;; Highlight the current ascii column
-    (put-text-property (+ 12 39 highlight) (+ 12 40 highlight)
+    (put-text-property (+ 13 39 highlight) (+ 13 40 highlight)
                       'face 'highlight s)
-    ;; Add the leading space.
-    (concat (propertize (make-string (floor spaces) ? )
-                       'display `(space :width ,spaces))
-           s)))
+    s))
 
 ;; startup stuff.