22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Neovim x gitui で Git TUI 生活

22
Last updated at Posted at 2026-01-04

はじめに

そもそも僕は LazyGit を利用していたが、少々動作がもたついたり、もっさりすることがあったのと、Rust でコーディングすることが最近かなり多くなったので、Rust 製の TUI ってないんだっけ?と思って調べたのがこの Git クライアントアプリに出会ったきっかけ。

使い方が LazyGit と多少違うのと、gitui を自分なりに使うために少しセットアップが必要なのと、Neovim 上で快適に使用するにも工夫が必要だったので、その方法をまとめようと思った。

image.png

image.png

image.png

コンフィグ

コンフィグを行うファイル群は以下のパスに格納する。

OS コンフィグディレクトリ
Windows %APPDATA%/gitui
maOS $HOME/.config/gitui
linux $HOME/.config/gitui

基本的に、gitui のコンフィグは ron ファイル形式 で記述する様になっており、デフォルトの値をオーバーライドする形で利用する。

テーマ設定

デフォルトのテーマから変更する場合は、theme.ron ファイルを作成して対応する。

ここでの見え方は、それぞれのターミナルのテーマ設定に大きく影響を受けるため、下記の設定そのままでは「見やすい」ようにはならない点に注意

例えば以下の様に設定してみる。

gitui/theme.ron
(
  selection_bg: Some("Green"),
  disabled_fg: Some("Reset"),
  cmdbar_bg: Some("Green"),
)
デフォルト 変更例
image.png image.png

このポスト執筆時点でのデフォルト設定は、style.rs の方で確認でき、値を次のように直す事で設定ができる。

gitui/theme.ron
(
  selected_tab: Some("Reset"),
  command_fg: Some("White"),
  selection_bg: Some("Blue"),
  selection_fg: Some("White"),
  use_selection_fg: Some(true),
  cmdbar_bg: Some("Blue"),
  disabled_fg: Some("DarkGray"),
  diff_line_add: Some("Green"),
  diff_line_delete: Some("Red"),
  diff_file_added: Some("LightGreen"),
  diff_file_removed: Some("LightRed"),
  diff_file_moved: Some("LightMagenta"),
  diff_file_modified: Some("Yellow"),
  commit_hash: Som("Magenta"),
  commit_time: Some("LightCyan"),
  commit_author: Some("Green"),
  danger_fg: Some("Red"),
  push_gauge_bg: Some("Blue"),
  push_gauge_fg: Some("Reset"),
  tag_fg: Some("LightMagenta"),
  branch_fg: Some("LightYellow"),
  line_break: Some("¶"),
  block_title_focused: Some("Reset"),
)

改行文字

デフォルトだと、改行に対して改行文字「」が入る。
さすがにこれは煩わしいので、空白にしたい。その場合は、先の theme.ron に設定を入れる。

gitui/theme.ron
(
  line_break: Some(""),
)
デフォルト 変更後
image.png image.png

Vim 形式キーバインディングを設定する

デフォルトでは、gitui は Vim キーマップには対応しておらず、基本的には数字キーや矢印の操作を中心としたデフォルトキーマップになっている。

これを Vim キー形式のキーマップで使用するには、key_bindings.ron コンフィグファイルを作成してキーバインディングを設定する。

最低限では以下の通り。

gitui/key_bindings.ron
(
    move_left: Some(( code: Char('h'), modifiers: "")),
    move_right: Some(( code: Char('l'), modifiers: "")),
    move_up: Some(( code: Char('k'), modifiers: "")),
    move_down: Some(( code: Char('j'), modifiers: "")),

    stash_open: Some(( code: Char('l'), modifiers: "")),
    open_help: Some(( code: F(1), modifiers: "")),

    status_reset_item: Some(( code: Char('U'), modifiers: "SHIFT")),
)

サンプルの拡張 Vim キーマップ

更に Vim キーマップを広げる場合には、以下を設定する。

vim style key config

