;;; vip.el --- a VI Package for GNU Emacs
+;; Copyright (C) 1986, 1987, 1988, 1992, 1993, 1998, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
+
;; Author: Masahiko Sato <ms@sail.stanford.edu>
-;; Version: 3.5
;; Keywords: emulations
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
;;; Commentary:
;; A full-featured vi(1) emulator.
;;; Code:
+(defgroup vip nil
+ "A VI Package for GNU Emacs."
+ :prefix "vip-"
+ :group 'emulations)
+
;; external variables
(defvar vip-emacs-local-map nil
- "Local map used in emacs mode. \(buffer specific\)")
+ "Local map used in emacs mode. (Buffer-specific.)")
(defvar vip-insert-local-map nil
- "Local map used in insert command mode. \(buffer specific\)")
-
+ "Local map used in insert command mode. (Buffer-specific.)")
+
(make-variable-buffer-local 'vip-emacs-local-map)
(make-variable-buffer-local 'vip-insert-local-map)
(defvar vip-insert-point nil
- "Remember insert point as a marker. \(buffer specific\)")
+ "Remember insert point as a marker. (Buffer-specific.)")
(set-default 'vip-insert-point (make-marker))
(make-variable-buffer-local 'vip-insert-point)
(defvar vip-com-point nil
- "Remember com point as a marker. \(buffer specific\)")
+ "Remember com point as a marker. (Buffer-specific.)")
(set-default 'vip-com-point (make-marker))
(make-variable-buffer-local 'vip-com-point)
(defvar vip-current-mode nil
- "Current mode. One of emacs-mode, vi-mode, insert-mode.")
+ "Current mode. One of `emacs-mode', `vi-mode', `insert-mode'.")
(make-variable-buffer-local 'vip-current-mode)
(setq-default vip-current-mode 'emacs-mode)
(defvar vip-emacs-mode-line-buffer-identification nil
- "value of mode-line-buffer-identification in emacs-mode.")
+ "Value of mode-line-buffer-identification in Emacs mode within vip.")
(make-variable-buffer-local 'vip-emacs-mode-line-buffer-identification)
(setq-default vip-emacs-mode-line-buffer-identification
'("Emacs: %17b"))
(make-variable-buffer-local 'vip-current-major-mode)
(defvar vip-last-shell-com nil
- "last shell command executed by ! command")
+ "Last shell command executed by ! command.")
(defvar vip-use-register nil
- "name of register to store deleted or yanked strings.")
+ "Name of register to store deleted or yanked strings.")
(defvar vip-d-com nil
- "If non-nil, it's value is a list (M-COM VAL COM), and is used to
-re-execute last destructive command")
+ "How to reexecute last destructive command. Value is list (M-COM VAL COM).")
-(defconst vip-shift-width 8
- "*The number of colums shifted by > and < command.")
+(defcustom vip-shift-width 8
+ "*The number of columns shifted by > and < command."
+ :type 'integer
+ :group 'vip)
-(defconst vip-re-replace nil
- "*If t then do regexp replace, if nil then do string replace.")
+(defcustom vip-re-replace nil
+ "*If t then do regexp replace, if nil then do string replace."
+ :type 'boolean
+ :group 'vip)
(defvar vip-d-char nil
- "The character remembered by the vi \"r\" command")
+ "The character remembered by the vi \"r\" command.")
(defvar vip-f-char nil
- "for use by \";\" command")
+ "For use by \";\" command.")
(defvar vip-F-char nil
- "for use by \".\" command")
+ "For use by \".\" command.")
(defvar vip-f-forward nil
- "for use by \";\" command")
-
+ "For use by \";\" command.")
+
(defvar vip-f-offset nil
- "for use by \";\" command")
+ "For use by \";\" command.")
-(defconst vip-search-wrap-around t
- "*if t, search wraps around")
+(defcustom vip-search-wrap-around t
+ "*If t, search wraps around."
+ :type 'boolean
+ :group 'vip)
-(defconst vip-re-search nil
- "*if t, search is reg-exp search, otherwise vanilla search.")
+(defcustom vip-re-search nil
+ "*If t, search is reg-exp search, otherwise vanilla search."
+ :type 'boolean
+ :group 'vip)
(defvar vip-s-string nil
- "last search string")
+ "Last vip search string.")
(defvar vip-s-forward nil
- "if t, search is forward.")
+ "If t, search is forward.")
-(defconst vip-case-fold-search nil
- "*if t, search ignores cases.")
+(defcustom vip-case-fold-search nil
+ "*If t, search ignores cases."
+ :type 'boolean
+ :group 'vip)
-(defconst vip-re-query-replace nil
- "*If t then do regexp replace, if nil then do string replace.")
+(defcustom vip-re-query-replace nil
+ "*If t then do regexp replace, if nil then do string replace."
+ :type 'boolean
+ :group 'vip)
-(defconst vip-open-with-indent nil
- "*if t, indent when open a new line.")
+(defcustom vip-open-with-indent nil
+ "*If t, indent when open a new line."
+ :type 'boolean
+ :group 'vip)
-(defconst vip-help-in-insert-mode nil
- "*if t then C-h is bound to help-command in insert mode, if nil then it is
-bound to delete-backward-char.")
+(defcustom vip-help-in-insert-mode nil
+ "*If t then C-h is bound to help-command in insert mode.
+If nil then it is bound to `delete-backward-char'."
+ :type 'boolean
+ :group 'vip)
(defvar vip-quote-string "> "
- "string inserted at the beginning of region")
+ "String inserted at the beginning of region.")
(defvar vip-tags-file-name "TAGS")
(defvar vip-inhibit-startup-message nil)
+
+(defvar vip-startup-file (convert-standard-filename "~/.vip")
+ "Filename used as startup file for vip.")
+\f
+;; key bindings
+
+(defvar vip-mode-map (make-keymap))
+
+(define-key vip-mode-map "\C-a" 'beginning-of-line)
+(define-key vip-mode-map "\C-b" 'vip-scroll-back)
+(define-key vip-mode-map "\C-c" 'vip-ctl-c)
+(define-key vip-mode-map "\C-d" 'vip-scroll-up)
+(define-key vip-mode-map "\C-e" 'vip-scroll-up-one)
+(define-key vip-mode-map "\C-f" 'vip-scroll)
+(define-key vip-mode-map "\C-g" 'vip-keyboard-quit)
+(define-key vip-mode-map "\C-h" 'help-command)
+(define-key vip-mode-map "\C-m" 'vip-scroll-back)
+(define-key vip-mode-map "\C-n" 'vip-other-window)
+(define-key vip-mode-map "\C-o" 'vip-open-line-at-point)
+(define-key vip-mode-map "\C-u" 'vip-scroll-down)
+(define-key vip-mode-map "\C-x" 'vip-ctl-x)
+(define-key vip-mode-map "\C-y" 'vip-scroll-down-one)
+(define-key vip-mode-map "\C-z" 'vip-change-mode-to-emacs)
+(define-key vip-mode-map "\e" 'vip-ESC)
+
+(define-key vip-mode-map " " 'vip-scroll)
+(define-key vip-mode-map "!" 'vip-command-argument)
+(define-key vip-mode-map "\"" 'vip-command-argument)
+(define-key vip-mode-map "#" 'vip-command-argument)
+(define-key vip-mode-map "$" 'vip-goto-eol)
+(define-key vip-mode-map "%" 'vip-paren-match)
+(define-key vip-mode-map "&" 'vip-nil)
+(define-key vip-mode-map "'" 'vip-goto-mark-and-skip-white)
+(define-key vip-mode-map "(" 'vip-backward-sentence)
+(define-key vip-mode-map ")" 'vip-forward-sentence)
+(define-key vip-mode-map "*" 'call-last-kbd-macro)
+(define-key vip-mode-map "+" 'vip-next-line-at-bol)
+(define-key vip-mode-map "," 'vip-repeat-find-opposite)
+(define-key vip-mode-map "-" 'vip-previous-line-at-bol)
+(define-key vip-mode-map "." 'vip-repeat)
+(define-key vip-mode-map "/" 'vip-search-forward)
+
+(define-key vip-mode-map "0" 'vip-beginning-of-line)
+(define-key vip-mode-map "1" 'vip-digit-argument)
+(define-key vip-mode-map "2" 'vip-digit-argument)
+(define-key vip-mode-map "3" 'vip-digit-argument)
+(define-key vip-mode-map "4" 'vip-digit-argument)
+(define-key vip-mode-map "5" 'vip-digit-argument)
+(define-key vip-mode-map "6" 'vip-digit-argument)
+(define-key vip-mode-map "7" 'vip-digit-argument)
+(define-key vip-mode-map "8" 'vip-digit-argument)
+(define-key vip-mode-map "9" 'vip-digit-argument)
+
+(define-key vip-mode-map ":" 'vip-ex)
+(define-key vip-mode-map ";" 'vip-repeat-find)
+(define-key vip-mode-map "<" 'vip-command-argument)
+(define-key vip-mode-map "=" 'vip-command-argument)
+(define-key vip-mode-map ">" 'vip-command-argument)
+(define-key vip-mode-map "?" 'vip-search-backward)
+(define-key vip-mode-map "@" 'vip-nil)
+
+(define-key vip-mode-map "A" 'vip-Append)
+(define-key vip-mode-map "B" 'vip-backward-Word)
+(define-key vip-mode-map "C" 'vip-ctl-c-equivalent)
+(define-key vip-mode-map "D" 'vip-kill-line)
+(define-key vip-mode-map "E" 'vip-end-of-Word)
+(define-key vip-mode-map "F" 'vip-find-char-backward)
+(define-key vip-mode-map "G" 'vip-goto-line)
+(define-key vip-mode-map "H" 'vip-window-top)
+(define-key vip-mode-map "I" 'vip-Insert)
+(define-key vip-mode-map "J" 'vip-join-lines)
+(define-key vip-mode-map "K" 'vip-kill-buffer)
+(define-key vip-mode-map "L" 'vip-window-bottom)
+(define-key vip-mode-map "M" 'vip-window-middle)
+(define-key vip-mode-map "N" 'vip-search-Next)
+(define-key vip-mode-map "O" 'vip-Open-line)
+(define-key vip-mode-map "P" 'vip-Put-back)
+(define-key vip-mode-map "Q" 'vip-query-replace)
+(define-key vip-mode-map "R" 'vip-replace-string)
+(define-key vip-mode-map "S" 'vip-switch-to-buffer-other-window)
+(define-key vip-mode-map "T" 'vip-goto-char-backward)
+(define-key vip-mode-map "U" 'vip-nil)
+(define-key vip-mode-map "V" 'vip-find-file-other-window)
+(define-key vip-mode-map "W" 'vip-forward-Word)
+(define-key vip-mode-map "X" 'vip-ctl-x-equivalent)
+(define-key vip-mode-map "Y" 'vip-yank-line)
+(define-key vip-mode-map "ZZ" 'save-buffers-kill-emacs)
+
+(define-key vip-mode-map "[" 'vip-nil)
+(define-key vip-mode-map "\\" 'vip-escape-to-emacs)
+(define-key vip-mode-map "]" 'vip-nil)
+(define-key vip-mode-map "^" 'vip-bol-and-skip-white)
+(define-key vip-mode-map "_" 'vip-nil)
+(define-key vip-mode-map "`" 'vip-goto-mark)
+
+(define-key vip-mode-map "a" 'vip-append)
+(define-key vip-mode-map "b" 'vip-backward-word)
+(define-key vip-mode-map "c" 'vip-command-argument)
+(define-key vip-mode-map "d" 'vip-command-argument)
+(define-key vip-mode-map "e" 'vip-end-of-word)
+(define-key vip-mode-map "f" 'vip-find-char-forward)
+(define-key vip-mode-map "g" 'vip-info-on-file)
+(define-key vip-mode-map "h" 'vip-backward-char)
+(define-key vip-mode-map "i" 'vip-insert)
+(define-key vip-mode-map "j" 'vip-next-line)
+(define-key vip-mode-map "k" 'vip-previous-line)
+(define-key vip-mode-map "l" 'vip-forward-char)
+(define-key vip-mode-map "m" 'vip-mark-point)
+(define-key vip-mode-map "n" 'vip-search-next)
+(define-key vip-mode-map "o" 'vip-open-line)
+(define-key vip-mode-map "p" 'vip-put-back)
+(define-key vip-mode-map "q" 'vip-nil)
+(define-key vip-mode-map "r" 'vip-replace-char)
+(define-key vip-mode-map "s" 'vip-switch-to-buffer)
+(define-key vip-mode-map "t" 'vip-goto-char-forward)
+(define-key vip-mode-map "u" 'vip-undo)
+(define-key vip-mode-map "v" 'vip-find-file)
+(define-key vip-mode-map "w" 'vip-forward-word)
+(define-key vip-mode-map "x" 'vip-delete-char)
+(define-key vip-mode-map "y" 'vip-command-argument)
+(define-key vip-mode-map "zH" 'vip-line-to-top)
+(define-key vip-mode-map "zM" 'vip-line-to-middle)
+(define-key vip-mode-map "zL" 'vip-line-to-bottom)
+(define-key vip-mode-map "z\C-m" 'vip-line-to-top)
+(define-key vip-mode-map "z." 'vip-line-to-middle)
+(define-key vip-mode-map "z-" 'vip-line-to-bottom)
+
+(define-key vip-mode-map "{" 'vip-backward-paragraph)
+(define-key vip-mode-map "|" 'vip-goto-col)
+(define-key vip-mode-map "}" 'vip-forward-paragraph)
+(define-key vip-mode-map "~" 'vip-nil)
+(define-key vip-mode-map "\177" 'vip-delete-backward-char)
+
+(defun vip-version ()
+ (interactive)
+ (message "VIP version 3.5 of September 15, 1987"))
+
\f
;; basic set up
-(global-set-key "\C-z" 'vip-change-mode-to-vi)
+;;;###autoload
+(defun vip-setup ()
+ "Set up bindings for C-x 7 and C-z that are useful for VIP users."
+ (define-key ctl-x-map "7" 'vip-buffer-in-two-windows)
+ (global-set-key "\C-z" 'vip-change-mode-to-vi))
(defmacro vip-loop (count body)
"(COUNT BODY) Execute BODY COUNT times."
'delete-backward-char))
(define-key vip-insert-local-map "\C-w"
'vip-delete-backward-word))
- ((eq new-mode 'emacs-mode)
+ ((eq new-mode 'emacs-mode)
(vip-change-mode-line "Emacs:")
(use-local-map vip-emacs-local-map)))
(setq vip-current-mode new-mode)
(progn
(save-excursion
(set-buffer
- (find-file-noselect (substitute-in-file-name "~/.vip")))
+ (find-file-noselect
+ (substitute-in-file-name vip-startup-file)))
(goto-char (point-max))
(insert "\n(setq vip-inhibit-startup-message t)\n")
(save-buffer)
"Compute numeric prefix arg value. Invoked by CHAR. VALUE is the value
obtained so far, and COM is the command part obtained so far."
(while (and (>= char ?0) (<= char ?9))
- (setq value (+ (* (if (numberp value) value 0) 10) (- char ?0)))
+ (setq value (+ (* (if (numberp value) value 0) 10) (- char ?0)))
(setq char (read-char)))
(setq prefix-arg value)
(if com (setq prefix-arg (cons prefix-arg com)))
(setq com char)
(setq char (read-char)))))))
(if (atom com)
- ;; com is a single char, so we construct prefix-arg
+ ;; com is a single char, so we construct prefix-arg
;; and if char is ?, describe prefix arg, otherwise exit by
;; pushing the char back
(progn
(setq unread-command-events (list char)))
;; as com is non-nil, this means that we have a command to execute
(if (or (= (car com) ?r) (= (car com) ?R))
- ;; execute apropriate region command.
+ ;; execute appropriate region command.
(let ((char (car com)) (com (cdr com)))
(setq prefix-arg (cons value com))
(if (= char ?r) (vip-region prefix-arg)
(interactive "P")
(condition-case conditions
(vip-prefix-arg-com
- last-command-char
+ last-command-char
(cond ((null arg) nil)
((consp arg) (car arg))
((numberp arg) arg)
(com (car (cdr (cdr vip-d-com))))
(reg (nth 3 vip-d-com)))
(if (null val) (setq val (car (cdr vip-d-com))))
- (if (null m-com) (error "No previous command to repeat."))
+ (if (null m-com) (error "No previous command to repeat"))
(setq vip-use-register reg)
(funcall m-com (cons val com)))))
each line in the region."
(setq vip-quote-string
(let ((str
- (vip-read-string (format "quote string \(default \"%s\"\): "
+ (vip-read-string (format "quote string (default %s): "
vip-quote-string))))
(if (string= str "") vip-quote-string str)))
(vip-enlarge-region (point) (mark))
(defun vip-end-with-a-newline-p (string)
"Check if the string ends with a newline."
- (or (string= text "")
+ (or (string= string "")
(= (aref string (1- (length string))) ?\n)))
+(defvar vip-save-minibuffer-local-map)
+
(defun vip-read-string (prompt &optional init)
- (setq save-minibuffer-local-map (copy-keymap minibuffer-local-map))
+ (setq vip-save-minibuffer-local-map (copy-keymap minibuffer-local-map))
(define-key minibuffer-local-map "\C-h" 'backward-char)
(define-key minibuffer-local-map "\C-w" 'backward-word)
(define-key minibuffer-local-map "\e" 'exit-minibuffer)
(condition-case conditions
(setq str (read-string prompt init))
(quit
- (setq minibuffer-local-map save-minibuffer-local-map)
+ (setq minibuffer-local-map vip-save-minibuffer-local-map)
(signal 'quit nil)))
- (setq minibuffer-local-map save-minibuffer-local-map)
+ (setq minibuffer-local-map vip-save-minibuffer-local-map)
str))
\f
command was invoked with argument > 1."
(let ((i-com (car vip-d-com)) (val (car (cdr vip-d-com))))
(if (and val (> val 1)) ;; first check that val is non-nil
- (progn
+ (progn
(setq vip-d-com (list i-com (1- val) ?r))
(vip-repeat nil)
(setq vip-d-com (list i-com val ?r))))))
(vip-change-subr (mark) (point))
(vip-change (mark) (point))))
(setq vip-d-com (list 'vip-substitute val ?r))))
-
+
(defun vip-substitute-line (arg)
"Substitute lines."
(interactive "p")
(interactive "P")
(let ((val (vip-p-val arg)))
(vip-line (cons val ?Y))))
-
+
\f
;; region command
(move-marker vip-com-point (point))
(exchange-point-and-mark)
(vip-execute-com 'vip-Region val com)))
-
+
(defun vip-replace-char (arg)
"Replace the following ARG chars by the character read."
(interactive "P")
(if (string= str "")
(progn
(setq vip-re-replace (not vip-re-replace))
- (message (format "Replace mode changed to %s."
- (if vip-re-replace "regexp replace"
- "string replace"))))
+ (message "Replace mode changed to %s."
+ (if vip-re-replace "regexp replace"
+ "string replace")))
(if vip-re-replace
;; (replace-regexp
;; str
(replace-match (vip-read-string
(format "Replace regexp \"%s\" with: " str))
nil nil))
- (replace-string
- str
- (vip-read-string (format "Replace \"%s\" with: " str)))))))
+ (with-no-warnings
+ (replace-string
+ str
+ (vip-read-string (format "Replace \"%s\" with: " str))))))))
\f
;; basic cursor movement. j, k, l, m commands.
(progn
(forward-char)
(vip-execute-com 'vip-end-of-word val com)))))
-
+
(defun vip-backward-word (arg)
"Backward word."
(interactive "P")
(defun vip-find-char-forward (arg)
"Find char on the line. If called interactively read the char to find
from the terminal, and if called from vip-repeat, the char last used is
-used. This behaviour is controlled by the sign of prefix numeric value."
+used. This behavior is controlled by the sign of prefix numeric value."
(interactive "P")
(let ((val (vip-p-val arg)) (com (vip-getcom arg)))
(if (> val 0)
(let ((com (vip-getcom arg)))
(if (numberp arg)
(if (or (> arg 99) (< arg 1))
- (error "Prefix must be between 1 and 99.")
+ (error "Prefix must be between 1 and 99")
(goto-char
(if (> (point-max) 80000)
(* (/ (point-max) 100) arg)
(if (string= vip-s-string "")
(progn
(setq vip-re-search (not vip-re-search))
- (message (format "Search mode changed to %s search."
- (if vip-re-search "regular expression"
- "vanilla"))))
+ (message "Search mode changed to %s search."
+ (if vip-re-search "regular expression"
+ "vanilla")))
(vip-search vip-s-string t val)
(if com
(progn
(if (string= vip-s-string "")
(progn
(setq vip-re-search (not vip-re-search))
- (message (format "Search mode changed to %s search."
- (if vip-re-search "regular expression"
- "vanilla"))))
+ (message "Search mode changed to %s search."
+ (if vip-re-search "regular expression"
+ "vanilla")))
(vip-search vip-s-string nil val)
(if com
(progn
"Repeat previous search."
(interactive "P")
(let ((val (vip-p-val arg)) (com (vip-getcom arg)))
- (if (null vip-s-string) (error "No previous search string."))
+ (if (null vip-s-string) (error "No previous search string"))
(vip-search vip-s-string vip-s-forward arg)
(if com (vip-execute-com 'vip-search-next val com))))
"Repeat previous search in the reverse direction."
(interactive "P")
(let ((val (vip-p-val arg)) (com (vip-getcom arg)))
- (if (null vip-s-string) (error "No previous search string."))
+ (if (null vip-s-string) (error "No previous search string"))
(vip-search vip-s-string (not vip-s-forward) arg)
(if com (vip-execute-com 'vip-search-Next val com))))
(if (null buffer-name)
(current-buffer)
(get-buffer buffer-name)))
- (if (null buffer) (error "Buffer %s nonexistent." buffer-name))
+ (if (null buffer) (error "Buffer %s nonexistent" buffer-name))
(if (or (not (buffer-modified-p buffer))
(y-or-n-p "Buffer is modified, are you sure? "))
(kill-buffer buffer)
- (error "Buffer not killed."))))
+ (error "Buffer not killed"))))
(defun vip-find-file ()
"Visit file in the current window."
\f
;; making small changes
+(defvar vip-c-string)
+
(defun vip-change (beg end)
- (setq c-string
+ (setq vip-c-string
(vip-read-string (format "%s => " (buffer-substring beg end))))
(vip-change-subr beg end))
(setq vip-use-register nil)))
(kill-region beg end)
(setq this-command 'vip-change)
- (insert c-string))
+ (insert vip-c-string))
\f
;; query replace
(backward-word arg)
(delete-region (point) (mark))))
-\f
-;; key bindings
-
-(set 'vip-mode-map (make-keymap))
-
-(define-key vip-mode-map "\C-a" 'beginning-of-line)
-(define-key vip-mode-map "\C-b" 'vip-scroll-back)
-(define-key vip-mode-map "\C-c" 'vip-ctl-c)
-(define-key vip-mode-map "\C-d" 'vip-scroll-up)
-(define-key vip-mode-map "\C-e" 'vip-scroll-up-one)
-(define-key vip-mode-map "\C-f" 'vip-scroll)
-(define-key vip-mode-map "\C-g" 'vip-keyboard-quit)
-(define-key vip-mode-map "\C-h" 'help-command)
-(define-key vip-mode-map "\C-m" 'vip-scroll-back)
-(define-key vip-mode-map "\C-n" 'vip-other-window)
-(define-key vip-mode-map "\C-o" 'vip-open-line-at-point)
-(define-key vip-mode-map "\C-u" 'vip-scroll-down)
-(define-key vip-mode-map "\C-x" 'vip-ctl-x)
-(define-key vip-mode-map "\C-y" 'vip-scroll-down-one)
-(define-key vip-mode-map "\C-z" 'vip-change-mode-to-emacs)
-(define-key vip-mode-map "\e" 'vip-ESC)
-
-(define-key vip-mode-map " " 'vip-scroll)
-(define-key vip-mode-map "!" 'vip-command-argument)
-(define-key vip-mode-map "\"" 'vip-command-argument)
-(define-key vip-mode-map "#" 'vip-command-argument)
-(define-key vip-mode-map "$" 'vip-goto-eol)
-(define-key vip-mode-map "%" 'vip-paren-match)
-(define-key vip-mode-map "&" 'vip-nil)
-(define-key vip-mode-map "'" 'vip-goto-mark-and-skip-white)
-(define-key vip-mode-map "(" 'vip-backward-sentence)
-(define-key vip-mode-map ")" 'vip-forward-sentence)
-(define-key vip-mode-map "*" 'call-last-kbd-macro)
-(define-key vip-mode-map "+" 'vip-next-line-at-bol)
-(define-key vip-mode-map "," 'vip-repeat-find-opposite)
-(define-key vip-mode-map "-" 'vip-previous-line-at-bol)
-(define-key vip-mode-map "." 'vip-repeat)
-(define-key vip-mode-map "/" 'vip-search-forward)
-
-(define-key vip-mode-map "0" 'vip-beginning-of-line)
-(define-key vip-mode-map "1" 'vip-digit-argument)
-(define-key vip-mode-map "2" 'vip-digit-argument)
-(define-key vip-mode-map "3" 'vip-digit-argument)
-(define-key vip-mode-map "4" 'vip-digit-argument)
-(define-key vip-mode-map "5" 'vip-digit-argument)
-(define-key vip-mode-map "6" 'vip-digit-argument)
-(define-key vip-mode-map "7" 'vip-digit-argument)
-(define-key vip-mode-map "8" 'vip-digit-argument)
-(define-key vip-mode-map "9" 'vip-digit-argument)
-
-(define-key vip-mode-map ":" 'vip-ex)
-(define-key vip-mode-map ";" 'vip-repeat-find)
-(define-key vip-mode-map "<" 'vip-command-argument)
-(define-key vip-mode-map "=" 'vip-command-argument)
-(define-key vip-mode-map ">" 'vip-command-argument)
-(define-key vip-mode-map "?" 'vip-search-backward)
-(define-key vip-mode-map "@" 'vip-nil)
-
-(define-key vip-mode-map "A" 'vip-Append)
-(define-key vip-mode-map "B" 'vip-backward-Word)
-(define-key vip-mode-map "C" 'vip-ctl-c-equivalent)
-(define-key vip-mode-map "D" 'vip-kill-line)
-(define-key vip-mode-map "E" 'vip-end-of-Word)
-(define-key vip-mode-map "F" 'vip-find-char-backward)
-(define-key vip-mode-map "G" 'vip-goto-line)
-(define-key vip-mode-map "H" 'vip-window-top)
-(define-key vip-mode-map "I" 'vip-Insert)
-(define-key vip-mode-map "J" 'vip-join-lines)
-(define-key vip-mode-map "K" 'vip-kill-buffer)
-(define-key vip-mode-map "L" 'vip-window-bottom)
-(define-key vip-mode-map "M" 'vip-window-middle)
-(define-key vip-mode-map "N" 'vip-search-Next)
-(define-key vip-mode-map "O" 'vip-Open-line)
-(define-key vip-mode-map "P" 'vip-Put-back)
-(define-key vip-mode-map "Q" 'vip-query-replace)
-(define-key vip-mode-map "R" 'vip-replace-string)
-(define-key vip-mode-map "S" 'vip-switch-to-buffer-other-window)
-(define-key vip-mode-map "T" 'vip-goto-char-backward)
-(define-key vip-mode-map "U" 'vip-nil)
-(define-key vip-mode-map "V" 'vip-find-file-other-window)
-(define-key vip-mode-map "W" 'vip-forward-Word)
-(define-key vip-mode-map "X" 'vip-ctl-x-equivalent)
-(define-key vip-mode-map "Y" 'vip-yank-line)
-(define-key vip-mode-map "ZZ" 'save-buffers-kill-emacs)
-
-(define-key vip-mode-map "[" 'vip-nil)
-(define-key vip-mode-map "\\" 'vip-escape-to-emacs)
-(define-key vip-mode-map "]" 'vip-nil)
-(define-key vip-mode-map "^" 'vip-bol-and-skip-white)
-(define-key vip-mode-map "_" 'vip-nil)
-(define-key vip-mode-map "`" 'vip-goto-mark)
-
-(define-key vip-mode-map "a" 'vip-append)
-(define-key vip-mode-map "b" 'vip-backward-word)
-(define-key vip-mode-map "c" 'vip-command-argument)
-(define-key vip-mode-map "d" 'vip-command-argument)
-(define-key vip-mode-map "e" 'vip-end-of-word)
-(define-key vip-mode-map "f" 'vip-find-char-forward)
-(define-key vip-mode-map "g" 'vip-info-on-file)
-(define-key vip-mode-map "h" 'vip-backward-char)
-(define-key vip-mode-map "i" 'vip-insert)
-(define-key vip-mode-map "j" 'vip-next-line)
-(define-key vip-mode-map "k" 'vip-previous-line)
-(define-key vip-mode-map "l" 'vip-forward-char)
-(define-key vip-mode-map "m" 'vip-mark-point)
-(define-key vip-mode-map "n" 'vip-search-next)
-(define-key vip-mode-map "o" 'vip-open-line)
-(define-key vip-mode-map "p" 'vip-put-back)
-(define-key vip-mode-map "q" 'vip-nil)
-(define-key vip-mode-map "r" 'vip-replace-char)
-(define-key vip-mode-map "s" 'vip-switch-to-buffer)
-(define-key vip-mode-map "t" 'vip-goto-char-forward)
-(define-key vip-mode-map "u" 'vip-undo)
-(define-key vip-mode-map "v" 'vip-find-file)
-(define-key vip-mode-map "w" 'vip-forward-word)
-(define-key vip-mode-map "x" 'vip-delete-char)
-(define-key vip-mode-map "y" 'vip-command-argument)
-(define-key vip-mode-map "zH" 'vip-line-to-top)
-(define-key vip-mode-map "zM" 'vip-line-to-middle)
-(define-key vip-mode-map "zL" 'vip-line-to-bottom)
-(define-key vip-mode-map "z\C-m" 'vip-line-to-top)
-(define-key vip-mode-map "z." 'vip-line-to-middle)
-(define-key vip-mode-map "z-" 'vip-line-to-bottom)
-
-(define-key vip-mode-map "{" 'vip-backward-paragraph)
-(define-key vip-mode-map "|" 'vip-goto-col)
-(define-key vip-mode-map "}" 'vip-forward-paragraph)
-(define-key vip-mode-map "~" 'vip-nil)
-(define-key vip-mode-map "\177" 'vip-delete-backward-char)
-
-(define-key ctl-x-map "3" 'vip-buffer-in-two-windows)
-(define-key ctl-x-map "\C-i" 'insert-file)
-
-(defun vip-version ()
- (interactive)
- (message "VIP version 3.5 of September 15, 1987"))
-
\f
;; implement ex commands
(cond ((string= ex-token-type "plus") "add-number")
((string= ex-token-type "minus") "sub-number")
(t "abs-number")))
- (setq ex-token (string-to-int (buffer-substring (point) (mark)))))
+ (setq ex-token (string-to-number (buffer-substring (point) (mark)))))
((looking-at "\\$")
(forward-char 1)
(setq ex-token-type "end"))
(setq ex-token-type "end-mark")
(setq ex-token "goto"))
(t
- (error "illegal token")))))
+ (error "invalid token")))))
(defun vip-ex (&optional string)
"ex commands within VIP."
(setq cont nil))
(t (error "Extra character at end of a command")))))))
((string= ex-token-type "non-command")
- (error (format "%s: Not an editor command" ex-token)))
+ (error "%s: Not an editor command" ex-token))
((string= ex-token-type "whole")
(setq ex-addresses
(cons (point-max) (cons (point-min) ex-addresses))))
(progn
(set-mark (point))
(re-search-forward "[0-9][0-9]*")
- (setq ex-count (string-to-int (buffer-substring (point) (mark))))
+ (setq ex-count (string-to-number (buffer-substring (point) (mark))))
(skip-chars-forward " \t")))
(if (looking-at "[pl#]")
(progn
(setq ex-flag t)
(forward-char 1)))
(if (not (looking-at "[\n|]"))
- (error "Illegal extra characters"))))
+ (error "Invalid extra characters"))))
(defun vip-get-ex-count ()
(setq ex-variant nil
(progn
(set-mark (point))
(re-search-forward "[0-9][0-9]*")
- (setq ex-count (string-to-int (buffer-substring (point) (mark))))
+ (setq ex-count (string-to-number (buffer-substring (point) (mark))))
(skip-chars-forward " \t")))
(if (looking-at "[pl#]")
(progn
(setq ex-flag t)
(forward-char 1)))
(if (not (looking-at "[\n|]"))
- (error "Illegal extra characters"))))
+ (error "Invalid extra characters"))))
(defun vip-get-ex-file ()
"get a file name and set ex-variant, ex-append and ex-offset if found"
(string= ex-token "insert")
(string= ex-token "open")
)
- (error (format "%s: no such command from VIP" ex-token)))
+ (error "%s: no such command from VIP" ex-token))
((or (string= ex-token "abbreviate")
(string= ex-token "list")
(string= ex-token "next")
(string= ex-token "xit")
(string= ex-token "z")
)
- (error (format "%s: not implemented in VIP" ex-token)))
- (t (error (format "%s: Not an editor command" ex-token)))))
+ (error "%s: not implemented in VIP" ex-token))
+ (t (error "%s: Not an editor command" ex-token))))
(defun ex-goto ()
"ex goto command"
(skip-chars-forward " \t")
(if (looking-at "[\n|]") (error "Missing rhs"))
(set-mark (point))
- (end-of-buffer)
+ (with-no-warnings
+ (end-of-buffer))
(backward-char 1)
(setq string (buffer-substring (mark) (point))))
(if (not (lookup-key ex-map char))
(setq file (buffer-substring (point) (mark)))))
(if variant
(shell-command command t)
- (insert-file file))))
+ (with-no-warnings
+ (insert-file file)))))
(defun ex-set ()
(eval (list 'setq
(vip-change-mode-to-emacs)
(shell))
-(defun ex-substitute (&optional repeat r-flag)
+(defun ex-substitute (&optional repeat r-flag)
"ex substitute.
If REPEAT use previous reg-exp which is ex-reg-exp or
vip-s-string"
(if (and (not (string= ex-file (buffer-file-name)))
(file-exists-p ex-file)
(not ex-variant))
- (error (format "\"%s\" File exists - use w! to override" ex-file)))
+ (error "\"%s\" File exists - use w! to override" ex-file))
(let ((end (car ex-addresses)) (beg (car (cdr ex-addresses))))
(if (> beg end) (error "First address exceeds second"))
(save-excursion
(point-min)
(if (null ex-addresses) (point-max) (car ex-addresses))))))
-(if (file-exists-p "~/.vip") (load "~/.vip"))
+(if (file-exists-p vip-startup-file) (load vip-startup-file))
+
+(provide 'vip)
+;;; arch-tag: bff623ef-48f7-41d4-9aa3-2e840c9ab415
;;; vip.el ends here