📄 psvn.el
字号:
svn-status-info))(defun svn-parse-status-result () "Parse the *svn-process* buffer.The results are used to build the `svn-status-info' variable." (setq svn-status-head-revision nil) (save-excursion (let ((old-ui-information (svn-status-ui-information-hash-table)) (svn-marks) (svn-file-mark) (svn-property-mark) (svn-locked-mark) (svn-with-history-mark) (svn-switched-mark) (svn-update-mark) (local-rev) (last-change-rev) (author) (path) (dir) (revision-width svn-status-default-revision-width) (author-width svn-status-default-author-width) (svn-marks-length (if (and svn-status-verbose svn-status-remote) 8 5)) (dir-set '("."))) (set-buffer "*svn-process*") (setq svn-status-info nil) (goto-char (point-min)) (while (< (point) (point-max)) (cond ((= (svn-point-at-eol) (svn-point-at-bol)) ;skip blank lines nil) ((looking-at "Status against revision:[ ]+\\([0-9]+\\)") ;; the above message appears for the main listing plus once for each svn:externals entry (unless svn-status-head-revision (setq svn-status-head-revision (match-string 1)))) ((looking-at "Performing status on external item at '\\(.*\\)'") ;; The *next* line has info about the directory named in svn:externals ;; [ie the directory in (match-string 1)] ;; we should parse it, and merge the info with what we have already know ;; but for now just ignore the line completely (forward-line) ) (t (setq svn-marks (buffer-substring (point) (+ (point) svn-marks-length)) svn-file-mark (elt svn-marks 0) ; 1st column - M,A,C,D,G,? etc svn-property-mark (elt svn-marks 1) ; 2nd column - M,C (properties) svn-locked-mark (elt svn-marks 2) ; 3rd column - L or blank svn-with-history-mark (elt svn-marks 3) ; 4th column - + or blank svn-switched-mark (elt svn-marks 4)) ; 5th column - S or blank (if (and svn-status-verbose svn-status-remote) (setq svn-update-mark (elt svn-marks 7))) ; 8th column - * or blank (when (eq svn-property-mark ?\ ) (setq svn-property-mark nil)) (when (eq svn-locked-mark ?\ ) (setq svn-locked-mark nil)) (when (eq svn-with-history-mark ?\ ) (setq svn-with-history-mark nil)) (when (eq svn-switched-mark ?\ ) (setq svn-switched-mark nil)) (when (eq svn-update-mark ?\ ) (setq svn-update-mark nil)) (forward-char svn-marks-length) (skip-chars-forward " ") (cond ((looking-at "\\([-?]\\|[0-9]+\\) +\\([-?]\\|[0-9]+\\) +\\([^ ]+\\) *\\(.+\\)$") (setq local-rev (svn-parse-rev-num (match-string 1)) last-change-rev (svn-parse-rev-num (match-string 2)) author (match-string 3) path (match-string 4))) ((looking-at "\\([-?]\\|[0-9]+\\) +\\([^ ]+\\)$") (setq local-rev (svn-parse-rev-num (match-string 1)) last-change-rev -1 author "?" path (match-string 2))) ((looking-at "\\(.*\\)") (setq path (match-string 1) local-rev -1 last-change-rev -1 author (if (eq svn-file-mark 88) "" "?"))) ;clear author of svn:externals dirs (t (error "Unknown status line format"))) (unless path (setq path ".")) (setq dir (file-name-directory path)) (if (and (not svn-status-verbose) dir) (let ((dirname (directory-file-name dir))) (if (not (member dirname dir-set)) (setq dir-set (cons dirname dir-set))))) (setq svn-status-info (cons (list (or (gethash path old-ui-information) (svn-status-make-ui-status)) svn-file-mark svn-property-mark path local-rev last-change-rev author svn-update-mark svn-locked-mark svn-with-history-mark svn-switched-mark) svn-status-info)) (setq revision-width (max revision-width (length (number-to-string local-rev)) (length (number-to-string last-change-rev)))) (setq author-width (max author-width (length author))))) (forward-line 1)) (unless svn-status-verbose (setq svn-status-info (svn-status-make-dummy-dirs dir-set old-ui-information))) (setq svn-status-default-column (+ 6 revision-width revision-width author-width (if svn-status-short-mod-flag-p 3 0))) (setq svn-status-line-format (format " %%c%%c%%c %%%ds %%%ds %%-%ds" revision-width revision-width author-width)) (setq svn-status-info (nreverse svn-status-info)) (when svn-status-sort-status-buffer (setq svn-status-info (sort svn-status-info 'svn-status-sort-predicate))))));;(string-lessp "." "%") => nil;(svn-status-sort-predicate '(t t t ".") '(t t t "%")) => t(defun svn-status-sort-predicate (a b) "Return t if A should appear before B in the `svn-status-buffer-name' buffer.A and B must be line-info's." (string-lessp (concat (svn-status-line-info->full-path a) "/") (concat (svn-status-line-info->full-path b) "/")))(defun svn-status-remove-temp-file-maybe () "Remove any (no longer required) temporary files created by psvn.el." (when svn-status-temp-file-to-remove (when (file-exists-p svn-status-temp-file-to-remove) (delete-file svn-status-temp-file-to-remove)) (when (file-exists-p svn-status-temp-arg-file) (delete-file svn-status-temp-arg-file)) (setq svn-status-temp-file-to-remove nil)))(defun svn-status-remove-control-M () "Remove ^M at end of line in the whole buffer." (interactive) (let ((buffer-read-only nil)) (save-match-data (save-excursion (goto-char (point-min)) (while (re-search-forward "\r$" (point-max) t) (replace-match "" nil nil))))))(condition-case nil ;;(easy-menu-add-item nil '("tools") ["SVN Status" svn-status t] "PCL-CVS") (easy-menu-add-item nil '("tools") ["SVN Status" svn-status t]) (error (message "psvn: could not install menu")))(defvar svn-status-mode-map () "Keymap used in `svn-status-mode' buffers.")(put 'svn-status-mode-map 'risky-local-variable t) ;for Emacs 20.7(defvar svn-status-mode-mark-map () "Subkeymap used in `svn-status-mode' for mark commands.")(put 'svn-status-mode-mark-map 'risky-local-variable t) ;for Emacs 20.7(defvar svn-status-mode-property-map () "Subkeymap used in `svn-status-mode' for property commands.")(put 'svn-status-mode-property-map 'risky-local-variable t) ;for Emacs 20.7(defvar svn-status-mode-options-map () "Subkeymap used in `svn-status-mode' for option commands.")(put 'svn-status-mode-options-map 'risky-local-variable t) ;for Emacs 20.7(defvar svn-status-mode-trac-map () "Subkeymap used in `svn-status-mode' for trac issue tracker commands.")(put 'svn-status-mode-trac-map 'risky-local-variable t) ;for Emacs 20.7(defvar svn-status-mode-extension-map () "Subkeymap used in `svn-status-mode' for some seldom used commands.")(put 'svn-status-mode-extension-map 'risky-local-variable t) ;for Emacs 20.7(when (not svn-status-mode-map) (setq svn-status-mode-map (make-sparse-keymap)) (suppress-keymap svn-status-mode-map) ;; Don't use (kbd "<return>"); it's unreachable with GNU Emacs 21.3 on a TTY. (define-key svn-status-mode-map (kbd "RET") 'svn-status-find-file-or-examine-directory) (define-key svn-status-mode-map (kbd "<mouse-2>") 'svn-status-mouse-find-file-or-examine-directory) (define-key svn-status-mode-map (kbd "^") 'svn-status-examine-parent) (define-key svn-status-mode-map (kbd "s") 'svn-status-show-process-buffer) (define-key svn-status-mode-map (kbd "f") 'svn-status-find-files) (define-key svn-status-mode-map (kbd "o") 'svn-status-find-file-other-window) (define-key svn-status-mode-map (kbd "v") 'svn-status-view-file-other-window) (define-key svn-status-mode-map (kbd "e") 'svn-status-toggle-edit-cmd-flag) (define-key svn-status-mode-map (kbd "g") 'svn-status-update) (define-key svn-status-mode-map (kbd "M-s") 'svn-status-update) ;; PCL-CVS compatibility (define-key svn-status-mode-map (kbd "q") 'svn-status-bury-buffer) (define-key svn-status-mode-map (kbd "h") 'svn-status-use-history) (define-key svn-status-mode-map (kbd "m") 'svn-status-set-user-mark) (define-key svn-status-mode-map (kbd "u") 'svn-status-unset-user-mark) ;; This matches a binding of `dired-unmark-all-files' in `dired-mode-map' ;; of both GNU Emacs and XEmacs. It seems unreachable with XEmacs on ;; TTY, but if that's a problem then its Dired needs fixing too. ;; Or you could just use "*!". (define-key svn-status-mode-map "\M-\C-?" 'svn-status-unset-all-usermarks) ;; The key that normally deletes characters backwards should here ;; instead unmark files backwards. In GNU Emacs, that would be (kbd ;; "DEL") aka [?\177], but XEmacs treats those as [(delete)] and ;; would bind a key that normally deletes forwards. [(backspace)] ;; is unreachable with GNU Emacs on a tty. Try to recognize the ;; dialect and act accordingly. ;; ;; XEmacs has a `delete-forward-p' function that checks the ;; `delete-key-deletes-forward' option. We don't use those, for two ;; reasons: psvn.el may be loaded before user customizations, and ;; XEmacs allows simultaneous connections to multiple devices with ;; different keyboards. (define-key svn-status-mode-map (if (member (kbd "DEL") '([(delete)] [delete])) [(backspace)] ; XEmacs (kbd "DEL")) ; GNU Emacs 'svn-status-unset-user-mark-backwards) (define-key svn-status-mode-map (kbd "$") 'svn-status-toggle-elide) (define-key svn-status-mode-map (kbd "w") 'svn-status-copy-filename-as-kill) (define-key svn-status-mode-map (kbd ".") 'svn-status-goto-root-or-return) (define-key svn-status-mode-map (kbd "I") 'svn-status-parse-info) (define-key svn-status-mode-map (kbd "V") 'svn-status-svnversion) (define-key svn-status-mode-map (kbd "?") 'svn-status-toggle-hide-unknown) (define-key svn-status-mode-map (kbd "_") 'svn-status-toggle-hide-unmodified) (define-key svn-status-mode-map (kbd "a") 'svn-status-add-file) (define-key svn-status-mode-map (kbd "A") 'svn-status-add-file-recursively) (define-key svn-status-mode-map (kbd "+") 'svn-status-make-directory) (define-key svn-status-mode-map (kbd "R") 'svn-status-mv) (define-key svn-status-mode-map (kbd "D") 'svn-status-rm) (define-key svn-status-mode-map (kbd "c") 'svn-status-commit) (define-key svn-status-mode-map (kbd "M-c") 'svn-status-cleanup) (define-key svn-status-mode-map (kbd "U") 'svn-status-update-cmd) (define-key svn-status-mode-map (kbd "M-u") 'svn-status-update-cmd) (define-key svn-status-mode-map (kbd "r") 'svn-status-revert) (define-key svn-status-mode-map (kbd "l") 'svn-status-show-svn-log) (define-key svn-status-mode-map (kbd "i") 'svn-status-info) (define-key svn-status-mode-map (kbd "b") 'svn-status-blame) (define-key svn-status-mode-map (kbd "=") 'svn-status-show-svn-diff) ;; [(control ?=)] is unreachable on TTY, but you can use "*u" instead. ;; (Is the "u" mnemonic for something?) (define-key svn-status-mode-map (kbd "C-=") 'svn-status-show-svn-diff-for-marked-files) (define-key svn-status-mode-map (kbd "~") 'svn-status-get-specific-revision) (define-key svn-status-mode-map (kbd "E") 'svn-status-ediff-with-revision) (define-key svn-status-mode-map (kbd "C-n") 'svn-status-next-line) (define-key svn-status-mode-map (kbd "C-p") 'svn-status-previous-line) (define-key svn-status-mode-map (kbd "n") 'svn-status-next-line) (define-key svn-status-mode-map (kbd "p") 'svn-status-previous-line) (define-key svn-status-mode-map (kbd "<down>") 'svn-status-next-line) (define-key svn-status-mode-map (kbd "<up>") 'svn-status-previous-line) (define-key svn-status-mode-map (kbd "C-x C-j") 'svn-status-dired-jump) (define-key svn-status-mode-map [down-mouse-3] 'svn-status-popup-menu) (setq svn-status-mode-mark-map (make-sparse-keymap)) (define-key svn-status-mode-map (kbd "*") svn-status-mode-mark-map) (define-key svn-status-mode-mark-map (kbd "!") 'svn-status-unset-all-usermarks) (define-key svn-status-mode-mark-map (kbd "?") 'svn-status-mark-unknown) (define-key svn-status-mode-mark-map (kbd "A") 'svn-status-mark-added) (define-key svn-status-mode-mark-map (kbd "M") 'svn-status-mark-modified) (define-key svn-status-mode-mark-map (kbd "D") 'svn-status-mark-deleted) (define-key svn-status-mode-mark-map (kbd "*") 'svn-status-mark-changed) (define-key svn-status-mode-mark-map (kbd "u") 'svn-status-show-svn-diff-for-marked-files))(when (not svn-status-mode-property-map) (setq svn-status-mode-property-map (make-sparse-keymap)) (define-key svn-status-mode-property-map (kbd "l") 'svn-status-property-list) (define-key svn-status-mode-property-map (kbd "s") 'svn-status-property-set) (define-key svn-status-mode-property-map (kbd "d") 'svn-status-property-delete) (define-key svn-status-mode-property-map (kbd "e") 'svn-status-property-edit-one-entry) (define-key svn-status-mode-property-map (kbd "i") 'svn-status-property-ignore-file) (define-key svn-status-mode-property-map (kbd "I") 'svn-status-property-ignore-file-extension) ;; XEmacs 21.4.15 on TTY (vt420) converts `C-i' to `TAB', ;; which [(control ?i)] won't match. Handle it separately. ;; On GNU Emacs, the following two forms bind the same key, ;; reducing clutter in `where-is'. (define-key svn-status-mode-property-map [(control ?i)] 'svn-status-property-edit-svn-ignore) (define-key svn-status-mode-property-map (kbd "TAB") 'svn-status-property-edit-svn-ignore) (define-key svn-status-mode-property-map (kbd "k") 'svn-status-property-set-keyword-list) (define-key svn-status-mode-property-map (kbd "y") 'svn-status-property-set-eol-style) (define-key svn-status-mode-property-map (kbd "x") 'svn-status-property-set-executable) ;; TODO: Why is `svn-status-select-line' in `svn-status-mode-property-map'? (define-key svn-status-mode-property-map (kbd "RET") 'svn-status-select-line) (define-key svn-status-mode-map (kbd "P") svn-status-mode-property-map))(when (not svn-status-mode-extension-map) (setq svn-status-mode-extension-map (make-sparse-keymap)) (define-key svn-status-mode-extension-map (kbd "v") 'svn-status-resolved) (define-key svn-status-mode-extension-map (kbd "X") 'svn-status-resolve-conflicts) (define-key svn-status-mode-extension-map (kbd "e") 'svn-status-export) (define-key svn-status-mode-map (kbd "X") svn-status-mode-extension-map))(when (not svn-status-mode-options-map) (setq svn-status-mode-options-map (make-sparse-keymap)) (define-key svn-status-mode-options-map (kbd "s") 'svn-status-save-state) (define-key svn-status-mode-options-map (kbd "l") 'svn-status-load-state) (define-key svn-status-mode-options-map (kbd "x") 'svn-status-toggle-sort-status-buffer) (define-key svn-status-mode-options-map (kbd "f") 'svn-status-toggle-display-full-path) (define-key svn-status-mode-options-map (kbd "t") 'svn-status-set-trac-project-root) (define-key svn-status-mode-options-map (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -