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

[xyzzy:02485] あたらしい機能の紹介



赤塚です

    "0000"    0000 0034 4f50 4b33 3030 3100 cdcd cdcd    ...4OPK3001.oooo
    "0010"    cdcd cdcd 0000 0000 0000 0000 0000 0000    oooo............
    "0020"    0000 0000 0000 0000 0000 0000 0000 0000    ................
    "0030"    0000 0000   f                               ....

こういう16進数のダンプがあったときに、マウスで選択すると
10進数の値を表示する Lisp を書いてもらいました。
マウスで選択しなくてもでますけど。

これで電卓いらなくなりました。

やりかた

下記のコードを、適当な foo.l とかに書いて、byte-compile-fileして、
そいつを .xyzzy にて (load-library foo.l) と記述する
で、xyzzy.w95 or xyzzy.wnt を削除してから、xyzzy を再起動
で、show-hex-mode とかすると、できるようになります。


ちなみに、real-stupid-mode とか stupid-mode も使いようによっては
使えますけど


(defvar show-hex-mode nil)

(defvar *show-hex-last-range-begin* nil)
(defvar *show-hex-last-range-end* nil)
(defvar *show-hex-default-mouse-move*
  (lookup-keymap *global-keymap* #\MouseMove))

(defun show-hex-mode (&optional (arg nil sv))
  (interactive "p")
  (ed::toggle-mode 'show-hex-mode arg sv)
  (require-mouse-move show-hex-mode)
  (setq *show-hex-last-range-begin* nil)
  (global-set-key #\MouseMove (if show-hex-mode 'show-hex-lookup
				*show-hex-default-mouse-move*))
  (update-mode-line t))

(defun show-hex-lookup ()
  (interactive)
  (continue-pre-selection)
  (let ((w (selected-window)))
    (unwind-protect
	(progn
	  (set-window *last-mouse-window*)
	  (save-excursion
	    (let ((type (get-selection-type))
		  (pre (pre-selection-p)))
	      (multiple-value-bind (beg end)
		  (ed::get-selection-start-end)
		(cond (beg
		       (goto-char beg)
		       (start-selection type pre end)
		       (when (and (eql beg *show-hex-last-range-begin*)
				  (eql end *show-hex-last-range-end*))
			 (continue-popup)
			 (return-from show-hex-lookup t)))
		      (t
		       (goto-last-mouse-point)
		       (cond ((eolp)
			      (setq *show-hex-last-range-begin* nil)
			      (return-from show-hex-lookup nil))
			     ((and *show-hex-last-range-begin*
				   (<= *show-hex-last-range-begin* (point))
				   (< (point) *show-hex-last-range-end*))
			      (continue-popup)
			      (return-from show-hex-lookup t))
			     (t
			      (setq end (progn
					  (skip-chars-forward "0-9A-Fa-f")
					  (point)))
			      (setq beg (progn
					  (skip-chars-backward "0-9A-Fa-f")
					  (point)))))))
		(setq *show-hex-last-range-begin* beg)
		(setq *show-hex-last-range-end* end)
		(if (= beg end)
		    (return-from show-hex-lookup nil))
		(let* ((s (delete-if #'(lambda (c) (find c " \t\n"))
				     (buffer-substring beg end)))
		       (n (ignore-errors (parse-integer s :radix 16))))
		  (when n
		    (popup-string (format nil "0x~A = ~D" s n)
				  beg)))))))
      (set-window w))))

(pushnew '(show-hex-mode . "HEX") *minor-mode-alist* :key #'car)

------------------------------------------------------------

 赤塚 慶
  zxr@xxxxxxxxxxxxxx

Index Home