magit/company updates and extensions
[emacs-init.git] / setup / magit.el
index 62846ee..8ae6b76 100644 (file)
   (interactive "P")
   (quit-window kill-buffer))
 
+(defun magit-diff-master-mergebase (&optional args files)
+  (interactive (magit-diff-arguments))
+  (magit-diff-working-tree
+   (magit-git-string "merge-base" "master" "HEAD") args files))
+
+(magit-define-popup-action 'magit-diff-popup
+  ?m "Diff merge-base master" 'magit-diff-master-mergebase)
+
+(magit-define-popup-switch 'magit-log-popup
+  ?f "first parent" "--first-parent")
+
+(require 'ffap)
+
+(defun g0dil-magit-old-version-jump-to-current ()
+  (interactive)
+  (let ((current-file (ffap-file-exists-string
+                       (file-name-nondirectory
+                        (replace-regexp-in-string "\\.~.*$" "" (buffer-name))))))
+    (if current-file
+        (g0dil-goto-equivalent-position current-file)
+      (error "current version of file not found"))))
+
+(define-key magit-blob-mode-map "c" 'g0dil-magit-old-version-jump-to-current)
+
+(defun g0dil-magit-diff-jump-to-current ()
+  (interactive)
+  (let ((section-file-name (loop for ident in (magit-section-ident (magit-current-section))
+                                 if (and (consp ident) (eq (car ident) 'file))
+                                 return (cdr ident)
+                                 finally return nil)))
+    (if (ffap-file-exists-string section-file-name)
+        (g0dil-goto-equivalent-position section-file-name)
+      (error "current version of file not found"))))
+
+(define-key magit-revision-mode-map (kbd "C-c RET") 'g0dil-magit-diff-jump-to-current)
+
 ; ignore whitespace
 ; (setq magit-diff-options '("-w"))