Skip to content

Instantly share code, notes, and snippets.

@kurohuku
Created December 5, 2013 16:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kurohuku/7808376 to your computer and use it in GitHub Desktop.
Save kurohuku/7808376 to your computer and use it in GitHub Desktop.
(require 'cl)
(defgroup popup-forward-backward nil
"Minor mode for popping up lines which surround forward/backward point")
(defcustom popup-forward-backward:idle-delay 5
"Number of seconds of idle time to wait before popping up"
:type 'number
:group 'popup-forward-backward)
(define-minor-mode popup-forward-backward-mode
"Minor mode for popping up lines which surround forward/backward point"
:lighter " PFB"
:init-value nil
:group popup-forward-backward
:global nil
(if popup-forward-backward-mode
(popup-forward-backward:enable)
(popup-forward-backward:disable)))
(defun popup-forward-backward:turn-on ()
(interactive)
(popup-forward-backward-mode 1))
(defvar popup-forward-backward:idle-timer nil)
(defvar popup-forward-backward:open-tokens '("(" "{" "[" "<"))
(defvar popup-forward-backward:close-tokens '(")" "}" "]" ">"))
(defvar popup-forward-backward:forward 'forward-sexp)
(defvar popup-forward-backward:backward 'backward-sexp)
(defvar popup-forward-backward:lines 1)
(defun popup-forward-backward:enable ()
(make-local-variable 'popup-forward-backward:open-tokens)
(make-local-variable 'popup-forward-backward:close-tokens)
(make-local-variable 'popup-forward-backward:forward)
(make-local-variable 'popup-forward-backward:backward)
(make-local-variable 'popup-forward-backward:lines)
(add-hook 'post-command-hook 'popup-forward-backward:run-idle-timer))
(defun popup-forward-backward:disable ()
(remove-hook 'post-command-hook 'popup-forward-backward:run-idle-timer))
(defun popup-forward-backward:run-idle-timer ()
(when (timerp popup-forward-backward:idle-timer)
(cancel-timer popup-forward-backward:idle-timer))
(when popup-forward-backward-mode
(setq popup-forward-backward:idle-timer
(run-with-idle-timer popup-forward-backward:idle-delay
t
'popup-forward-backward
))))
(defun popup-forward-backward ()
"popup 1+`lines'*2 lines"
(interactive)
(cond
((find (string (char-before)) popup-forward-backward:close-tokens
:test 'string-equal)
(popup-backward popup-forward-backward:lines))
((find (string (char-after)) popup-forward-backward:open-tokens
:test 'string-equal)
(popup-forward popup-forward-backward:lines))))
(defun popup-forward (lines)
(let ((text (save-excursion
(call-interactively popup-forward-backward:forward)
(unless (and (<= (window-start) (point))
(< (point) (window-end)))
(popup-forward-backward:get-lines lines)))))
(when text
(popup-tip text))))
(defun popup-backward (lines)
(let ((text (save-excursion
(call-interactively popup-forward-backward:backward)
(unless (and (<= (window-start) (point))
(< (point) (window-end)))
(popup-forward-backward:get-lines lines)))))
(when text
(popup-tip text))))
(defun popup-forward-backward:get-lines (lines)
(let ((beg (save-excursion (ignore-errors (previous-line lines))
(line-beginning-position)))
(end (save-excursion (ignore-errors (next-line lines))
(line-end-position))))
(buffer-substring beg end)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment