lazygitでどのくらいlazyになれるか試してみる

TUIキテますね（しらんけど）！lazydocker、lazygit、最近ではlazynpmとか見かけるようになりました。GUI製はOSSじゃないことが多いですし、概ねキーバインドやカスタマイズ性が良くないことが多く、一方TUIはマウスを使いたくないlazyな人たちが作る代物なのでそのへんは良く考慮されてるなぁと感じます！

というわけで日々使うgitツールをlazygitに乗り換えてみて感想を書いてみたいと思います。

https://github.com/jesseduffield/lazygit

## 背景
ちなみにこれまではfugitive.vim → forkと渡り歩いてきました。fugutive.vimはvimからgitを扱えるというものなのでブランチ操作（特にinteractive rebase）などにおいては不便に感じており、一年ほど前からforkを使ってきました。forkはUIがとても洗練されていますがキーバインドが十分とは言えず、どうしてもマウス操作が多くポチポチやる必要がありました。あとgooglability悪い。

gitのTUIといえば、tig、lazygit、最近ではrust製のgituiが有名どころかと思いますが、golang、スター数、twitterでの評判、汎用猿型飯テロ決戦兵器 人造類人猿ゴリラゲリオンさん推し(@gorilla0513)ということでlazygitを使ってみたいと思います。

## メニューが親切、キーバインドがわかりやすい
起動したところのスクショですが、最下部に操作方法が表示されているので `x` でメニューを開いてみます。どのセクション（context）にいるかでメニューが変わるようです。
![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670385608502_+2022-12-07+12.59.30.png)
![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670385816466_+2022-12-07+13.01.08.png)
わかりやすい！！キーバインドも表示されています。

例）masterからhogeブランチを切ってみたところ
![スクリーンショット 2022-12-07 15.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117909/d6260589-14c4-b007-57b3-76300754b74a.png)

右下のコマンドログで実際に発行されるgitコマンドが表示されるのもブラックボックス感がなくていいですね。

## カスタマイズもかんたん
https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md

コンフィグをいじってみます。

### gui（tuiでないのか。。）
TUIということもあり、そもそも味気ないのでアイコンは表示するようにしてみました。
```yaml
    # config.yml
    gui:
      showIcons: true
```
![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670392224581_+2022-12-07+14.50.10.png)

いいですね！アイコン表示にはNerd Fontsが必要です。

ちなみに私は以下のフォントを使っています。
![スクリーンショット 2022-12-07 15.19.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117909/4699072e-e327-fb96-7e34-6352d08de5b8.png)

### ログ
ログは今まで使っていたワンライナーのフォーマットに調整してみました。
```yaml
    # config.yml
    git:
      branchLogCmd: "git log --graph --color=always --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' {{branchName}} --"
      allBranchesLogCmd: "git log --graph --color=always --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all"
```
![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670387063925_+2022-12-07+13.24.19.png)
いつもの感じで見やすい！

### コマンド
lazyになるために適当に空コミットを作る `git commit —allow-empty` するコマンドを作ってみました。
```yaml
    # config.yml
    customCommands:
      - key: "E"
        prompts:
          - type: "input"
            title: "Epmty commit message"
            initialValue: ""
        command: "git commit --allow-empty -m {{index .PromptResponses 0 | quote}}"
        context: "files"
        description: 'create empty commit'
        loadingText: "creating empty commit"
```
contextを`files`としたので、ファイルのセクションにいるときにメニューに表示されるようになりました。

![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670392392647_+2022-12-07+14.53.08.png)

`E` をタイプすると空コミットメッセージのプロンプトが出るので空コミットがかんたんに作れるようになりました。

![](https://paper-attachments.dropboxusercontent.com/s_DAD72B1A621EBC99D87187F3BF80033771EF019CCBBB8D15207BD8B48F6EC52A_1670392496425_+2022-12-07+14.54.53.png)

## おわりに

いきなりカスタマイズの話をしてしまいました。実践で使ってどうなのよというところを本来書くべきところですが、使い始めてまだ数日なのでご容赦いただければと思います。ともあれ所感、めっちゃいい！！lazyな自分には可能性を感じました。長い付き合いになりそうです。書いてませんが、特にinteractive rebaseめっちゃやりやすいです。もうちょっと使いこなして考えるスピードで操作できるようになってきたらまた書きたいと思います。