0

C-x v = vc-diffいいね。magit-statusただし、差分がバッファに表示されている場合は、差分を直接操作できます。

ここでそれをやろうとしました:

(defvar le::vc-diff-data nil)
(defun le::magit-go-to-change-once ()
  (destructuring-bind (filename orig-buff relative-name) le::vc-diff-data
    (pop-to-buffer "*magit: magit*")
    (goto-char (point-min))
    (if (and (search-forward-regexp "^Changes:$" nil t)
             ;; WIP fix
             (progn (magit-show-level-2) t)
             (search-forward relative-name nil t))
        (progn (recenter-top-bottom 0)
               ;; WIP fix me here
               (magit-show-level-4)
               )
      ;; no diff
      (pop-to-buffer orig-buf)
      (message "no diff found.")))
  (remove-hook 'magit-refresh-status-hook #'le::magit-go-to-change-once))

(defadvice vc-diff (around magit-redirect activate compile)
  "redirect to magit"
  (let* ((vc-info (vc-deduce-fileset t))
         (filename (buffer-file-name))
         (orig-buf (current-buffer))
         (relative-name (replace-regexp-in-string
                         (concat "\\`"
                                 (regexp-quote (expand-file-name (locate-dominating-file filename ".git"))))
                         "" filename)))
    (if (string-equal "Git" (car vc-info))
        (progn
          (setq le::vc-diff-data (list filename orig-buf relative-name))
          (add-hook 'magit-refresh-status-hook #'le::magit-go-to-change-once)
          (call-interactively 'magit-status))
      ad-do-it)))

ただし、「magit-show-level*」関数は失敗します。eval-expressionただし、magitバッファで使用すると機能し ます。おそらくこれはタイミングの問題であり、別の場所に接続する必要があります。

4

1 に答える 1

1

私のコメントで述べたように、セクション関連の機能が機能しないときにフックが呼び出されます。そこから magit を試すことができます: https://github.com/vanicat/magit/tree/t/refresh-stasus-hook、コードはそれで動作するはずです。

さようなら、あなたの提案は興味深いものであり、それを magit contrib の提案に統合することは素晴らしいことです。

于 2012-10-07T14:11:30.443 に答える