📄 psvn.el
字号:
;;(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.
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.")
(defvar svn-status-mode-property-map ()
"Subkeymap used in `svn-status-mode' for property commands.")
(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 "^") '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 "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 ".") '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 "?") '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 "+") '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-file)
(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 "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 "<down>") 'svn-status-next-line)
(define-key svn-status-mode-map (kbd "<up>") 'svn-status-previous-line)
(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 "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 "p") 'svn-status-property-parse)
;; 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))
(easy-menu-define svn-status-mode-menu svn-status-mode-map
"'svn-status-mode' menu"
'("SVN"
["svn status" svn-status-update t]
["svn update" svn-status-update-cmd t]
["svn commit" svn-status-commit-file t]
["svn log" svn-status-show-svn-log t]
["svn info" svn-status-info t]
["svn blame" svn-status-blame t]
("Diff"
["svn diff current file" svn-status-show-svn-diff t]
["svn diff marked files" svn-status-show-svn-diff-for-marked-files t]
["svn ediff current file" svn-status-ediff-with-revision t]
)
["svn cat ..." svn-status-get-specific-revision t]
["svn add" svn-status-add-file t]
["svn mkdir..." svn-status-make-directory t]
["svn mv..." svn-status-mv t]
["svn rm..." svn-status-rm t]
["Up Directory" svn-status-examine-parent t]
["Elide Directory" svn-status-toggle-elide t]
["svn revert" svn-status-revert t]
["svn cleanup" svn-status-cleanup t]
["Show Process Buffer" svn-status-show-process-buffer t]
("Property"
["svn proplist" svn-status-property-list t]
["Set Multiple Properties..." svn-status-property-set t]
["Edit One Property..." svn-status-property-edit-one-entry t]
["svn propdel..." svn-status-property-delete t]
"---"
["svn:ignore File..." svn-status-property-ignore-file t]
["svn:ignore File Extension..." svn-status-property-ignore-file-extension t]
["Edit svn:ignore Property" svn-status-property-edit-svn-ignore t]
"---"
["Set svn:keywords List" svn-status-property-set-keyword-list t]
["Set svn:eol-style" svn-status-property-set-eol-style t]
)
"---"
["Edit Next SVN Cmd Line" svn-status-toggle-edit-cmd-flag t]
["Work Directory History..." svn-status-use-history t]
["Mark" svn-status-set-user-mark t]
["Unmark" svn-status-unset-user-mark t]
("Mark / Unmark"
["Unmark all" svn-status-unset-all-usermarks t]
["Mark/Unmark unknown" svn-status-mark-unknown t]
["Mark/Unmark added" svn-status-mark-added t]
["Mark/Unmark modified" svn-status-mark-modified t]
)
["Hide Unknown" svn-status-toggle-hide-unknown
:style toggle :selected svn-status-hide-unknown]
["Hide Unmodified" svn-status-toggle-hide-unmodified
:style toggle :selected svn-status-hide-unmodified]
))
(defun svn-status-mode ()
"Major mode used by psvn.el to process the output of \"svn status\".
psvn.el is an interface for the revision control tool subversion
\(see http://subversion.tigris.org).
psvn.el provides a similar interface for subversion as pcl-cvs does for cvs.
At the moment the following commands are implemented:
M-x svn-status: run 'svn -status -v'
and show the result in the *svn-status* buffer, this buffer uses the
svn-status mode. In this mode the following keys are defined:
\\{svn-status-mode-map}"
(interactive)
(kill-all-local-variables)
(use-local-map svn-status-mode-map)
(easy-menu-add svn-status-mode-menu)
(setq major-mode 'svn-status-mode)
(setq mode-name "svn-status")
(setq mode-line-process 'svn-status-mode-line-process)
(let ((view-read-only nil))
(toggle-read-only 1)))
(defun svn-status-update-mode-line ()
(setq svn-status-mode-line-process
(concat svn-status-mode-line-process-edit-flag svn-status-mode-line-process-status))
(force-mode-line-update))
(defun svn-status-bury-buffer (arg)
"Bury the *svn-status* buffer.
When called with a prefix argument, switch back to the window configuration that was
in use before `svn-status' was called."
(interactive "P")
(cond (arg
(when svn-status-initial-window-configuration
(set-window-configuration svn-status-initial-window-configuration)))
(t
(let ((bl '("*svn-log-edit*" "*svn-property-edit*" "*svn-process*")))
(while bl
(when (get-buffer (car bl))
(bury-buffer (car bl)))
(setq bl (cdr bl)))
(when (string= (buffer-name) "*svn-status*")
(bury-buffer))))))
(defun svn-status-find-files ()
"Open selected file(s) for editing.
See `svn-status-marked-files' for what counts as selected."
(interactive)
(let ((fnames (mapcar 'svn-status-line-info->full-path (svn-status-marked-files))))
(mapc 'find-file fnames)))
(defun svn-status-find-file-other-window ()
"Open the file in the other window for editing."
(interactive)
(find-file-other-window (svn-status-line-info->filename
(svn-status-get-line-information))))
(defun svn-status-view-file-other-window ()
"Open the file in the other window for viewing."
(interactive)
(view-file-other-window (svn-status-line-info->filename
(svn-status-get-line-information))))
(defun svn-status-find-file-or-examine-directory ()
"If point is on a directory, run `svn-status' on that directory.
Otherwise run `find-file'."
(interactive)
(let ((line-info (svn-status-get-line-information)))
(if (svn-status-line-info->directory-p line-info)
(svn-status (svn-status-line-info->full-path line-info))
(find-file (svn-status-line-info->filename line-info)))))
(defun svn-status-examine-parent ()
"Run `svn-status' on the parent of the current directory."
(interactive)
(svn-status (expand-file-name "../")))
(defun svn-status-line-info->ui-status (line-info) (nth 0 line-info))
(defun svn-status-line-info->has-usermark (line-info) (nth 0 (nth 0 line-info)))
(defun svn-status-line-info->user-elide (line-info) (nth 1 (nth 0 line-info)))
(defun svn-status-line-info->filemark (line-info) (nth 1 line-info))
(defun svn-status-line-info->propmark (line-info) (nth 2 line-info))
(defun svn-status-line-info->filename (line-info) (nth 3 line-info))
(defun svn-status-line-info->filename-nondirectory (line-info)
(file-name-nondirectory (svn-status-line-info->filename line-info)))
(defun svn-status-line-info->localrev (line-info)
(if (>= (nth 4 line-info) 0)
(nth 4 line-info)
nil))
(defun svn-status-line-info->lastchangerev (line-info)
"Return the last revision in which LINE-INFO was modified."
(if (>= (nth 5 line-info) 0)
(nth 5 line-info)
nil))
(defun svn-status-line-info->author (line-info) (nth 6 line-info))
(defun svn-status-line-info->modified-external (line-info) (nth 7 line-info))
(defun svn-status-line-info->is-visiblep (line-info)
(not (or (svn-status-line-info->hide-because-unknown line-info)
(svn-status-line-info->hide-because-unmodified line-info)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -