📄 vip.el
字号:
(text (if vip-use-register (if (and (<= ?1 vip-use-register) (<= vip-use-register ?9)) (nth (- vip-use-register 49) kill-ring-yank-pointer) (get-register vip-use-register)) (car kill-ring-yank-pointer)))) (if (null text) (if vip-use-register (let ((reg vip-use-register)) (setq vip-use-register nil) (error "Nothing in register %c" reg)) (error ""))) (setq vip-use-register nil) (if (vip-end-with-a-newline-p text) (progn (next-line 1) (beginning-of-line)) (if (and (not (eolp)) (not (eobp))) (forward-char))) (setq vip-d-com (list 'vip-put-back val nil vip-use-register)) (vip-loop val (vip-yank text))))(defun vip-Put-back (arg) "Put back at point/above line." (interactive "P") (let ((val (vip-p-val arg)) (text (if vip-use-register (if (and (<= ?1 vip-use-register) (<= vip-use-register ?9)) (nth (- vip-use-register 49) kill-ring-yank-pointer) (get-register vip-use-register)) (car kill-ring-yank-pointer)))) (if (null text) (if vip-use-register (let ((reg vip-use-register)) (setq vip-use-register nil) (error "Nothing in register %c" reg)) (error ""))) (setq vip-use-register nil) (if (vip-end-with-a-newline-p text) (beginning-of-line)) (setq vip-d-com (list 'vip-Put-back val nil vip-use-register)) (vip-loop val (vip-yank text))))(defun vip-delete-char (arg) "Delete character." (interactive "P") (let ((val (vip-p-val arg))) (setq vip-d-com (list 'vip-delete-char val nil)) (if vip-use-register (progn (if (and (<= ?A vip-use-register) (<= vip-use-register ?Z)) (vip-append-to-register (+ vip-use-register 32) (point) (- (point) val) nil) (copy-to-register vip-use-register (point) (- (point) val) nil)) (setq vip-use-register nil))) (delete-char val t)))(defun vip-delete-backward-char (arg) "Delete previous character." (interactive "P") (let ((val (vip-p-val arg))) (setq vip-d-com (list 'vip-delete-backward-char val nil)) (if vip-use-register (progn (if (and (<= ?A vip-use-register) (<= vip-use-register ?Z)) (vip-append-to-register (+ vip-use-register 32) (point) (+ (point) val) nil) (copy-to-register vip-use-register (point) (+ (point) val) nil)) (setq vip-use-register nil))) (delete-backward-char val t)));; join lines.(defun vip-join-lines (arg) "Join this line to next, if ARG is nil. Otherwise, join ARG lines" (interactive "*P") (let ((val (vip-P-val arg))) (setq vip-d-com (list 'vip-join-lines val nil)) (vip-loop (if (null val) 1 (1- val)) (progn (end-of-line) (if (not (eobp)) (progn (forward-line 1) (delete-region (point) (1- (point))) (fixup-whitespace)))))));; making small changes(defun vip-change (beg end) (setq c-string (vip-read-string (format "%s => " (buffer-substring beg end)))) (vip-change-subr beg end))(defun vip-change-subr (beg end) (if vip-use-register (progn (copy-to-register vip-use-register beg end nil) (setq vip-use-register nil))) (kill-region beg end) (setq this-command 'vip-change) (insert c-string));; query replace(defun vip-query-replace () "Query replace. If you supply null string as the string to be replaced,the query replace mode will toggle between string replace and regexp replace." (interactive) (let (str) (setq str (vip-read-string (if vip-re-query-replace "Query replace regexp: " "Query replace: "))) (if (string= str "") (progn (setq vip-re-query-replace (not vip-re-query-replace)) (message "Query replace mode changed to %s." (if vip-re-query-replace "regexp replace" "string replace"))) (if vip-re-query-replace (query-replace-regexp str (vip-read-string (format "Query replace regexp \"%s\" with: " str))) (query-replace str (vip-read-string (format "Query replace \"%s\" with: " str)))))));; marking(defun vip-mark-beginning-of-buffer () (interactive) (set-mark (point)) (goto-char (point-min)) (exchange-point-and-mark) (message "mark set at the beginning of buffer"))(defun vip-mark-end-of-buffer () (interactive) (set-mark (point)) (goto-char (point-max)) (exchange-point-and-mark) (message "mark set at the end of buffer"))(defun vip-mark-point (char) (interactive "c") (cond ((and (<= ?a char) (<= char ?z)) (point-to-register (- char (- ?a ?\C-a)))) ((= char ?<) (vip-mark-beginning-of-buffer)) ((= char ?>) (vip-mark-end-of-buffer)) ((= char ?.) (push-mark)) ((= char ?,) (set-mark-command 1)) ((= char ?D) (mark-defun)) (t (error ""))))(defun vip-goto-mark (arg) "Go to mark." (interactive "P") (let ((char (read-char)) (com (vip-getcom arg))) (vip-goto-mark-subr char com nil)))(defun vip-goto-mark-and-skip-white (arg) "Go to mark and skip to first non-white on line." (interactive "P") (let ((char (read-char)) (com (vip-getCom arg))) (vip-goto-mark-subr char com t)))(defun vip-goto-mark-subr (char com skip-white) (cond ((and (<= ?a char) (<= char ?z)) (let ((buff (current-buffer))) (if com (move-marker vip-com-point (point))) (goto-char (register-to-point (- char (- ?a ?\C-a)))) (if skip-white (back-to-indentation)) (vip-change-mode-to-vi) (if com (if (equal buff (current-buffer)) (vip-execute-com (if skip-white 'vip-goto-mark-and-skip-white 'vip-goto-mark) nil com) (switch-to-buffer buff) (goto-char vip-com-point) (vip-change-mode-to-vi) (error ""))))) ((and (not skip-white) (= char ?`)) (if com (move-marker vip-com-point (point))) (exchange-point-and-mark) (if com (vip-execute-com 'vip-goto-mark nil com))) ((and skip-white (= char ?')) (if com (move-marker vip-com-point (point))) (exchange-point-and-mark) (back-to-indentation) (if com (vip-execute-com 'vip-goto-mark-and-skip-white nil com))) (t (error ""))))(defun vip-exchange-point-and-mark () (interactive) (exchange-point-and-mark) (back-to-indentation))(defun vip-keyboard-quit () "Abort partially formed or running command." (interactive) (setq vip-use-register nil) (keyboard-quit))(defun vip-ctl-c-equivalent (arg) "Emulate C-c in Emacs mode." (interactive "P") (vip-ctl-key-equivalent "\C-c" arg))(defun vip-ctl-x-equivalent (arg) "Emulate C-x in Emacs mode." (interactive "P") (vip-ctl-key-equivalent "\C-x" arg))(defun vip-ctl-key-equivalent (key arg) (let ((char (read-char))) (if (and (<= ?A char) (<= char ?Z)) (setq char (- char (- ?A ?\C-a)))) (setq prefix-arg arg) (command-execute (vip-get-editor-command vip-emacs-local-map global-map (format "%s%s" key (char-to-string char)))))) ;; commands in insertion mode(defun vip-delete-backward-word (arg) "Delete previous word." (interactive "p") (save-excursion (set-mark (point)) (backward-word arg) (delete-region (point) (mark))));; 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"));; implement ex commands(defvar ex-token-type nil "type of token. if non-nil, gives type of address. if nil, itis a command.")(defvar ex-token nil "value of token.")(defvar ex-addresses nil "list of ex addresses")(defvar ex-flag nil "flag for ex flag")(defvar ex-buffer nil "name of ex buffer")(defvar ex-count nil "value of ex count")(defvar ex-g-flag nil "flag for global command")(defvar ex-g-variant nil "if t global command is executed on lines not matching ex-g-pat")(defvar ex-reg-exp nil "save reg-exp used in substitute")(defvar ex-repl nil "replace pattern for substitute")(defvar ex-g-pat nil "pattern for global command")(defvar ex-map (make-sparse-keymap) "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -