Download
(defun pc-keys-home ()
"Go to beginning of line/window/buffer.
First hitting key goes to beginning of line, second in a row goes to
beginning of window, third in a row goes to beginning of buffer."
(interactive)
(let* ((keys (recent-keys))
(len (length keys))
(key1 (if (> len 0) (elt keys (- len 1)) nil))
(key2 (if (> len 1) (elt keys (- len 2)) nil))
(key3 (if (> len 2) (elt keys (- len 3)) nil))
(key-equal-1 (equal key1 key2))
(key-equal-2 (and key-equal-1 (equal key2 key3))))
(cond (key-equal-2 (if mark-active
(goto-char (point-min))
(beginning-of-buffer)))
(key-equal-1 (if mark-active () (push-mark))
(move-to-window-line 0))
(t (beginning-of-line)))))
(defun pc-keys-end ()
"Go to end of line/window/buffer.
First hitting key goes to end of line, second in a row goes to end
of window, third in a row goes to end of buffer."
(interactive)
(let* ((keys (recent-keys))
(len (length keys))
(key1 (if (> len 0) (elt keys (- len 1)) nil))
(key2 (if (> len 1) (elt keys (- len 2)) nil))
(key3 (if (> len 2) (elt keys (- len 3)) nil))
(key-equal-1 (equal key1 key2))
(key-equal-2 (and key-equal-1 (equal key2 key3))))
(cond (key-equal-2 (if mark-active
(goto-char (point-max))
(end-of-buffer)))
(key-equal-1 (if mark-active () (push-mark))
(move-to-window-line -1)
(end-of-line))
(t (end-of-line)))))
(global-set-key [home] 'pc-keys-home)
(global-set-key [end] 'pc-keys-end)
(provide 'pc-keys)