📄 psvn.el
字号:
(svn-status-line-info->hide-because-user-elide line-info))))
(defun svn-status-line-info->hide-because-unknown (line-info)
(and svn-status-hide-unknown
(eq (svn-status-line-info->filemark line-info) ??)))
(defun svn-status-line-info->hide-because-unmodified (line-info)
;;(message " %S %S %S %S - %s" svn-status-hide-unmodified (svn-status-line-info->propmark line-info) ?_
;; (svn-status-line-info->filemark line-info) (svn-status-line-info->filename line-info))
(and svn-status-hide-unmodified
(and (or (eq (svn-status-line-info->filemark line-info) ?_)
(eq (svn-status-line-info->filemark line-info) ? ))
(or (eq (svn-status-line-info->propmark line-info) ?_)
(eq (svn-status-line-info->propmark line-info) ? )
(eq (svn-status-line-info->propmark line-info) nil)))))
(defun svn-status-line-info->hide-because-user-elide (line-info)
(eq (svn-status-line-info->user-elide line-info) t))
(defun svn-status-line-info->show-user-elide-continuation (line-info)
(eq (svn-status-line-info->user-elide line-info) 'directory))
(defun svn-status-toggle-elide ()
(interactive)
(let ((st-info svn-status-info)
(fname)
(test (svn-status-line-info->filename (svn-status-get-line-information)))
(len-test)
(len-fname)
(new-elide-mark t)
(elide-mark))
(when (string= test ".")
(setq test ""))
(setq len-test (length test))
(while st-info
(setq fname (svn-status-line-info->filename (car st-info)))
(setq len-fname (length fname))
(when (and (>= len-fname len-test)
(string= (substring fname 0 len-test) test))
;;(message "elide: %s %s" fname (svn-status-line-info->user-elide (car st-info)))
(setq elide-mark new-elide-mark)
(when (or (string= fname ".")
(and (= len-fname len-test) (svn-status-line-info->directory-p (car st-info))))
(message "Elide directory %s and all its files." fname)
(setq new-elide-mark (not (svn-status-line-info->user-elide (car st-info))))
(setq elide-mark (if new-elide-mark 'directory nil)))
(setcar (nthcdr 1 (svn-status-line-info->ui-status (car st-info))) elide-mark))
(setq st-info (cdr st-info))))
(svn-status-update-buffer))
(defun svn-status-line-info->directory-p (line-info)
"Return t if LINE-INFO refers to a directory, nil otherwise.
Symbolic links to directories count as directories (see `file-directory-p')."
(file-directory-p (svn-status-line-info->filename line-info)))
(defun svn-status-line-info->full-path (line-info)
"Return the full path of the file represented by LINE-INFO."
(expand-file-name
(svn-status-line-info->filename line-info)))
;;Not convinced that this is the fastest way, but...
(defun svn-status-count-/ (string)
"Return number of \"/\"'s in STRING."
(let ((n 0)
(last 0))
(while (setq last (string-match "/" string (1+ last)))
(setq n (1+ n)))
n))
(defun svn-insert-line-in-status-buffer (line-info)
"Format LINE-INFO and insert the result in the current buffer."
(let ((usermark (if (svn-status-line-info->has-usermark line-info) "*" " "))
(external (if (svn-status-line-info->modified-external line-info)
(svn-add-face (if svn-status-short-mod-flag-p
"** "
" (modified external)")
'svn-status-modified-external-face)
(if svn-status-short-mod-flag-p " " "")))
;; To add indentation based on the
;; directory that the file is in, we just insert 2*(number of "/" in
;; filename) spaces, which is rather hacky (but works)!
(filename (svn-status-choose-face-to-add
(svn-status-line-info->directory-p line-info)
(concat (make-string
(* 2 (svn-status-count-/
(svn-status-line-info->filename line-info)))
32)
(if svn-status-hide-unmodified
(svn-status-line-info->filename line-info)
(svn-status-line-info->filename-nondirectory line-info)))
'svn-status-directory-face
'svn-status-filename-face))
(elide-hint (if (svn-status-line-info->show-user-elide-continuation line-info) " ..." "")))
(insert (svn-status-maybe-add-face
(svn-status-line-info->has-usermark line-info)
(concat usermark
(format svn-status-line-format
(svn-status-line-info->filemark line-info)
(or (svn-status-line-info->propmark line-info) ? )
(or (svn-status-line-info->localrev line-info) "")
(or (svn-status-line-info->lastchangerev line-info) "")
(svn-status-line-info->author line-info)))
'svn-status-marked-face)
(if svn-status-short-mod-flag-p external filename)
(if svn-status-short-mod-flag-p filename external)
elide-hint
"\n")))
(defun svn-status-update-buffer ()
(interactive)
;(message (format "buffer-name: %s" (buffer-name)))
(unless (string= (buffer-name) "*svn-status*")
(delete-other-windows)
(split-window-vertically)
(switch-to-buffer "*svn-status*"))
(svn-status-mode)
(let ((st-info svn-status-info)
(buffer-read-only nil)
(start-pos)
(overlay)
(unmodified-count 0)
(unknown-count 0)
(marked-count 0)
(fname (svn-status-line-info->filename (svn-status-get-line-information)))
(fname-pos (point))
(column (current-column)))
(delete-region (point-min) (point-max))
(insert "\n")
;; Insert all files and directories
(while st-info
(setq start-pos (point))
(cond ((svn-status-line-info->has-usermark (car st-info))
;; Show a marked file always
(svn-insert-line-in-status-buffer (car st-info)))
((svn-status-line-info->hide-because-user-elide (car st-info))
);(message "user wanted to hide %s" (svn-status-line-info->filename (car st-info))))
((svn-status-line-info->hide-because-unknown (car st-info))
(setq unknown-count (+ unknown-count 1)))
((svn-status-line-info->hide-because-unmodified (car st-info))
(setq unmodified-count (+ unmodified-count 1)))
(t
(svn-insert-line-in-status-buffer (car st-info))))
(when (svn-status-line-info->has-usermark (car st-info))
(setq marked-count (+ marked-count 1)))
(setq overlay (make-overlay start-pos (point)))
(overlay-put overlay 'svn-info (car st-info))
(setq st-info (cdr st-info)))
;; Insert status information at the buffer beginning
(goto-char (point-min))
(insert (format "svn status for directory %s%s\n"
default-directory
(if svn-status-head-revision (format " (status against revision: %s)"
svn-status-head-revision)
"")))
(when svn-status-base-info
(insert (concat "Repository: " (svn-status-base-info->url) "\n")))
(when svn-status-hide-unknown
(insert
(format "%d Unknown files are hidden - press ? to toggle hiding\n"
unknown-count)))
(when svn-status-hide-unmodified
(insert
(format "%d Unmodified files are hidden - press _ to toggle hiding\n"
unmodified-count)))
(insert (format "%d files marked\n" marked-count))
(setq svn-start-of-file-list-line-number (+ (count-lines (point-min) (point)) 1))
(if fname
(progn
(goto-char fname-pos)
(svn-status-goto-file-name fname)
(goto-char (+ column (point-at-bol))))
(goto-char (+ (next-overlay-change (point-min)) svn-status-default-column)))))
(defun svn-status-parse-info (arg)
"Parse the svn info output for the base directory.
Show the repository url after this call in the *svn-status* buffer.
When called with the prefix argument 0, reset the information to nil.
This hides the repository information again."
(interactive "P")
(if (eq arg 0)
(setq svn-status-base-info nil)
(svn-run-svn nil t 'parse-info "info" ".")
(svn-status-parse-info-result))
(svn-status-update-buffer))
(defun svn-status-parse-info-result ()
(let ((url))
(save-excursion
(set-buffer "*svn-process*")
(goto-char (point-min))
(search-forward "Url: ")
(setq url (buffer-substring-no-properties (point) (point-at-eol))))
(setq svn-status-base-info `((url ,url)))))
(defun svn-status-base-info->url ()
(if svn-status-base-info
(cadr (assoc 'url svn-status-base-info))
""))
(defun svn-status-toggle-edit-cmd-flag (&optional reset)
(interactive)
(cond ((or reset (eq svn-status-edit-svn-command 'sticky))
(setq svn-status-edit-svn-command nil))
((eq svn-status-edit-svn-command nil)
(setq svn-status-edit-svn-command t))
((eq svn-status-edit-svn-command t)
(setq svn-status-edit-svn-command 'sticky)))
(cond ((eq svn-status-edit-svn-command t)
(setq svn-status-mode-line-process-edit-flag " EditCmd"))
((eq svn-status-edit-svn-command 'sticky)
(setq svn-status-mode-line-process-edit-flag " EditCmd#"))
(t
(setq svn-status-mode-line-process-edit-flag "")))
(svn-status-update-mode-line))
(defun svn-status-goto-root-or-return ()
"Bounce point between the root (\".\") and the current line."
(interactive)
(if (string= (svn-status-line-info->filename (svn-status-get-line-information)) ".")
(when svn-status-root-return-info
(svn-status-goto-file-name
(svn-status-line-info->filename svn-status-root-return-info)))
(setq svn-status-root-return-info (svn-status-get-line-information))
(svn-status-goto-file-name ".")))
(defun svn-status-next-line (nr-of-lines)
(interactive "p")
(next-line nr-of-lines)
(when (svn-status-get-line-information)
(goto-char (+ (point-at-bol) svn-status-default-column))))
(defun svn-status-previous-line (nr-of-lines)
(interactive "p")
(previous-line nr-of-lines)
(when (svn-status-get-line-information)
(goto-char (+ (point-at-bol) svn-status-default-column))))
(defun svn-status-update (&optional arg)
"Run 'svn status -v'.
When called with a prefix argument run 'svn status -vu'."
(interactive "P")
(unless (interactive-p)
(save-excursion
(set-buffer "*svn-process*")
(setq svn-status-update-previous-process-output (buffer-substring (point-min) (point-max)))))
(svn-status default-directory arg))
(defun svn-status-get-line-information ()
"Find out about the file under point.
The result may be parsed with the various `svn-status-line-info->...' functions."
(let ((overlay (car (overlays-at (point)))))
(when overlay
(overlay-get overlay 'svn-info))))
(defun svn-status-get-file-list (use-marked-files)
"Get either the marked files or the files, where the cursor is on."
(if use-marked-files
(svn-status-marked-files)
(list (svn-status-get-line-information))))
(defun svn-status-get-file-list-names (use-marked-files)
(mapcar 'svn-status-line-info->filename (svn-status-get-file-list use-marked-files)))
(defun svn-status-select-line ()
(interactive)
(let ((info (svn-status-get-line-information)))
(if info
(message "%S %S %S" info (svn-status-line-info->hide-because-unknown info)
(svn-status-line-info->hide-because-unmodified info))
(message "No file on this line"))))
(defun svn-status-directory-containing-point (allow-self)
"Find the (full path of) directory containing the file under point.
If ALLOW-SELF and the file is a directory, return that directory,
otherwise return the directory containing the file under point."
;;the first `or' below is because s-s-g-l-i returns `nil' if
;;point was outside the file list, but we need
;;s-s-l-i->f to return a string to add to `default-directory'.
(let ((line-info (or (svn-status-get-line-information)
'(nil nil nil ""))))
(file-name-as-directory
(expand-file-name
(if (and allow-self (svn-status-line-info->directory-p line-info))
(svn-status-line-info->filename line-info)
;;The next `or' is because (file-name-directory "file") returns nil
(or (file-name-directory (svn-status-line-info->filename line-info))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -