例:
diff-modeで次のような表示があったとする (※1〜※3は場所の明示のためのマーク)
※1 diff --git a/path/to/changed/file b/path/to/changed/file
--- a/path/to/changed/file
+++ b/path/to/changed/file
※2 @@ -343,5 +343,10 @@
...HUNK 1...
※3 @@ -451,1 +451,3 @@
...HUNK 2...
最初のcursor positionが※1の時、従来はdiff-hunk-next ("n")で※2 → ※3と移動していた。しかし、今回の変更により※2は最初のhunkなのでskipされ、いきなり※3に飛んでしまう。
diff-hunk-prevも同じで、header直下のhunkはskipされるのがdefaultの挙動となっている。
何が問題か?
diff-modeで、具体的にどこが変更されたのかをわかりやすくする為に、diff-auto-refine-modeを設定している。これは、wdiffのように文字単位での変更を色付けしてくれるのだが、処理速度の問題からdiff-hunk-prevやdiff-hunk-nextでそのhunkをvisitした際に色付けされる仕組みである。
従って、今回の挙動変更によりheader直下の@@部分へのjumpがskipされると、diff-refine-hunkが適用されずに困る。
解決法
diff-hunk-next, diff-hunk-prevなどのoptional argumentsの一つであるskip-hunk-startにnilを渡して呼び出せば従来の挙動に戻る。
1. lambdaを使う
(with-eval-after-load "diff-mode";; diff-hunk-next
(define-key diff-mode-shared-map "n"
(lambda (&optional count)
(interactive)
(diff-hunk-next count nil)))
;; diff-hunk-prev
(define-key diff-mode-shared-map "p"
(lambda (&optional count)
(interactive)
(diff-hunk-prev count nil))))
2. オレオレfunctionを定義しkeybindする
(with-eval-after-load "diff-mode"
(defun my-diff-hunk-next (&optional count)
(interactive)
(diff-hunk-next count nil))
(defun my-diff-hunk-prev (&optional count)
(interactive)
(diff-hunk-prev count nil))
;; key bindings
(define-key diff-mode-shared-map "n" 'my-diff-hunk-next)
(define-key diff-mode-shared-map "p" 'my-diff-hunk-prev))
3. 気に入らない挙動を修正する
- adviceを使う?
- noflet, dfletあたりを使う?
0 件のコメント:
コメントを投稿