| ;;; svn-entries.el --- Display .svn/entries field names to the left |
| |
| ;; Copyright (C) 2007 David Glasser |
| |
| ;; Licensed under the same license as Subversion. |
| |
| ;; Licensed to the Apache Software Foundation (ASF) under one |
| ;; or more contributor license agreements. See the NOTICE file |
| ;; distributed with this work for additional information |
| ;; regarding copyright ownership. The ASF licenses this file |
| ;; to you under the Apache License, Version 2.0 (the |
| ;; "License"); you may not use this file except in compliance |
| ;; with the License. You may obtain a copy of the License at |
| ;; |
| ;; http://www.apache.org/licenses/LICENSE-2.0 |
| ;; |
| ;; Unless required by applicable law or agreed to in writing, |
| ;; software distributed under the License is distributed on an |
| ;; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ;; KIND, either express or implied. See the License for the |
| ;; specific language governing permissions and limitations |
| ;; under the License. |
| |
| ;;; Commentary: |
| |
| ;; Display field names to the left of the lines in a .svn/entries |
| ;; buffer. Copy svn-entries.el to your load-path and add to your |
| ;; .emacs: |
| |
| ;; (require 'svn-entries) |
| |
| ;; After opening or editing an entries file, run |
| |
| ;; M-x svn-entries-show |
| |
| ;; To hide: |
| |
| ;; M-x svn-entries-hide |
| |
| ;; (I tried doing this as a minor mode but setting margins during |
| ;; alist initialization didn't work...) |
| |
| ;; Tested on FSF Emacs 22. |
| |
| |
| (defvar svn-entries-overlays nil "Overlays used in this buffer.") |
| (make-variable-buffer-local 'svn-entries-overlays) |
| |
| (defgroup svn-entries nil |
| "Show labels to the left of .svn/entries buffers" |
| :group 'convenience) |
| |
| (defface svn-entries |
| '((t :inherit shadow)) |
| "Face for displaying line numbers in the display margin." |
| :group 'svn-entries) |
| |
| (defun svn-entries-set-margins (buf margin) |
| (dolist (w (get-buffer-window-list buf nil t)) |
| (set-window-margins w margin))) |
| |
| (defun svn-entries-hide () |
| "Delete all overlays displaying labels for this buffer." |
| (interactive) |
| (mapc #'delete-overlay svn-entries-overlays) |
| (setq svn-entries-overlays nil) |
| (svn-entries-set-margins (current-buffer) 0) |
| (remove-hook 'window-configuration-change-hook |
| 'svn-entries-after-config t)) |
| |
| (defun svn-entries-show () |
| "Update labels for the current buffer." |
| (interactive) |
| (svn-entries-update (current-buffer)) |
| (add-hook 'window-configuration-change-hook |
| 'svn-entries-after-config nil t)) |
| |
| (defconst svn-entries-labels |
| ["name" |
| "kind" |
| "revision" |
| "url" |
| "repos" |
| "schedule" |
| "text-time" |
| "checksum" |
| "committed-date" |
| "committed-rev" |
| "last-author" |
| "has-props" |
| "has-prop-mods" |
| "cachable-props" |
| "present-props" |
| "conflict-old" |
| "conflict-new" |
| "conflict-wrk" |
| "prop-reject-file" |
| "copied" |
| "copyfrom-url" |
| "copyfrom-rev" |
| "deleted" |
| "absent" |
| "incomplete" |
| "uuid" |
| "lock-token" |
| "lock-owner" |
| "lock-comment" |
| "lock-creation-date" |
| "changelist" |
| "keep-local" |
| "working-size" |
| "depth"]) |
| |
| (defconst svn-entries-margin-width (length "lock-creation-date")) |
| |
| (defun svn-entries-update (buffer) |
| "Update labels for all windows displaying BUFFER." |
| (with-current-buffer buffer |
| (svn-entries-hide) |
| (save-excursion |
| (save-restriction |
| (widen) |
| (let ((last-line (line-number-at-pos (point-max))) |
| (field 0) |
| (done nil)) |
| (goto-char (point-min)) |
| (while (not done) |
| (cond ((= (point) 1) |
| (svn-entries-overlay-here "format")) |
| ((= (following-char) 12) ; ^L |
| (setq field 0)) |
| ((not (eobp)) |
| (svn-entries-overlay-here (elt svn-entries-labels field)) |
| (setq field (1+ field)))) |
| (setq done (> (forward-line) 0)))))) |
| (svn-entries-set-margins buffer svn-entries-margin-width))) |
| |
| (defun svn-entries-overlay-here (label) |
| (let* ((fmt-label (propertize label 'face 'svn-entries)) |
| (left-label (propertize " " 'display `((margin left-margin) |
| ,fmt-label))) |
| (ov (make-overlay (point) (point)))) |
| (push ov svn-entries-overlays) |
| (overlay-put ov 'before-string left-label))) |
| |
| (defun svn-entries-after-config () |
| (walk-windows (lambda (w) (svn-entries-set-margins-if-overlaid (window-buffer))) |
| nil 'visible)) |
| |
| (defun svn-entries-set-margins-if-overlaid (b) |
| (with-current-buffer b |
| (when svn-entries-overlays |
| (svn-entries-set-margins b svn-entries-margin-width)))) |
| |
| (provide 'svn-entries) |
| ;;; svn-entries.el ends here |