Advertisement
Guest User

mouse number scaling mode

a guest
May 16th, 2013
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.37 KB | None | 0 0
  1. (defvar foo-mode-map (make-sparse-keymap))
  2.  
  3. (define-minor-mode foo-mode
  4.   "Scales numbers when they are right-click dragged over."
  5.   :keymap foo-mode-map
  6.   :lighter " foo")
  7.  
  8. (define-key foo-mode-map (kbd "<down-mouse-3>") 'foo-mouse-scale)
  9.  
  10. (defun* foo-find-number (&optional (point (point)))
  11.   "Return the region for the number around POINT."
  12.   (save-excursion
  13.     (goto-char point)
  14.     (let ((num "[^-0-9.]"))
  15.       (re-search-backward num)
  16.       (forward-char 1)
  17.       (let ((start (point)))
  18.         (re-search-forward num)
  19.         (list start (1- (point)))))))
  20.  
  21. (defun foo-mouse-scale (event)
  22.   (interactive "e")
  23.   (flet ((x (event) (car (posn-x-y (second event)))))
  24.     (save-excursion
  25.       (destructuring-bind (start end)
  26.           (foo-find-number (posn-point (second event)))
  27.         (let* ((start-x (x event))
  28.                (base (string-to-number (buffer-substring start end))))
  29.           (track-mouse
  30.             (loop for movement = (read-event)
  31.                   while (mouse-movement-p movement)
  32.                   for value = (+ base (- (x movement) start-x))
  33.                   for value-str = (number-to-string value)
  34.                   do (progn
  35.                        (delete-region start end)
  36.                        (setf end (+ start (length value-str)))
  37.                        (goto-char start)
  38.                        (insert value-str))))))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement