wan0ri Lab

WezTerm 設定と VSCodeライクな Neovim 導入メモ

TL;DR

  • WezTerm へ移行。軽快でカスタムしやすい。
  • Cmd+Shift+F は「メニューを残した最大化」、Ctrl+Shift+F はネイティブ全画面。
  • Neovim を VSCode 風に整備(Dashboard/Dropbar/Context/Toggleterm/Copilot/Lazygit)。
  • インフラ用途(Terraform/YAML/Docker)重視。保存時フォーマットと LSP/診断まで最小構成。
  • 「VSCode ならどう押す?」の対応表を掲載。

今回の設定リポジトリ

  • Neovim: https://github.com/wan0ri/neovim
  • WezTerm: https://github.com/wan0ri/wezterm

Neovim を使ってみたいと思った理由

元々Vimを使うことに抵抗感が合ったのですが、以下の理由で使ってみたくなりました。

  • もともとターミナルが iTerm2 だったが、セッションが増えると動作が重く感じることがあった。
  • GPU 描画で軽いという評判の WezTerm を試したかった。
    • 公式: Wezterm: https://wezfurlong.org/wezterm
    • 公式: GitHub: https://github.com/wez/wezterm
  • ターミナルと VSCode を行き来するコンテキストスイッチを減らしたい。
    • CLI から “そのまま編集→コミット” まで完結させたい。
  • 参考: WezTerm のカスタマイズ記事(配色・UI の考え方)
    • https://zenn.dev/mozumasu/articles/mozumasu-wezterm-customization

備考: 端末エミュレータの性能はフォント・レンダリング設定・プラグイン状況で大きく変わるため、厳密なベンチは環境依存です。本記事では体感差と設定の工夫に主眼を置いています。

私自身がインフラクラウド領域の人間なので、VimであったりCLIだったりは、この先この領域を主戦場とするためには避けて通れないものであると思います。 ですので、今回はそれらのツールを使ってみて、あわよくば使いこなせたらいいかなと思い触れてみることにしました。


WezTerm の設定

今回のポイントは「VSCode/iTerm2 の癖を残しつつ、端末として軽快に」するために設定しました。 主要な調整点は次の通りです。

  • フォント/フォールバック
    • MesloLGS NF → Monaco → "Courier New" → Menlo、CJK/絵文字に Hiragino Sans / Apple Color Emoji を追加
    • フォントサイズ: 14pt、IME 有効化: use_ime = true
  • 透明度/背景
    • window_background_opacity = 0.65macos_window_background_blur = 10
  • タブ/見た目
    • タイトルバー簡素化(window_decorations = "RESIZE"
    • アクティブタブをシアン #00BCD4 に統一(format-tab-title で色付け)
    • カーソル色もシアン(cursor_bg/cursor_border/compose_cursor = "#00BCD4"
  • 改行とウィンドウ最大化
    • Option+Enter は「送信せず改行」: SendString("\n")
    • ウィンドウ最大化(メニューバーは表示のまま): Cmd+Shift+F
      • 独自イベント toggle-maximizewindow:maximize()/restore() をトグル
    • ネイティブ全画面(別スペース・メニュー非表示): Ctrl+Shift+F
  • そのほか
    • コピー/貼り付け: Cmd+c / Cmd+v、タブ操作(Cmd+t / Cmd+w / Ctrl+Tab)、リーダーキーは Ctrl+q
    • 端末の分割/操作: LEADER+d(縦)/ LEADER+r(横)/ LEADER+h/j/k/l(移動)/ LEADER+sh/j/k/l(サイズ調整)/ LEADER+z(ズーム)

設定例(keybinds の一部)

-- 改行(送信せず改行)
{ key = "Enter", mods = "ALT", action = act.SendString("\n") },
-- ウィンドウ最大化(メニューは残す)/ ネイティブ全画面
local __max_state = {}
wezterm.on("toggle-maximize", function(window, pane)
  local id = window:window_id()
  local dims = window:get_dimensions()
  if dims.is_full_screen then window:toggle_fullscreen() end
  if __max_state[id] then
    window:restore(); __max_state[id] = false
  else
    window:maximize(); __max_state[id] = true
  end
end)
{ key = "f", mods = "SUPER|SHIFT", action = act.EmitEvent("toggle-maximize") },
{ key = "f", mods = "CTRL|SHIFT", action = act.ToggleFullScreen },

私用の配色やキーはそのまま変更可能。詳細はリポジトリの wezterm.lua / keybinds.lua を参照。


Neovim

Neovim の設定(インフラ特化・VSCode 風)

パッケージ管理は lazy.nvim。VSCode 風の操作感に必要な最小セットのみ。which-key で日本語の説明も表示されるようにしている。

  • 見た目/操作
    • テーマ: vscode.nvim
    • 検索/コマンド: telescope.nvimCtrl-p = ファイル、<Space> sp = コマンド)
    • エクスプローラ: neo-tree.nvimCtrl-b トグル、隠し/無視ファイルも可視)
    • ステータス: lualine.nvim
    • インデントガイド: indent-blankline.nvim
  • Git
    • インライン差分: gitsigns.nvim
    • UI: neogit + diffview.nvim(必要に応じて vim-fugitive
  • LSP/補完/整形
    • mason.nvim + mason-lspconfig.nvim + nvim-lspconfig
    • LSP: terraformls / yamlls(+SchemaStore) / jsonls / dockerls / bashls / lua_ls / helm_ls / marksman
    • 補完: nvim-cmp(Enter 自動確定オフ)
    • 整形: conform.nvim(保存時フォーマット有効)
    • Lint: nvim-lint(markdownlint / yamllint はインストール時のみ自動実行)
  • Markdown
    • テーブル編集: vim-table-mode、プレビュー: glow.nvim

主要プラグインと役割(一覧)

  • UI/見た目: cobalt2.nvim(既定テーマ)/ vscode.nvim(予備)/ lualine.nvim / indent-blankline.nvim / hlchunk.nvim / dropbar.nvim / dashboard-nvim / nvim-web-devicons
  • 構文/解析: nvim-treesitter / nvim-treesitter-context
  • ファイル/検索: telescope.nvim + telescope-fzf-native / neo-tree.nvim
  • Git: gitsigns.nvim / neogit / diffview.nvim / vim-fugitive / lazygit(toggleterm 統合)
  • LSP/補完/整形/診断: mason.nvim / mason-lspconfig / nvim-lspconfig / nvim-cmp + cmp-* / LuaSnip + friendly-snippets / SchemaStore.nvim / conform.nvim / nvim-lint
  • インフラ: vim-terraform(保存時 terraform fmt 有効)/ vim-helm
  • Markdown: vim-table-mode / glow.nvim
  • ターミナル: toggleterm.nvim(下/右/フロート)+ lazygit 連携(<leader>gg
  • 移動: accelerated-jk.nvim
  • AI: copilot.vim / CopilotChat.nvim

LSP/Formatter 既定

  • Terraform: terraformls / terraform_fmt
  • YAML: yamlls + SchemaStore / yamlfmt(なければ Prettier)
  • JSON/JSONC: Prettier + SchemaStore
  • Lua: lua_ls / stylua
  • Shell: bashls / shfmt
  • Markdown: marksman / Prettier、Lint は markdownlint

保存時フォーマットは conform.nvim で有効。<leader>f で手動フォーマット。

Lazygit 連携(toggleterm)

  • 使い方: <leader>gg でフロート起動/終了(Git ルートで開く)。
  • 事前準備: brew install lazygit などで本体をインストール。

テーマを Cobalt2 に変更(VSCode Cobalt2 に近づける)

  • 追加プラグイン: lalitmee/cobalt2.nvim(依存: rktjmp/lush.nvim, tjdevries/colorbuddy.nvim
  • 適用: :Lazy sync 後に自動適用(または :colorscheme cobalt2
  • 透過を活かす: Normal/NormalFloat の背景を none に上書き可能

色のメリハリを強化(Treesitter 上書き)

  • 割り当て例(Cobalt2 寄り)
    • 文字列=緑、数値/boolean=オレンジ、定数=ピンク、関数/型=シアン、キーワード=青(イタリック)、プロパティ/フィールド=黄
  • Terraform/HCL は vim-terraform の正規表現ハイライトも併用(additional_vim_regex_highlighting

検索ハイライトの扱い

  • 普段は点灯、Esc で一発消灯(<Esc>:nohlsearch を割当)

キーマップ(抜粋)

  • Quick Open: Ctrl-p
  • コマンドパレット: <Space> sp
  • エクスプローラ: Ctrl-b
  • 検索: <Space> fg、バッファ一覧: <Space> fb
  • 保存時フォーマット(手動は <Space> f
  • LSP: gd(定義)/ gr(参照)/ K(Hover)/ <Space> rn(Rename)/ <Space> ca(CodeAction)

VSCode のあれを Neovim/WezTerm でどうやる?(要点)

よく使う操作の対応。which-key を押せば日本語の説明が出るので暗記は最小限でOK。

  • Quick Open: VSCode「Cmd+P」→ Neovim Ctrl-p(Telescope)
  • コマンドパレット: VSCode「Cmd+Shift+P」→ Neovim <leader>sp
  • エクスプローラ: VSCode「Cmd+B」→ Neovim Ctrl-b(Neo-tree)
  • 整形(Format Document): VSCode「Shift+Option+F」→ Neovim <leader>f(保存時自動も有効)
  • コメントトグル: VSCode「Cmd+/」→ Neovim gcc(行)/ gc(範囲)
  • リネーム: VSCode「F2」→ Neovim <leader>rn
  • 定義/参照: VSCode「F12/Shift+F12」→ Neovim gd / gr
  • 画面分割(エディタ): VSCode(横/縦分割)→ Neovim Ctrl-w s(横)/ Ctrl-w v(縦)、移動は Ctrl-w h/j/k/l、サイズ変更は Ctrl-w + - < >、等幅 Ctrl-w =
  • 統合ターミナル: VSCode「Ctrl+」→ Neovim tt(下)/ tv(右)/ tf(フロート)。複数は :ToggleTerm 2など ID で増設、並べるときはCtrl-w v/s`
  • Git パネル: VSCode(SCM)→ Neovim :Neogit / :DiffviewOpen、または <leader>gg(Lazygit)
  • パンくず: VSCode(上部パンくず)→ Neovim は dropbar が winbar に表示、 <leader>db で選択
  • 現在の関数/ブロック見出し: VSCode 類似 → nvim-treesitter-context(上部に固定)/ <leader>ct でトグル
  • Docker → dockerls(LSP)
  • HashiCorp Terraform → terraformls + vim-terraform(fmt は Conform 経由)
  • YAML → yamlls + SchemaStore、yamllint(任意)
  • Markdown All in One / markdownlint / Markdown Table → marksman + glow.nvim + vim-table-mode + nvim-lint(markdownlint)
  • Git Graph / Pull Requests → neogit + diffview.nvim(PR 操作は Octo.nvim 等で拡張可能)
  • Material Icon Theme → nvim-web-devicons

Neovim の基本操作(最初の 5 分)

  1. プロジェクトを開く: 端末で nvim .
  2. エクスプローラ: Ctrl-b → 目的のファイルで Enter
  3. 検索: Ctrl-p(ファイル)、<Space> fg(全文検索)
  4. 編集/保存: i で挿入 → Esc:w
  5. LSP 補助: gd / gr / K / <Space> rn / <Space> ca

GitHub へのコミット/プッシュ(Neogit or Lazygit)

  1. 保存: :wa
  2. Neogit を開く: :Neogit
  3. 変更をステージ: s(選択)/ S(全て)
  4. コミット: cc(メッセージを 1 行目に書き、Ctrl-c Ctrl-c で確定)
  5. プッシュ: Pp(注意: 小文字 p は Pull、P が Push のポップアップ)
  6. 差分の確認: :DiffviewOpen(閉じる :DiffviewClose
  7. もしくは <leader>gg で Lazygit を開いて、ステージ/コミット/プッシュまで一気に操作

LSP(Terraform など)の導入手順とコツ

  1. :Mason を開く → terraform-ls を選択して i(Install)
  2. PATH を通す(任意・安心運用): echo 'export PATH="$HOME/.local/share/nvim/mason/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
  3. Terraform ファイルを開く → :LspInfoterraformls が Attached になっているか確認

備考

  • Mason UI: 移動 j/k、詳細 Enter、インストール i、更新 u/U、削除 X、フィルタ 1..5 or <C-f>、ヘルプ g?
  • 互換対応: setup_handlers が未定義な環境でも、インストール済みサーバを検出して個別起動するフォールバックを構成
  • 0.11 の非推奨通知: require('lspconfig') は段階的に vim.lsp.config へ移行予定(当面は動作に影響なし)

トラブルシュート(今回ハマった所)

  • Option+Enter が改行にならない → SendString("\n") を割り当て(送信=CR ではなく LF を直挿入)
  • IME 合成中の緑カーソル → compose_cursor をシアンに変更
  • 隠し/無視ファイルが見えない(tfvars など)→ Neo-tree の hide_gitignored=false, hide_dotfiles=false、Telescope は <Space> fa で hidden+no_ignore 検索
  • 保存時に markdownlint エラー(ENOENT)→ nvim-lint を「コマンドが見つかった時だけ実行」に変更。導入時は brew install markdownlint-cli yamllint など
  • Neogit で Push したつもりが反映されない → 小文字 p は Pull。Push は Pp
  • Cobalt2 適用時に colorbuddy 未導入で失敗 → 依存 tjdevries/colorbuddy.nvim を追加、失敗時は vscode へフォールバック
  • Comment.nvimInvalid commentstring → マッピングを遅延実行へ修正(ファイルタイプ確定後に動作)
  • mason-lspconfigsetup_handlers が未定義 → フォールバック実装で解消

参考リンク(性能・比較・背景)

  • WezTerm のレンダリングと GPU アクセラレーション(公式ドキュメント) https://wezterm.org/config/lua/config/front_end.html
  • WezTerm 概要(公式サイト) https://wezterm.org
  • ベンチ結果の一例(2024-12、個人検証・比較。Ghostty/WezTerm/Kitty/iTerm2 など) https://caluga.de/v/2024/12/27/ghostty
  • GitHub Discussions: フレームレート/出力スループットの比較議論(コミュニティ投稿) https://github.com/wez/wezterm/discussions/3664
  • Warp 公式ドキュメントのベンチページ(比較のサンプル。測定条件やバージョン差に注意) https://docs.warp.dev/how-does-warp-compare/performance

注意: 上記のベンチや所感は測定条件・端末サイズ・GPU/OS/バージョンで大きく変動します。厳密な比較は自環境での再計測が必要です(例: termbench, vtebench など)。


最後に

WezTerm × Neovim の組み合わせで、CLI に居ながら編集〜コミットまでが高速に回るようになりました。 VSCode 完全互換ではないものの、今回の最小セットで “迷わず手が動く” ところまではカバーできています。設定はリポジトリに置いてあるので、フォントやキーは各自の好みに合わせて調整してください。

参考リンク

  • WezTerm 公式: https://wezfurlong.org/wezterm
  • WezTerm GitHub: https://github.com/wez/wezterm
  • Neovim: https://neovim.io
  • 記事: WezTerm カスタマイズ(Zenn): https://zenn.dev/mozumasu/articles/mozumasu-wezterm-customization