diff options
-rw-r--r-- | lisp/init-git.el | 74 |
1 files changed, 35 insertions, 39 deletions
diff --git a/lisp/init-git.el b/lisp/init-git.el index 5374167..0fa2cce 100644 --- a/lisp/init-git.el +++ b/lisp/init-git.el @@ -290,6 +290,40 @@ command will still offer the staged files)." (defun km/magit-shorten-hash (hash) (magit-rev-parse (format "--short=%s" (magit-abbrev-length)) hash)) +(defun km/magit-shorten-hash-at-point (&optional n) + "Shorten hash at point to N characters. + +N defaults to `magit-abbrev-length'. If the commit belongs to +the current repo and the hash is ambiguous, the hash is extended +as needed. + +To explicitly set the hash length, use a numeric prefix +argument." + (interactive (list (or (and current-prefix-arg + (prefix-numeric-value current-prefix-arg)) + (magit-abbrev-length)))) + (cond + ((< n 4) + (user-error "Hash must be at least 4 characters")) + ((>= n 40) + (user-error "Full hashes are 40 characters")) + ((> n 30) + (message "That doesn't seem incredibly useful, but OK"))) + (let ((offset (- (skip-chars-backward "A-z0-9")))) + (if (looking-at "\\b[A-z0-9]\\{5,40\\}\\b") + (let ((hash-len (- (match-end 0) (match-beginning 0))) + (hash (match-string 0))) + (when (< hash-len n) + (user-error "Desired hash length is greater than current")) + (replace-match (or (km/magit-shorten-hash hash) + (substring hash 0 n)) + 'fixedcase) + (when (< offset n) + (skip-chars-backward "A-z0-9") + (goto-char (+ (point) offset)))) + (goto-char (+ (point) offset)) + (user-error "No hash found at point")))) + (define-key ctl-x-4-map "g" 'magit-find-file-other-window) (define-key km/file-map "g" 'magit-find-file) @@ -314,6 +348,7 @@ command will still offer the staged files)." (define-key km/git-map "d" 'magit-dispatch-popup) (define-key km/git-map "e" 'km/magit-commit-extend-all) (define-key km/git-map "f" 'km/magit-reset-file) + (define-key km/git-map "n" 'km/magit-shorten-hash-at-point) (define-key km/git-map "l" 'magit-log-buffer-file) (define-key km/git-map "p" 'km/magit-pin-file) (define-key km/git-map "s" 'km/magit-insert-staged-file) @@ -390,43 +425,4 @@ command will still offer the staged files)." (setq magit-annex-all-action-arguments (delete "--auto" magit-annex-all-action-arguments))) - -;;; Other git - -(defun km/git-shorten-hash-at-point (&optional n) - "Shorten hash at point to N characters. - -N defaults to `magit-abbrev-length'. If the commit belongs to -the current repo and the hash is ambiguous, the hash is extended -as needed. - -To explicitly set the hash length, use a numeric prefix -argument." - (interactive (list (or (and current-prefix-arg - (prefix-numeric-value current-prefix-arg)) - (magit-abbrev-length)))) - (cond - ((< n 4) - (user-error "Hash must be at least 4 characters")) - ((>= n 40) - (user-error "Full hashes are 40 characters")) - ((> n 30) - (message "That doesn't seem incredibly useful, but OK"))) - (let ((offset (- (skip-chars-backward "A-z0-9")))) - (if (looking-at "\\b[A-z0-9]\\{5,40\\}\\b") - (let ((hash-len (- (match-end 0) (match-beginning 0))) - (hash (match-string 0))) - (when (< hash-len n) - (user-error "Desired hash length is greater than current")) - (replace-match (or (km/magit-shorten-hash hash) - (substring hash 0 n)) - 'fixedcase) - (when (< offset n) - (skip-chars-backward "A-z0-9") - (goto-char (+ (point) offset)))) - (goto-char (+ (point) offset)) - (user-error "No hash found at point")))) - -(define-key km/git-map "n" 'km/git-shorten-hash-at-point) - (provide 'init-git) |