📄 vi.el
字号:
; Evi: Major mode for emulating "vi" editor under GNU Emacs.; Originally written by : seismo!wucs!nz@rsch.wisc.edu (Neal Ziring); Extensively redesigned and rewritten by wu@crys.wisc.edu (Felix S.T. Wu); Last revision: 01/07/87 Wed (for GNU Emacs 18.33);; INSTALLATION PROCEDURE:; 1) Add a global key binding for command "vi-mode" (I use ESC ESC instead of; the single ESC used in real "vi", so I can access other ESC prefixed emacs; commands while I'm in "vi"), say, by putting the following line in your; ".emacs" file:; (define-key global-map "\e\e" 'vi-mode) ;quick switch into vi-mode; 2) If you wish you can define "find-file-hooks" to enter "vi" automatically; after a file is loaded into the buffer. For example, I defined it as:; (setq find-file-hooks (list; (function (lambda (); (if (not (or (eq major-mode 'Info-mode); (eq major-mode 'vi-mode))); (vi-mode)))))); 3) In your .emacs file you can define the command "vi-mode" to be "autoload"; or you can execute the "load" command to load "vi" directly.; 4) Read the comments for command "vi-mode" before you start using it. ;; COULD DO; 1). A general 'define-operator' function to replace current hack; 2). In operator handling, should allow other point moving Emacs commands; (such as ESC <, ESC >) to be used as arguments.;(defun vi-switch-mode (arg mode-char) "Switch the major mode of current buffer as specified by the following char \\{vi-tilde-map}" (interactive "P\nc") (let ((mode-cmd (lookup-key vi-tilde-map (char-to-string mode-char)))) (if (null mode-cmd) (with-output-to-temp-buffer "*Help*" (princ (substitute-command-keys "Possible major modes to switch to: \\{vi-tilde-map}"))) (setq prefix-arg arg) ; prefix arg will be passed down (command-execute mode-cmd nil) ; may need to save mode-line-format etc (set-buffer-modified-p (buffer-modified-p))))) ; just in case(if (null (where-is-internal 'vi-switch-mode (current-local-map))) (define-key ctl-x-map "~" 'vi-switch-mode))(defvar vi-tilde-map nil "Keymap used for \\[vi-switch-mode] prefix key. Link to various major modes.")(if vi-tilde-map nil (setq vi-tilde-map (make-keymap)) (define-key vi-tilde-map "a" 'abbrev-mode) (define-key vi-tilde-map "c" 'c-mode) (define-key vi-tilde-map "d" 'vi-debugging) (define-key vi-tilde-map "e" 'emacs-lisp-mode) (define-key vi-tilde-map "f" 'auto-fill-mode) (define-key vi-tilde-map "g" 'prolog-mode) (define-key vi-tilde-map "h" 'hanoi) (define-key vi-tilde-map "i" 'info-mode) (define-key vi-tilde-map "l" 'lisp-mode) (define-key vi-tilde-map "n" 'nroff-mode) (define-key vi-tilde-map "o" 'overwrite-mode) (define-key vi-tilde-map "O" 'outline-mode) (define-key vi-tilde-map "P" 'picture-mode) (define-key vi-tilde-map "r" 'vi-readonly-mode) (define-key vi-tilde-map "t" 'text-mode) (define-key vi-tilde-map "v" 'vi-mode) (define-key vi-tilde-map "x" 'tex-mode) (define-key vi-tilde-map "~" 'vi-back-to-old-mode))(defun vi-debugging (arg) "Toggle debug-on-error flag. If prefix arg is given, set t." (interactive "P") (if arg (setq debug-on-error t) (setq debug-on-error (not debug-on-error))) (if debug-on-error (message "Debug-on-error ...") (message "NO more debug-on-error")))(defun vi-back-to-old-mode () "Go back to the previous mode without setting up for insertion." (interactive) (if vi-mode-old-major-mode (progn (setq mode-name vi-mode-old-mode-name) (use-local-map vi-mode-old-local-map) (setq major-mode vi-mode-old-major-mode) (setq case-fold-search vi-mode-old-case-fold) (set-buffer-modified-p (buffer-modified-p)))))(defun vi-readonly-mode () "Toggle current buffer's readonly flag." (interactive) (setq buffer-read-only (not buffer-read-only)))(defvar vi-com-map nil "Keymap used in Evi's command stateCommand state includes most of the vi editing commands, with some Emacscommand extensions.")(put 'vi-undefined 'suppress-keymap t)(if vi-com-map nil (setq vi-com-map (make-keymap));;(fillarray vi-com-map 'vi-undefined) (define-key vi-com-map "\C-@" 'vi-mark-region) ; extension (define-key vi-com-map "\C-a" 'vi-ask-for-info) ; extension (define-key vi-com-map "\C-b" 'vi-backward-windowfull) (define-key vi-com-map "\C-c" 'vi-do-old-mode-C-c-command) ; extension (define-key vi-com-map "\C-d" 'vi-scroll-down-window) (define-key vi-com-map "\C-e" 'vi-expose-line-below) (define-key vi-com-map "\C-f" 'vi-forward-windowfull) (define-key vi-com-map "\C-g" 'keyboard-quit) (define-key vi-com-map "\C-i" 'indent-relative-maybe) ; TAB (define-key vi-com-map "\C-j" 'vi-next-line) ; LFD (define-key vi-com-map "\C-k" 'vi-kill-line) ; extension (define-key vi-com-map "\C-l" 'recenter) (define-key vi-com-map "\C-m" 'vi-next-line-first-nonwhite) ; RET (define-key vi-com-map "\C-n" 'vi-next-line) (define-key vi-com-map "\C-o" 'vi-split-open-line) (define-key vi-com-map "\C-p" 'previous-line) (define-key vi-com-map "\C-q" 'vi-query-replace) ; extension (define-key vi-com-map "\C-r" 'vi-isearch-backward) ; modification (define-key vi-com-map "\C-s" 'vi-isearch-forward) ; extension (define-key vi-com-map "\C-t" 'vi-transpose-objects) ; extension (define-key vi-com-map "\C-u" 'vi-scroll-up-window) (define-key vi-com-map "\C-v" 'scroll-up) ; extension (define-key vi-com-map "\C-w" 'vi-kill-region) ; extension (define-key vi-com-map "\C-x" 'Control-X-prefix) ; extension (define-key vi-com-map "\C-y" 'vi-expose-line-above) (define-key vi-com-map "\C-z" 'suspend-emacs) (define-key vi-com-map "\e" 'ESC-prefix); C-[ (ESC) (define-key vi-com-map "\C-\\" 'vi-unimplemented) (define-key vi-com-map "\C-]" 'find-tag) (define-key vi-com-map "\C-^" 'vi-locate-def) ; extension (define-key vi-com-map "\C-_" 'vi-undefined) (define-key vi-com-map " " 'forward-char) (define-key vi-com-map "!" 'vi-operator) (define-key vi-com-map "\"" 'vi-char-argument) (define-key vi-com-map "#" 'universal-argument) ; extension (define-key vi-com-map "$" 'end-of-line) (define-key vi-com-map "%" 'vi-find-matching-paren) (define-key vi-com-map "&" 'vi-unimplemented) (define-key vi-com-map "'" 'vi-goto-line-mark) (define-key vi-com-map "(" 'backward-sexp) (define-key vi-com-map ")" 'forward-sexp) (define-key vi-com-map "*" 'vi-name-last-change-or-macro) ; extension (define-key vi-com-map "+" 'vi-next-line-first-nonwhite) (define-key vi-com-map "," 'vi-reverse-last-find-char) (define-key vi-com-map "-" 'vi-previous-line-first-nonwhite) (define-key vi-com-map "." 'vi-redo-last-change-command) (define-key vi-com-map "/" 'vi-search-forward) (define-key vi-com-map "0" 'beginning-of-line) (define-key vi-com-map "1" 'vi-digit-argument) (define-key vi-com-map "2" 'vi-digit-argument) (define-key vi-com-map "3" 'vi-digit-argument) (define-key vi-com-map "4" 'vi-digit-argument) (define-key vi-com-map "5" 'vi-digit-argument) (define-key vi-com-map "6" 'vi-digit-argument) (define-key vi-com-map "7" 'vi-digit-argument) (define-key vi-com-map "8" 'vi-digit-argument) (define-key vi-com-map "9" 'vi-digit-argument) (define-key vi-com-map ":" 'vi-ex-cmd) (define-key vi-com-map ";" 'vi-repeat-last-find-char) (define-key vi-com-map "<" 'vi-operator) (define-key vi-com-map "=" 'vi-operator) (define-key vi-com-map ">" 'vi-operator) (define-key vi-com-map "?" 'vi-search-backward) (define-key vi-com-map "@" 'vi-call-named-change-or-macro) ; extension (define-key vi-com-map "A" 'vi-append-at-end-of-line) (define-key vi-com-map "B" 'vi-backward-blank-delimited-word) (define-key vi-com-map "C" 'vi-change-rest-of-line) (define-key vi-com-map "D" 'vi-kill-line) (define-key vi-com-map "E" 'vi-end-of-blank-delimited-word) (define-key vi-com-map "F" 'vi-backward-find-char) (define-key vi-com-map "G" 'vi-goto-line) (define-key vi-com-map "H" 'vi-home-window-line) (define-key vi-com-map "I" 'vi-insert-before-first-nonwhite) (define-key vi-com-map "J" 'vi-join-lines) (define-key vi-com-map "K" 'vi-undefined) (define-key vi-com-map "L" 'vi-last-window-line) (define-key vi-com-map "M" 'vi-middle-window-line) (define-key vi-com-map "N" 'vi-reverse-last-search) (define-key vi-com-map "O" 'vi-open-above) (define-key vi-com-map "P" 'vi-put-before) (define-key vi-com-map "Q" 'vi-quote-words) ; extension (define-key vi-com-map "R" 'vi-replace-chars) (define-key vi-com-map "S" 'vi-substitute-lines) (define-key vi-com-map "T" 'vi-backward-upto-char) (define-key vi-com-map "U" 'vi-unimplemented) (define-key vi-com-map "V" 'vi-undefined) (define-key vi-com-map "W" 'vi-forward-blank-delimited-word) (define-key vi-com-map "X" 'call-last-kbd-macro) ; modification/extension (define-key vi-com-map "Y" 'vi-yank-line) (define-key vi-com-map "Z" (make-sparse-keymap)) ;allow below prefix command (define-key vi-com-map "ZZ" 'vi-save-all-and-exit) (define-key vi-com-map "[" 'vi-unimplemented) (define-key vi-com-map "\\" 'vi-operator) ; extension for vi-narrow-op (define-key vi-com-map "]" 'vi-unimplemented) (define-key vi-com-map "^" 'back-to-indentation) (define-key vi-com-map "_" 'vi-undefined) (define-key vi-com-map "`" 'vi-goto-char-mark) (define-key vi-com-map "a" 'vi-insert-after) (define-key vi-com-map "b" 'backward-word) (define-key vi-com-map "c" 'vi-operator) (define-key vi-com-map "d" 'vi-operator) (define-key vi-com-map "e" 'vi-end-of-word) (define-key vi-com-map "f" 'vi-forward-find-char) (define-key vi-com-map "g" 'vi-beginning-of-buffer) ; extension (define-key vi-com-map "h" 'backward-char) (define-key vi-com-map "i" 'vi-insert-before) (define-key vi-com-map "j" 'vi-next-line) (define-key vi-com-map "k" 'previous-line) (define-key vi-com-map "l" 'forward-char) (define-key vi-com-map "m" 'vi-set-mark) (define-key vi-com-map "n" 'vi-repeat-last-search) (define-key vi-com-map "o" 'vi-open-below) (define-key vi-com-map "p" 'vi-put-after) (define-key vi-com-map "q" 'vi-replace) (define-key vi-com-map "r" 'vi-replace-1-char) (define-key vi-com-map "s" 'vi-substitute-chars) (define-key vi-com-map "t" 'vi-forward-upto-char) (define-key vi-com-map "u" 'undo) (define-key vi-com-map "v" 'vi-verify-spelling) (define-key vi-com-map "w" 'vi-forward-word) (define-key vi-com-map "x" 'vi-kill-char) (define-key vi-com-map "y" 'vi-operator) (define-key vi-com-map "z" 'vi-adjust-window) (define-key vi-com-map "{" 'backward-paragraph) (define-key vi-com-map "|" 'vi-goto-column) (define-key vi-com-map "}" 'forward-paragraph) (define-key vi-com-map "~" 'vi-change-case) (define-key vi-com-map "\177" 'delete-backward-char))(put 'backward-char 'point-moving-unit 'char)(put 'vi-next-line 'point-moving-unit 'line)(put 'next-line 'point-moving-unit 'line)(put 'forward-line 'point-moving-unit 'line)(put 'previous-line 'point-moving-unit 'line)(put 'vi-isearch-backward 'point-moving-unit 'search)(put 'vi-search-backward 'point-moving-unit 'search)(put 'vi-isearch-forward 'point-moving-unit 'search)(put 'vi-search-forward 'point-moving-unit 'search)(put 'forward-char 'point-moving-unit 'char)(put 'end-of-line 'point-moving-unit 'char)(put 'vi-find-matching-paren 'point-moving-unit 'match)(put 'vi-goto-line-mark 'point-moving-unit 'line)(put 'backward-sexp 'point-moving-unit 'sexp)(put 'forward-sexp 'point-moving-unit 'sexp)(put 'vi-next-line-first-nonwhite 'point-moving-unit 'line)(put 'vi-previous-line-first-nonwhite 'point-moving-unit 'line)(put 'vi-reverse-last-find-char 'point-moving-unit 'rev-find)(put 'vi-re-search-forward 'point-moving-unit 'search)(put 'beginning-of-line 'point-moving-unit 'char)(put 'vi-beginning-of-buffer 'point-moving-unit 'char)(put 'vi-repeat-last-find-char 'point-moving-unit 'find)(put 'vi-re-search-backward 'point-moving-unit 'search)(put 'vi-backward-blank-delimited-word 'point-moving-unit 'WORD)(put 'vi-end-of-blank-delimited-word 'point-moving-unit 'match)(put 'vi-backward-find-char 'point-moving-unit 'find)(put 'vi-goto-line 'point-moving-unit 'line)(put 'vi-home-window-line 'point-moving-unit 'line)(put 'vi-last-window-line 'point-moving-unit 'line)(put 'vi-middle-window-line 'point-moving-unit 'line)(put 'vi-reverse-last-search 'point-moving-unit 'rev-search)(put 'vi-backward-upto-char 'point-moving-unit 'find)(put 'vi-forward-blank-delimited-word 'point-moving-unit 'WORD)(put 'back-to-indentation 'point-moving-unit 'char)(put 'vi-goto-char-mark 'point-moving-unit 'char)(put 'backward-word 'point-moving-unit 'word)(put 'vi-end-of-word 'point-moving-unit 'match)(put 'vi-forward-find-char 'point-moving-unit 'find)(put 'backward-char 'point-moving-unit 'char)(put 'vi-forward-char 'point-moving-unit 'char)(put 'vi-repeat-last-search 'point-moving-unit 'search)(put 'vi-forward-upto-char 'point-moving-unit 'find)(put 'vi-forward-word 'point-moving-unit 'word)(put 'vi-goto-column 'point-moving-unit 'match)(put 'forward-paragraph 'point-moving-unit 'paragraph)(put 'backward-paragraph 'point-moving-unit 'paragraph);;; region mark commands(put 'mark-page 'point-moving-unit 'region)(put 'mark-paragraph 'point-moving-unit 'region)(put 'mark-word 'point-moving-unit 'region)(put 'mark-sexp 'point-moving-unit 'region)(put 'mark-defun 'point-moving-unit 'region)(put 'mark-whole-buffer 'point-moving-unit 'region)(put 'mark-end-of-sentence 'point-moving-unit 'region)(put 'mark-c-function 'point-moving-unit 'region);;;(defvar vi-mark-alist nil "Alist of (NAME . MARK), marks are local to each buffer.")(defvar vi-scroll-amount (/ (window-height) 2) "Default amount of lines for scrolling (used by "^D"/"^U").")(defvar vi-shift-width 4 "Shift amount for "<"/">" operators.")(defvar vi-ins-point nil ; integer "Last insertion point. Should use 'mark' instead.")(defvar vi-ins-length nil ; integer "Length of last insertion.")(defvar vi-ins-repetition nil ; integer "The repetition required for last insertion.")(defvar vi-ins-overwrt-p nil ; boolean "T if last insertion was a replace actually.")(defvar vi-ins-prefix-code nil ; ready-to-eval sexp "Code to be eval'ed before (redo-)insertion begins.")(defvar vi-last-find-char nil ; cons cell "Save last direction, char and upto-flag used for char finding.")(defvar vi-last-change-command nil ; cons cell "Save commmands for redoing last changes. Each command is in (FUNC . ARGS)form that is ready to be 'apply'ed.")(defvar vi-last-shell-command nil ; last shell op command line "Save last shell command given for \"!\" operator.")(defvar vi-insert-state nil ; boolean "T if it is in insert state."); in "loaddefs.el";(defvar search-last-string "" ; "Last string search for by a search command.")(defvar vi-search-last-command nil ; (re-)search-forward(backward) "Save last search command for possible redo.")(defvar vi-mode-old-local-map nil "Save the local-map used before entering vi-mode.")(defvar vi-mode-old-mode-name nil "Save the mode-name before entering vi-mode.") (defvar vi-mode-old-major-mode nil "Save the major-mode before entering vi-mode.")(defvar vi-mode-old-case-fold nil) ;(defconst vi-add-to-mode-line-1; '(overwrite-mode nil " Insert"));; Value is same as vi-add-to-mode-line-1 when in vi mode,;; but nil in other buffers.;(defvar vi-add-to-mode-line nil)(defun vi-mode-setup () "Setup a buffer for vi-mode by creating necessary buffer-local variables."
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -