🛠️

2025年版: 開発環境のツールまとめ

に公開

この記事は MICIN Advent Calendar 2025 の 19日目の記事です。
前回は藤原さんのペルソナの感情からはじめる肥満症治療プロダクト設計〜 Cursorで一日ハッカソンに挑んで見えたこと〜でした。

1.はじめに

SREチームの小野です。
普段はAWSやGCPなどのクラウドの管理やモニタリングの整備などを行っています。

実はIT業界に就職したのは、「映画などで黒い画面に向かってカタカタしてる人がかっこよかったから」という私にとっては、モダンなIDEよりもターミナルやvimなどの方が好みです。
とはいえIDEでサクサクと開発している人を見るとそれはそれで憧れるので、CLIツールや様々なプラグインを使ってモダンな環境に近づけようとしてます。

今回は私が普段使っている開発環境のツールを紹介します。ターミナル周りのツールが中心ですが、気になるものがあればぜひ試してみてください。

2.ターミナル・シェル環境

Alacritty

ターミナルエミュレータはAlacrittyを使っています。Rust製でGPUアクセラレーションに対応しており、動作が軽快です。

brew install --cask alacritty

元々はiTerm2を使ってました。特に気に入らないことがあったわけではないですが、後述するZellijを使う場合にAlacrittyを使っている人が多そうだったのと、タブ機能やウィンドウ分割はZellijでできるので問題なく移行できました。
Cmd+Uで透過の切り替えができる点は欲しかったので、Hammerspoonで設定ファイルを書き換えることで実現してます。

-- ~/.hammerspoon/init.lua
hs.hotkey.bind({ "cmd" }, "U", function()
  hs.execute("toggle_opacity", true)
end)

toggle_opacityはAlacrittyの設定ファイル内のopacityを書き換えるシェルスクリプトです。PATHの通った場所に配置しておきます。

#!/usr/bin/env bash
# toggle_opacity

[[ ! -f ${XDG_CONFIG_HOME}/alacritty/alacritty.toml ]] && exit 0

opacity=$(awk '$1 == "opacity" {print $3; exit}' \
    $XDG_CONFIG_HOME/alacritty/alacritty.toml)

case $opacity in
  1)
    toggle_opacity=0.6
    ;;
  *)
    toggle_opacity=1
    ;;
esac

sed -i "" "s/opacity = $opacity/opacity = $toggle_opacity/g" \
  $XDG_CONFIG_HOME/alacritty/alacritty.toml

設定ファイルは ~/.config/alacritty/alacritty.toml に配置します。

[shell]
program = "/bin/zsh"
args = ["--login"]

[cursor]
style = "Beam"

[font]
size = 14.0

[font.normal]
family = "HackGen35 Console NF"

[window]
opacity = 1

[window.dimensions]
columns = 185
lines = 85

[keyboard]
bindings = [
  { key = "Return", mods = "Command", action = "ToggleFullScreen"}
]

フォントはHackGenを使っています。日本語表示とNerd Fontsに対応しているので、アイコン表示も問題ありません。

最近はWarpWaveTermなど、AI機能やブラウザ統合を備えたターミナルも登場しています。iTerm2もブラウザ機能が追加されました。ターミナルとブラウザは一番よく使うツールなので、ターミナルからブラウザを起動できるのは魅力的です。気になっているので、いずれ試してみたいと思っています。

Zellij

Zellijはターミナルマルチプレクサです。tmuxの代替として使えるRust製のツールです。

brew install zellij

tmuxは使ってみたいなと思ってたのですが、キーバインドなどを覚えないといけないのと設定が複雑そうだったので手が出ずにいました。Zellijの場合は画面下部にキーバインドが表示されるので非常に使いやすいです。

主な機能は以下の通りです。

  • ペイン: 画面を分割して複数のターミナルを同時に表示
  • タブ: 複数の作業領域を切り替え
  • セッション: 作業状態を保存してデタッチ/アタッチ
  • スクロール: Vimキーバインドで履歴をスクロール
操作 キー
下にペイン分割 Ctrl+pd
右にペイン分割 Ctrl+pr
新規タブ Ctrl+tn
スクロールモード Ctrl+s
セッション一覧 Ctrl+ow
デタッチ Ctrl+od

スクロールモード(Ctrl+s)に入りeを入力すると、デフォルトのエディタ(私の場合はnvim)でターミナル出力を閲覧できます。ターミナルの検索機能でもいいのですが、vimライクにスクロールしたりコピーしたりするのはマウスに手を伸ばしたくない私からすると嬉しい機能です。

複数のリポジトリにまたがって作業することが多いので、コンテキストが違う作業をする際にはタブで分けてます。一方で、DockerやNode.jsを動かしながら開発をしたい場合はペインを分割して、片方でエディタ、もう片方でdocker-compose upnpm run devのログを流しておくことが多いです。

zsh + sheldon

シェルはzshを使っています。プラグイン管理にはsheldonを利用しています。

brew install sheldon

以前はzplugを使っていましたが、2017年から更新が止まっているため乗り換えました。sheldonはRust製で高速、TOML形式の設定ファイルもmiseと似ていてわかりやすいです。

oh-my-zshは便利なフレームワークですが、不要なプラグインまで入ってしまい起動が遅くなりがちです。必要なプラグインだけを個別に入れたいので使っていません。

# ~/.config/sheldon/plugins.toml
shell = "zsh"

[plugins.zsh-autosuggestions]
github = "zsh-users/zsh-autosuggestions"

[plugins.zsh-completions]
github = "zsh-users/zsh-completions"

[plugins.zsh-async]
github = "mafredri/zsh-async"

[plugins.pure]
github = "sindresorhus/pure"

# syntax-highlighting は最後に読み込む
[plugins.zsh-syntax-highlighting]
github = "zsh-users/zsh-syntax-highlighting"

.zshrcからは1行で読み込みます。

eval "$(sheldon source)"

それぞれ簡単に紹介します。

プラグイン 説明
zsh-autosuggestions コマンド履歴から入力候補をグレー表示
zsh-completions 追加の補完定義
zsh-syntax-highlighting コマンドのシンタックスハイライト
pure ミニマルなプロンプトテーマ

zsh-autosuggestionsは入力中に履歴から候補を表示してくれるので、よく使うコマンドに関しては少ない入力数ですみます。

zsh-autosuggestionsの動作例

CLIツール

昔からある従来のコマンドの代替となるツールを使っています。いずれもRust製で高速に動作します。
置き換える必要があるのかなと思ってましたが、導入してみると見た目がモダンっぽくなるのでテンションが上がり生産性もきっと上がります。

従来コマンドの代替

従来 代替 説明
ls eza アイコン表示、Git連携
cat bat シンタックスハイライト、行番号
grep ripgrep 高速検索、.gitignore対応
find fd シンプルな構文、高速
cd zoxide 学習型ディレクトリジャンプ
brew install eza bat ripgrep fd zoxide
eza

ezalsの代替です。ファイルの種類に応じたアイコン表示やGitの状態表示ができます。アイコン表示が気に入っていて、そのためにNerd Fonts対応のフォント(HackGen)を導入しています。

alias ei="eza --icons --git"
alias ea="eza -la --icons --git"
alias ee="eza -aahl --icons --git"
alias et="eza -T -L 3 -a -I 'node_modules|.git|.cache' --icons"
alias ls=ei
alias la=ea
alias ll=ee

-Tオプションでツリー表示もできるので、treeコマンドの代わりにもなります。

ezaの表示例

bat

batcatの代替です。シンタックスハイライトと行番号が表示されます。

bat README.md
ripgrep

ripgrepgrepの代替です。デフォルトで再帰検索し、.gitignoreのパターンを自動で除外してくれます。

rg "TODO"
rg -t py "import"  # Pythonファイルのみ

ripgrepに関してはとにかく高速で検索してくれるので重宝してます。VSCodeの内部検索にも採用されているほど高速です。

fd

fdfindの代替です。構文がシンプルで、デフォルトで.gitignoreのパターンを除外してくれます。

fd README           # READMEを含むファイルを検索
fd -e md            # 拡張子が.mdのファイルを検索
fd -t d node        # nodeを含むディレクトリを検索

findのオプションは覚えにくいですが、fdは直感的に使えます。

zoxide

zoxidecdの代替です。移動先のディレクトリを学習して、部分一致でジャンプできます。

.zshrcで以下のように設定すると、cdコマンドをzoxideに置き換えられます。

eval "$(zoxide init zsh --cmd cd)"
cd proj      # "proj" を含むよく行くディレクトリへ
cd foo bar   # "foo" と "bar" を含むディレクトリへ
cdi          # fzfでインタラクティブに選択

以前はenhancdを使っていましたが、zoxideに乗り換えました。スコアリングによる学習機能があり、よく使うディレクトリほど優先されます。

その他

fzf

ファジーファインダーは定番のfzfを使っています。ghqと組み合わせて、Ctrl+]でリポジトリ一覧を表示して移動できるようにしています。

mise

miseはランタイムのバージョン管理ツールです。以前はasdfやnodenv、rbenvなどを個別に使っていましたが、miseに統一しました。

brew install mise

Rust製で高速に動作し、asdfプラグインとの互換性があります。環境変数の管理もできるので、direnvの代わりにもなります。

# ~/.config/mise/config.toml
[tools]
awscli = "latest"
node = "latest"
ruby = "3.4.2"
neovim = "latest"
terraform = "latest"
go = "latest"
postgres = "17"
zoxide = "latest"

グローバル設定は上記のように ~/.config/mise/config.toml に書いています。プロジェクトごとに .mise.toml を配置すれば、ディレクトリ単位でバージョンを切り替えられます。

mise install        # 設定ファイルのツールをインストール
mise list           # インストール済みのツール一覧
mise use node@20    # プロジェクトで使うバージョンを指定

環境変数もmiseで管理できます。

# .mise.toml
[env]
AWS_PROFILE = "my-profile"
TF_VAR_environment = "staging"

ディレクトリに移動すると自動で適用されるので、プロジェクトごとに異なるバージョンと環境変数の両方を一元管理できます。

3.エディタ(Neovim)

エディタはNeovimを使っています。プラグイン管理にはlazy.nvimを採用しています。

AstroNvimやLazyVimなどのディストリビューションは使っていません。oh-my-zshを使わないのと同じ理由で、不要な機能まで入ってしまうのと、中身がブラックボックスになって問題が起きたときに対処しづらいからです。必要なプラグインだけを自分で選んで入れています。

ディレクトリ構成

~/.config/nvim/
├── init.lua
├── lazy-lock.json
└── lua/
    ├── config/
    │   └── lazy.lua       # lazy.nvimの設定
    ├── plugins/           # プラグイン定義
    │   ├── lsp.lua
    │   ├── telescope.lua
    │   ├── treesitter.lua
    │   └── ...
    ├── colorscheme/
    │   └── init.lua       # カラースキーム設定
    ├── command/
    │   └── init.lua       # カスタムコマンド
    ├── keymap/
    │   └── init.lua       # キーマップ
    └── options/
        └── init.lua       # オプション設定

init.luaはエントリーポイントで、各モジュールを読み込むだけのシンプルな構成にしています。

-- init.lua
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"

require("config.lazy")
require("options")
require("keymap")
require("command")
require("colorscheme")

config/lazy.luaでlazy.nvimの初期化とプラグインの読み込みを行っています。

-- config/lazy.lua
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
  vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup({
  spec = {
    { import = "plugins" },  -- plugins/ディレクトリ内の全ファイルを自動読み込み
  },
  checker = { enabled = true },
})

{ import = "plugins" }を指定すると、plugins/ディレクトリ内の全ファイルが自動で読み込まれます。プラグインを追加したいときはplugins/に新しいファイルを作るだけです。

プラグイン紹介

Neovimのプラグインだけで一つの記事になってしまうので、ここでは入れてみて便利だと感じたプラグインだけ紹介します。

telescope.nvim

telescope.nvimはNeovim用のファジーファインダーです。AstroNvimやLazyVimなどのディストリビューションにもデフォルトで含まれている定番プラグインです。内部でripgrepを使っているので検索が高速です。

{
  "nvim-telescope/telescope.nvim",
  dependencies = {
    "nvim-lua/plenary.nvim",
    "nvim-telescope/telescope-file-browser.nvim",
  },
  keys = {
    { "<leader>k", "<cmd>Telescope find_files<cr>", desc = "Find Files" },
    { "<leader>kk", "<cmd>Telescope live_grep<cr>", desc = "Live Grep" },
    { "<leader>b", "<cmd>Telescope buffers<cr>", desc = "Buffers" },
    { "<leader>f", "<cmd>Telescope file_browser<cr>", desc = "File Browser" },
    { "<leader>ls", "<cmd>Telescope lsp_document_symbols<cr>", desc = "Document Symbols" },
    { "<leader>ld", "<cmd>Telescope diagnostics<cr>", desc = "Diagnostics" },
  },
  config = function()
    local telescope = require("telescope")
    telescope.setup({
      defaults = {
        file_ignore_patterns = { "node_modules", ".git/" },
      },
    })
    telescope.load_extension("file_browser")
  end,
}

バッファ一覧はプレビュー付きで表示されるので、複数ファイルを開いているときに便利です。ドキュメントシンボルは長いファイルで関数やクラスを探すときに使っています。

telescope.nvimの動作例

ファイルツリーにはneo-tree.nvimを使っています。<leader>eで表示を切り替えます。

nvim-treesitter

nvim-treesitterはシンタックスハイライトを強化するプラグインです。Neovim 0.10以上が必要です。私はmiseでNeovimを管理しています。

mise use -g neovim@latest
nvim --version  # NVIM v0.11.1

従来のシンタックスハイライトは正規表現ベースでしたが、treesitterはコードをAST(抽象構文木)として解析します。これにより、文字列の中のキーワードに誤って色が付くようなことがなくなり、より正確なハイライトが得られます。

{
  "nvim-treesitter/nvim-treesitter",
  build = ":TSUpdate",
  event = { "BufReadPost", "BufNewFile" },
  config = function()
    require("nvim-treesitter.configs").setup({
      ensure_installed = {
        "lua", "vim", "vimdoc",
        "javascript", "typescript", "tsx",
        "python", "go", "rust",
        "json", "yaml", "toml",
        "html", "css", "markdown",
        "terraform", "hcl",
      },
      highlight = { enable = true },
      indent = { enable = true },
    })
  end,
}

ensure_installedに言語を追加しておけば、初回起動時に自動でパーサーがインストールされます。正直なところ、treesitterを入れている一番の理由は後述するhlchunk.nvimのためです。

noice.nvim

noice.nvimはコマンドラインやメッセージ、通知のUIを刷新するプラグインです。従来の画面下部に表示されるコマンドラインが、ポップアップ表示に変わります。

{
  "folke/noice.nvim",
  event = "VeryLazy",
  opts = {},
  dependencies = {
    "MunifTanjim/nui.nvim",
    "rcarriga/nvim-notify",  -- 通知用(オプション)
  }
}

検索(/?)を実行するとインクリメンタルに結果がハイライトされたり、LSPの進捗状況が右下に表示されたりと、全体的に現代的なUXになります。

which-key.nvim

which-key.nvimはキーバインドのヘルプを表示するプラグインです。Leaderキーを押した後、次に何を押せばいいかを忘れたときに便利です。

{
  "folke/which-key.nvim",
  event = "VeryLazy",
  opts = {},
  keys = {
    {
      "<leader>?",
      function()
        require("which-key").show({ global = false })
      end,
      desc = "Buffer Local Keymaps (which-key)",
    },
  },
}

