Slide 1

Slide 1 text

git-jumpを解放する Yoichi Nakayama

Slide 2

Slide 2 text

gitのサブコマンド “git ほにゃらら [args…]” の「ほにゃらら」 どんなサブコマンドを知ってますか?

Slide 3

Slide 3 text

gitのサブコマンドいろいろ git のサブコマンドを作ったことがありますか? ● git clone ● git checkout ● git add ● git commit ● git branch ● git tag ● git log ● git blame ● git merge ● git reset ● git rebase ● git status ● git push ● git fetch ● git pull ● …

Slide 4

Slide 4 text

gitのサブコマンドの作り方 git-foo という実行可能ファイルをPATHに配置 →サブコマンド git foo を定義できる 例: % echo 'echo "hello world"' > ~/bin/git-hello % chmod +x ~/bin/git-hello % git hello hello world

Slide 5

Slide 5 text

サブコマンドの例: git-set-file-times (rsyncに付属) ワーキングツリーのファイルのタイムスタンプをコミット時刻に合わせる https://github.com/WayneD/rsync/blob/master/support/git-set-file-times https://speakerdeck.com/yoichi/a-practical-example-of-a-small-contribution-to-oss

Slide 6

Slide 6 text

サブコマンドの例: git-restore-branch (自作) 削除したローカルブランチをリストアップ、復元する https://github.com/yoichi/git-restore-branch/blob/main/git-restore-branch https://zenn.dev/yoichi/articles/git-restore-branch

Slide 7

Slide 7 text

今日の題材: git-jump (git に付属) 興味のある要素にエディタでジャンプする ● diff: diff hunks ● merge: merge conflicts ● grep: grep hits ● ws: whitespace errors https://github.com/git/git/blob/master/contrib/git-jump/git-jump

Slide 8

Slide 8 text

git-jumpの利用シーン ● git grep キーワードにマッチした行を表示 ● 周りの行を見たいなー → git grep -C で前後の行も合わせて表示 ● エディタで見れたらいいのになー → git jump grep

Slide 9

Slide 9 text

git-jumpの実装(シェルスクリプト) ● 興味のある要素を「ファイル名:行番号:コンテンツ」の形式でファイル出力 ● vim -q で開く https://vim-jp.org/vimdoc-ja/quickfix.html

Slide 10

Slide 10 text

「ファイル名:行番号:コンテンツ」の形式 git-jumpに限らず、 あちこちで見かける: ● コンパイラのエラー出力 ● 静的解析ツールの出力 ● grep -n の出力 これを入力として受け取れる プログラムはVim以外もある →Vim縛りを外すには?

Slide 11

Slide 11 text

「ファイル名:行番号:コンテンツ」の形式 git-jumpに限らず、 あちこちで見かける: ● コンパイラのエラー出力 ● 静的解析ツールの出力 ● grep -n の出力 これを入力として受け取れる プログラムはVim以外もある →Vim縛りを外すには? https://speakerdeck.com/yoichi/on-pipe

Slide 12

Slide 12 text

やったこと:git jumpで標準出力に出すオプションを追加 →quickfix list を任意のプログラム(例えば、Emacs の M-x grep)で使える

Slide 13

Slide 13 text

git-jumpの出力をEmacsで扱える ≠ git-jumpのEmacs対応 git jump –stdout で任意のプログラム(e.g. M-x grep)に出力を渡せるようになった ● diff: diff hunks ● merge: merge conflicts ● grep: grep hits ● ws: whitespace errors git-jumpの機能: ● 興味のある要素にエディタでジャンプする ● =ターミナルでコマンドを打つと、素早くエディタが立ち上がる → Vimだけでなく、Emacsも制御できるようにしたい

Slide 14

Slide 14 text

やったこと:git jumpでEmacsを制御できるように EDITOR環境変数の複数のパターンに対応 ● emacs 新しいEmacsプロセスを起動(同期) ● emacsclient 既存のEmacsフレームを使う(非同期) ● emacsclient -c 新しいEmacsフレームを作る(同期) ● emacsclient -t 現在のターミナルに新しいEmacsフレームを作る(同期) 工夫と手抜き ● emacsとemacsclientで共通の –eval オプションを使う ● 非同期の場合に一時ファイル削除の競合条件が発生しないよう待ち合わせ ● 一時ファイルパス中の特殊文字への対応は従来のVim向けと同程度まで

Slide 15

Slide 15 text

デモ: git-jump with EDITOR=”emacsclient -t”

Slide 16

Slide 16 text

https://github.com/git/git/blob/master/Documentation/RelNotes/2.40.0.txt (次の版) "git jump" (in contrib/) learned to present the "quickfix list" to its standard output, and learned to also drive emacs/emacsclient. まとめ:git-jumpを特定エディタへの依存から解放した git-jump –stdout 任意のプ ログラム git-jump git-jump Vimだけでなく、Emacsも制御できるように 標準出力を経由して、 git由来のquickfix listを任意 のプログラムに渡せるように