dotfiles/.emacs.d/vim-mode/vim-scroll.el
michener 5b6729933d Add emacs directory
git-svn-id: http://photonzero.com/dotfiles/trunk@54 23f722f6-122a-0410-8cef-c75bd312dd78
2010-08-12 01:19:45 +00:00

136 lines
4.2 KiB
EmacsLisp

;;; vim-scroll.el - Implementation of scrolling commands
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Commentary:
;; This file contains implementations for the scrolling. Scroll
;; operations are usually just simple commands and should not be
;; repeatable but should keep visual mode.
;;; Code:
(vim:define-keymap motion-mode "motion mode" :map-command mmap)
(vim:define-mode motion "VIM motion mode"
:ident "M"
:keymaps '(vim:motion-mode-keymap vim:window-mode-keymap)
:command-function 'vim:normal-mode-command)
(defun vim:num-visible-lines ()
"Returns the number of currently visible lines."
(- (window-height) 1))
(defun vim:max-scroll-up ()
"Returns the maximal number of lines that can be scrolled up."
(1- (line-number-at-pos (window-start))))
(defun vim:max-scroll-down ()
"Returns the maximal number of lines that can be scrolled down."
(if (pos-visible-in-window-p (window-end))
0
(1+ (- (line-number-at-pos (point-max))
(line-number-at-pos (window-end))))))
(vim:defcmd vim:scroll-line-up (count nonrepeatable keep-visual)
"Scrolls the window `count' lines upwards."
(vim:use-last-column)
(scroll-down (or count 1)))
(vim:defcmd vim:scroll-line-down (count nonrepeatable keep-visual)
"Scrolls the window `count' lines downwards."
(vim:use-last-column)
(scroll-up (or count 1)))
(vim:defcmd vim:scroll-up (count nonrepeatable keep-visual)
"Scrolls the window and the cursor `count' lines upwards, default half of the screen."
(vim:use-last-column)
(let ((p (point))
(c (or count (/ (vim:num-visible-lines) 2))))
(save-excursion
(scroll-down (min (vim:max-scroll-up) c)))
(forward-line (- c))
(when (= (line-number-at-pos p)
(line-number-at-pos (point)))
(ding))))
(vim:defcmd vim:scroll-down (count nonrepeatable keep-visual)
"Scrolls the window and the cursor `count' lines downwards, default half of the screen."
(vim:use-last-column)
(let ((p (point))
(c (or count (/ (vim:num-visible-lines) 2))))
(save-excursion
(scroll-up (min (vim:max-scroll-down) c)))
(forward-line c)
(when (= (line-number-at-pos p)
(line-number-at-pos (point)))
(ding))))
(vim:defcmd vim:scroll-page-up (count nonrepeatable keep-visual)
"Scrolls the window `count' pages upwards."
(vim:use-last-column)
(condition-case nil
(dotimes (i (or count 1))
(scroll-down nil))
(error (goto-char (point-min)))))
(vim:defcmd vim:scroll-page-down (count nonrepeatable keep-visual)
"Scrolls the window `count' pages upwards."
(vim:use-last-column)
(condition-case nil
(dotimes (i (or count 1))
(scroll-up nil))
(error (goto-char (point-max)))))
(vim:defcmd vim:scroll-line-to-top (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the top of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter 0))
(vim:defcmd vim:scroll-line-to-center (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the center of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter nil))
(vim:defcmd vim:scroll-line-to-bottom (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the bottom of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter -1))
(vim:defcmd vim:scroll-bottom-line-to-top (count nonrepeatable keep-visual)
"Scrolls the line right below the window or line `count' to the top of the window."
(if count
(goto-line count)
(goto-char (window-end))
(unless (bobp) (backward-char)))
(recenter 0)
(vim:motion-first-non-blank))
(vim:defcmd vim:scroll-top-line-to-bottom (count nonrepeatable keep-visual)
"Scrolls the line right below the window or line `count' to the top of the window."
(if count
(goto-line count)
(goto-char (window-start)))
(recenter -1)
(vim:motion-first-non-blank))
(provide 'vim-scroll)
;;; vim-scroll.el ends here