<leader>を押して少し待つと、利用可能なキーマップがポップアップで表示されます。設定したキーバインドを覚えていなくても、このポップアップを見ながら操作できます。

hlchunk.nvim

hlchunk.nvimは現在のカーソル位置がどのインデントブロックに含まれているかを視覚的に強調表示してくれます。深くネストした関数やif文の中で作業しているときに、今どのスコープにいるのかが一目でわかるので気に入っています。treesitterを使ってコードチャンクを検出しているので、nvim-treesitterが必要です。

hlchunk.nvimの動作例

その他

  • nvim-autopairs: 括弧の自動補完
  • vim-fugitive: Git操作
  • vim-terraform: Terraformファイルの保存時にfmt実行

カラースキームはsonokaiを使っています。

4.Git関連ツール

Git操作を効率化するツールをいくつか使っています。

brew install gitui gh git-delta

GitUI

GitUIはターミナルベースのGit UIです。Rust製で高速に動作します。

alias gui='gitui'

lazygitも試しましたが、GitUIの方が動作が軽快でキーバインドも直感的だったので乗り換えました。

画面はタブで切り替えられるようになっていて、Status、Log、Stashingなどを行き来できます。Logタブではコミット履歴を見ながらresetやrevertが直感的に行えます。

ブランチ操作も便利で、ブランチの作成・切り替え・削除がキーボードだけで完結します。Stashもよく使っていて、作業途中で別ブランチに切り替えたいときに重宝しています。

差分を見ながらファイル単位・行単位でステージングできるのも気に入っているポイントです。

gh

ghはGitHub公式のCLIです。PRの作成やIssueの管理をターミナルから行えます。

gh pr create          # PR作成
gh pr view --web      # PRをブラウザで開く
gh pr checkout 123    # PRのブランチをチェックアウト
gh issue list         # Issue一覧

ブラウザを開かずにPRを作成できるので、作業の流れを中断せずに済みます。

git-delta

deltaはdiffの表示を見やすくするツールです。シンタックスハイライトと行番号が表示されます。

.gitconfigに設定を追加します。

[core]
  pager = delta

[interactive]
  diffFilter = delta --color-only

[delta]
  navigate = true
  side-by-side = true

side-by-side = trueで左右に並べて表示できます。

5.AIコーディングツール

MICINでは生成AIを積極的に試せるので、私はClaude CodeKiro CLICursorを用途に応じて使い分けています。

ツール 用途
Claude Code 開発のメイン。コード生成、リファクタリング、ファイル編集
Kiro CLI AWS系の調査や設定確認
Cursor MCPを使った外部連携、ローカルのナレッジベースを元にした仕様確認

普段のエディタはNeovimのままで、ターミナル上でClaude Codeを使うのがメインのワークフローです。シェルコマンドの実行やファイル操作をシームレスに行えるので、普段の作業フローを崩さずにAIを活用できます。

AWS関連の調査ではKiro CLIを使っています。ECSのタスク停止理由の確認やCloudTrailのログ調査など、メトリクスやログを見ながらの調査で重宝しています。

CursorはMCPサーバーを呼び出したいときや、ローカルに置いたドキュメントをナレッジベースとして参照したいときに使っています。プロダクトの仕様確認など、コンテキストが重要な場面で便利です。

Neovim内でAIを使うプラグインとしてavante.nvimclaude-code.nvimも試しましたが、ターミナルで直接Claude Codeを使う方に慣れてしまい、今はあまり使っていません。

6.おわりに

私が普段使っている開発環境のツールを紹介しました。

ターミナル周りのツールはRust製のものが増えてきていて、動作が軽快なのが嬉しいところです。従来のコマンドを置き換えるだけでも体験が良くなるので、気になるものがあれば試してみてください。

最後まで読んでいただきありがとうございました。


MICINではメンバーを大募集しています。
「とりあえず話を聞いてみたい」でも大歓迎ですので、お気軽にご応募ください!

https://recruit.micin.jp/

株式会社MICIN

Discussion