gitui/key_bindings.ron
(
    open_help: Some(( code: F(1), modifiers: "")),

    move_left: Some(( code: Char('h'), modifiers: "")),
    move_right: Some(( code: Char('l'), modifiers: "")),
    move_up: Some(( code: Char('k'), modifiers: "")),
    move_down: Some(( code: Char('j'), modifiers: "")),
    
    popup_up: Some(( code: Char('p'), modifiers: "CONTROL")),
    popup_down: Some(( code: Char('n'), modifiers: "CONTROL")),
    page_up: Some(( code: Char('b'), modifiers: "CONTROL")),
    page_down: Some(( code: Char('f'), modifiers: "CONTROL")),
    home: Some(( code: Char('g'), modifiers: "")),
    end: Some(( code: Char('G'), modifiers: "SHIFT")),
    shift_up: Some(( code: Char('K'), modifiers: "SHIFT")),
    shift_down: Some(( code: Char('J'), modifiers: "SHIFT")),

    edit_file: Some(( code: Char('I'), modifiers: "SHIFT")),

    status_reset_item: Some(( code: Char('U'), modifiers: "SHIFT")),

    diff_reset_lines: Some(( code: Char('u'), modifiers: "")),
    diff_stage_lines: Some(( code: Char('s'), modifiers: "")),

    stashing_save: Some(( code: Char('w'), modifiers: "")),
    stashing_toggle_index: Some(( code: Char('m'), modifiers: "")),

    stash_open: Some(( code: Char('l'), modifiers: "")),

    abort_merge: Some(( code: Char('M'), modifiers: "SHIFT")),
)

*こちら @torinos0909 さんからコメントで教えてくださいました(ありがとうございます!)

コンフィグの管理

例によって、コンフィグは Git 管理しておき、共有できるようにし、シンボリックリンクで各環境で使用できるよにしておく。

Neovim 上で、gitui を立ち上げられるようにする

Neovim 上で TUI である gitui を立ち上げるというのは、ターミナルパネルを開いて立ち上げるという意味ではなく、フローティングウィンドウで開けるようにするという事。

つまりこんな感じ。

image.png

下記 LazyGit の様に、LazyVim デフォルトの実装ではないため、Neovim 上ですぐに gitui を立ち上げられるようにするには少し工夫が必要。
しかし、やろうと思えばできるのである。(素晴らしい!!

これを可能にさせるには akinsho/toggleterm.nvim を利用する。

僕はプラグインマネージャーに LazyVim を使用しているので、以下の方法で導入を行う。

LazyVim に関しては次の記事を参照。

プラグインコンフィグ

以下の様にプラグインコンフィグを作成する。

lua/plugins/gitui.lua
return {
  {
    "akinsho/toggleterm.nvim",
    config = function()
      require("toggleterm").setup({
        direction = "float", -- 浮動ウィンドウで表示
        float_opts = {
          border = "curved",
        },
      })

      -- gitui 起動用の関数を定義
      local Terminal = require("toggleterm.terminal").Terminal
      local gitui = Terminal:new({
        cmd = "gitui",
        hidden = true,
        direction = "float",
        -- 閉じた時にバッファを削除
        on_open = function(term)
          vim.cmd("startinsert!")
          -- ターミナル内でのキー操作設定(任意)
          vim.api.nvim_buf_set_keymap(term.bufnr, "n", "q", "<cmd>close<CR>", {noremap = true, silent = true})
        end,
      })

      function _gitui_toggle()
        gitui:toggle()
      end

      -- キーマッピング (例: <leader>gg)
      vim.keymap.set("n", "<leader>gu", "<cmd>lua _gitui_toggle()<CR>", { desc = "GitUI (Float)" })
    end,
  },
}

これで次の様に Neovim 上のキーマップ操作で立ち上げることが出来るようになる。

output-palette.gif

gitui のこれから

gitui はまだ 1.0 ではないが、1.0 に至るまでのロードマップが公開されている。
これらが完了次第、1.0 は公開されるだろう。こちらに期待したい。

22
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?