📝

効率的な開発環境を実現するdotfiles

に公開

効率的な開発環境を実現するdotfiles

開発者として生産性を高めるには、自分に合った開発環境の構築が欠かせません。僕が日々使用しているdotfilesリポジトリを紹介します。Dotbotによる自動セットアップ、Neovim、Zsh、Zellij、Alacrittyなどのツールがどのように開発効率を向上させているかを解説します。

dotfilesの価値

dotfilesは設定ファイルを一元管理するリポジトリで、以下のメリットがあります:

  • 複数マシン間で一貫した開発環境を維持
  • 設定のバージョン管理と共有が容易
  • 新しいマシンでの環境構築を自動化
  • 自分好みの環境を素早く再現

Dotbot: 設定ファイルの自動デプロイ

dotfilesの真価を発揮するために欠かせないのが、Dotbotによる設定ファイルの自動デプロイです。Dotbotは、YAMLファイルに基づいてシンボリックリンクの作成をするツールです。

install.conf.yamlの例

- defaults:
    link:
      create: true  # 必要なディレクトリを自動作成
      relink: true  # 既存のリンクを再作成

- clean: ['~']  # 古いシンボリックリンクを自動クリーンアップ

- create:  # 必要なディレクトリを事前に作成
    - ~/.ssh
    - ~/.config
    - ~/projects

- link:  # シンボリックリンクの設定
    ~/.vimrc: .vimrc
    ~/.zshrc: .zshrc
    ~/.config/nvim: .config/nvim
    ~/.config/alacritty: .config/alacritty
    ~/.config/zellij: .config/zellij
    ~/.config/nushell: .config/nushell
    ~/.config/sheldon: .config/sheldon

- shell:  # 追加のシェルコマンドを実行
    - [git submodule update --init --recursive, Installing submodules]

Dotbotのメリット

  1. 宣言的な設定: YAMLファイルで環境構築を宣言的に記述
  2. 冪等性: 何度実行しても同じ結果になる安全な設計
  3. 柔軟性: シンボリックリンク作成、ディレクトリ作成、シェルコマンド実行など多様な操作
  4. 拡張性: プラグインによる機能拡張が可能

新環境のセットアップ手順

新しいマシンでの環境構築は非常に簡単です:

# リポジトリをクローン
git clone https://github.com/username/dotfiles.git ~/.dotfiles
cd ~/.dotfiles

# インストールスクリプトを実行
./install

これだけで、全ての設定ファイルが適切な場所にシンボリックリンクとして配置されます。Dotbotはシンボリックリンクの作成と基本的なシェルコマンドの実行を自動化しますが、各ツール(Neovim、Zsh、Zellijなど)自体のインストールや、それらのプラグインのインストールは別途行う必要があります。

ただし、dotfilesリポジトリに各ツールのインストールスクリプトを含めておくことで、環境構築の手順を文書化し、再現性を高めることができます。僕はzshrcにある程度のツールインストールスクリプトをまとめているので、zshrcを読み込んだ際に、ツールコマンドがないツールのインストール処理が実行されるようにしています。

Neovim: 高度にカスタマイズ可能なエディタ

Neovimは単なるテキストエディタではなく、開発のための強力なプラットフォームです。Vimの哲学を継承しながら、非同期処理やLuaによる設定など、モダンな機能を備えています。

Mason: 統合プラグイン管理システム

僕の設定の中核となるのが、Masonを使ったプラグイン管理システムです。Masonは単なるプラグインマネージャではなく、LSP(Language Server Protocol)、リンター、フォーマッターなどの開発ツールを統合的に管理できる優れたシステムです。

-- Masonの基本設定
require('mason').setup()
require('mason-lspconfig').setup({
  -- 自動インストールするLSPサーバー
  ensure_installed = { "lua_ls", "rust_analyzer", "tsserver" }
})

-- LSPサーバーの設定を自動化
require('mason-lspconfig').setup_handlers({
  function(server_name)
    -- 各言語サーバーに共通の設定
    local capabilities = require('cmp_nvim_lsp').default_capabilities(
      vim.lsp.protocol.make_client_capabilities()
    )
    require("lspconfig")[server_name].setup {
      capabilities = capabilities,
    }
  end,
  -- 特定のLSPサーバーにカスタム設定
  ['lua_ls'] = function()
    require('lspconfig').lua_ls.setup {
      settings = {
        Lua = {
          diagnostics = {
            globals = { 'vim' }
          }
        }
      }
    }
  end
})

Masonのメリット

  1. 統合管理: LSP、リンター、フォーマッターを一元管理
  2. 簡単なインストール: UIからワンクリックでツールをインストール
  3. 自動設定: 必要なツールを自動的にインストールして設定
  4. バージョン管理: ツールのアップデートを簡単に管理
  5. 環境の一貫性: 異なるマシンでも同じ開発環境を再現

主要プラグイン

  • LSP (Language Server Protocol) - コード補完、定義ジャンプなどの機能

    -- LSPアタッチ時のキーマップ設定
    vim.api.nvim_create_autocmd('LspAttach', {
      callback = function(ev)
        local bufopts = { noremap = true, silent = true, buffer = ev.buf }
        vim.keymap.set('n', ',gd', vim.lsp.buf.definition, bufopts)
        vim.keymap.set('n', ',K', vim.lsp.buf.hover, bufopts)
        vim.keymap.set('n', ',rn', vim.lsp.buf.rename, bufopts)
        vim.keymap.set('n', ',ca', vim.lsp.buf.code_action, bufopts)
      end,
    })
    
  • Telescope - ファイル検索、コード検索を強化

    vim.keymap.set('n', '<Space>ff', function()
      builtin.find_files({
        use_regex = true,
        file_ignore_patterns = { ".git" },
      })
    end, {})
    
    -- ライブグレップ検索
    vim.keymap.set('n', '<Space>fg', function()
      require('telescope').extensions.live_grep_args.live_grep_args()
    end, {})
    
  • Treesitter - 高度な構文解析によるハイライト

    require('nvim-treesitter').setup({
      ensure_installed = { "lua", "rust", "javascript", "typescript" },
      highlight = { enable = true },
      indent = { enable = true }
    })
    
  • Git連携 - Gitsigns, Diffviewなどでバージョン管理を効率化

    require('gitsigns').setup({
      signs = {
        add = { text = '│' },
        change = { text = '│' },
        delete = { text = '_' },
      },
      on_attach = function(bufnr)
        local gs = package.loaded.gitsigns
        vim.keymap.set('n', ']c', gs.next_hunk, { buffer = bufnr })
        vim.keymap.set('n', '[c', gs.prev_hunk, { buffer = bufnr })
      end
    })
    
  • SKKeleton - 効率的な日本語入力

    vim.keymap.set({ 'i', 'c' }, '<C-j>', '<Plug>(skkeleton-enable)')
    

キーマッピング

ウィンドウ操作を効率化するカスタムキーマップ:

set('n', 'sj', '<C-w>j', { noremap = true })
set('n', 'sk', '<C-w>k', { noremap = true })
set('n', 'sl', '<C-w>l', { noremap = true })
set('n', 'sh', '<C-w>h', { noremap = true })

-- ウィンドウ分割
set('n', 'ss', ':<C-u>sp<CR>', { noremap = true })
set('n', 'sv', ':<C-u>vs<CR>', { noremap = true })

-- タブ操作
set('n', 'st', ':<C-u>tabnew<CR>', { noremap = true })
set('n', 'tl', ':tabnext<CR>', { noremap = true })
set('n', 'th', '::tabprevious<CR>', { noremap = true })

Neovimの開発体験

Masonを中心としたNeovim設定により、以下のような開発体験が実現します:

  • インテリジェントな補完: LSPによる文脈を考慮した高度な補完
  • リアルタイムエラーチェック: コードを書きながらエラーを検出
  • シームレスなナビゲーション: 定義ジャンプ、参照検索などの高速な移動
  • 自動フォーマット: 保存時に一貫したコードスタイルを適用
  • 言語に依存しない一貫した体験: どの言語でも同じ操作感

Zsh: 強力なシェル環境

Zshは高度なカスタマイズが可能なシェルで、様々なプラグインで機能拡張しています。

便利なエイリアス

# Git関連のエイリアス
alias gs='git status --short --branch'
alias ga='git add -A'
alias gc='git commit -m'
alias gl="git log --pretty='format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=format:'%c' --all --graph"

Zshプラグイン (Sheldon管理)

Sheldonを使って以下のプラグインを管理:

  • zsh-completions - 強化された補完機能
  • zsh-autosuggestions - コマンド入力時の候補表示
  • zsh-autocomplete - インタラクティブな補完
  • F-Sy-H - シンタックスハイライト
  • forgit - Gitコマンドのインタラクティブなインターフェース

便利な関数

# fzfを使ったGitコミット選択
function gco_fzf() {
  local commits commit
  commits=$(git log --pretty=oneline --abbrev-commit --reverse) &&
  commit=$(echo "$commits" | fzf --tac +s +m -e) &&
  git checkout $(echo "$commit" | sed "s/ .*//")
}

# fzfを使ったディレクトリ移動
function fd() {
  local dir
  dir=$(find ${1:-.} -path '*/\.*' -prune \
    -o -type d -print 2> /dev/null | fzf +m) &&
  cd "$dir"
}

Alacritty: 高速なGPUアクセラレーションターミナル

Alacrittyは、GPUアクセラレーションを活用した非常に高速なターミナルエミュレータです。シンプルさと速度を重視して設計されており、僕の開発環境の基盤となっています。

Alacrittyの主な特徴

  • 圧倒的な速度: GPUレンダリングによる高速な描画
  • 最小限の機能: 必要な機能だけに絞ったシンプルな設計
  • 高いカスタマイズ性: TOMLファイルによる柔軟な設定
  • クロスプラットフォーム: Linux、macOS、Windowsで一貫した体験

カスタマイズ例

# フォント設定 - Nerd Fontを使用して開発に必要なアイコンを表示
[font.normal]
family = "Hack Nerd Font Mono"
style = "Bold"

# カラースキーム - 目に優しい配色
[colors.primary]
background = "0xffffff"
foreground = "0x1F2328"

[colors.normal]
black = "0x24292f"
blue = "0x0969da"
cyan = "0x1b7c83"
green = "0x116329"
magenta = "0x8250df"
red = "0xcf222e"
white = "0x6e7781"
yellow = "0x4d2d00"

Alacrittyを選ぶ理由

  1. レイテンシの最小化: キー入力からの反応が非常に速く、ストレスなく作業できる
  2. リソース効率: 最小限の機能に絞ることでメモリ使用量を抑えている
  3. 設定の移植性: シンプルなTOML形式で設定を管理でき、環境間で簡単に共有できる
  4. Nerd Fontとの相性: 開発に便利なアイコンを美しく表示

Neovim、Zellij、Alacrittyの組み合わせ

Alacrittyをベースに、その上でZellijによるターミナルセッション管理、さらにNeovimによるコーディングという階層構造で開発環境を構築しています。この組み合わせにより、高速なレスポンス、効率的なマルチタスク、強力なコーディング環境が実現します。

Zellij: モダンなターミナルマルチプレクサ

Zellijは複数のターミナルセッションを効率的に管理する次世代のターミナルマルチプレクサです。tmuxと比較して、より直感的な操作性と美しいUIが特徴です。Rustで書かれており、パフォーマンスも優れています。

主な特徴

  • ペインとタブによる直感的なセッション管理
  • モード切替による一貫したキーボード操作
  • 美しいUIとカスタマイズ可能なレイアウト
  • セッション永続化によるワークフローの継続性
  • プラグインによる拡張性

モード駆動型のキーマッピング

Zellijの最大の魅力は「モード」の概念です。各モードで一貫したキーバインドを使うことで、少ないキーの組み合わせで多くの機能にアクセスできます:

keybinds {
    normal {
        // Ctrl+gでロックモードに切り替え、通常のターミナル操作に戻る
        bind "Ctrl g" { SwitchToMode "Locked"; }
        
        // 各種モードへの切り替え
        bind "p" { SwitchToMode "Pane"; }   // ペイン操作モード
        bind "t" { SwitchToMode "Tab"; }    // タブ操作モード
        bind "s" { SwitchToMode "Scroll"; } // スクロールモード
        bind "o" { SwitchToMode "Session"; } // セッション操作モード
        bind "n" { SwitchToMode "Resize"; } // リサイズモード
    }
    
    // ペイン操作モード - Vimライクなキーバインド
    pane {
        // Vimライクな移動
        bind "h" "Left" { MoveFocus "Left"; }
        bind "l" "Right" { MoveFocus "Right"; }
        bind "j" "Down" { MoveFocus "Down"; }
        bind "k" "Up" { MoveFocus "Up"; }
        
        // 新しいペインを作成
        bind "d" { NewPane "Down"; SwitchToMode "Locked"; }
        bind "r" { NewPane "Right"; SwitchToMode "Locked"; }
        
        // フルスクリーン切替
        bind "f" { ToggleFocusFullscreen; SwitchToMode "Locked"; }
        
        // ペインの枠を表示/非表示
        bind "z" { TogglePaneFrames; SwitchToMode "Locked"; }
    }
    
    // タブ操作モード
    tab {
        // タブ間の移動
        bind "h" "Left" { GoToPreviousTab; }
        bind "l" "Right" { GoToNextTab; }
        
        // 数字キーで特定のタブに直接ジャンプ
        bind "1" { GoToTab 1; SwitchToMode "Locked"; }
        bind "2" { GoToTab 2; SwitchToMode "Locked"; }
        // ...
    }
    
    // スクロールモード - ターミナル出力の閲覧
    scroll {
        // Vimライクなスクロール
        bind "j" "Down" { ScrollDown; }
        bind "k" "Up" { ScrollUp; }
        bind "d" { HalfPageScrollDown; }
        bind "u" { HalfPageScrollUp; }
        
        // 検索機能
        bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; }
    }
}

実用的な設定のポイント

// フレームレスでクリーンなUI - 画面スペースを最大化
pane_frames false

// シンプルなUI - 特殊文字を使わないクリーンな表示
simplified_ui true

// 起動時はロックモードに - 通常のターミナルとして使いやすく
default_mode "locked"

// テーマのカスタマイズ例
themes {
    dracula {
        fg 248 248 242
        bg 40 42 54
        // ...各種カラー設定
    }
}

Zellijを使った効率的なワークフロー

  • プロジェクトごとのセッション管理: 各プロジェクトに専用のセッションを作成し、作業コンテキストを保持
  • 開発環境の分割: エディタ、ビルド、ログ監視などを別々のペインで効率的に配置
  • キーボードだけで完結: マウスを使わずに全ての操作が可能
  • セッションの永続化: 接続が切れても作業を継続可能(SSH接続時に特に有用)

導入のメリット

  1. キーボード中心の効率的なワークフロー - マウスに手を伸ばす必要がなく、作業に集中できる
  2. 一貫性のある環境 - どのマシンでも同じ操作感で作業できる
  3. 学習と改善の継続 - 設定を少しずつ改良し、スキルアップにつながる
  4. チーム内での知識共有 - 効率的な設定やテクニックを共有できる

まとめ

dotfilesを活用することで、開発環境のセットアップ時間を大幅に削減し、日々の作業効率を向上させることができます。特にDotbotによる設定ファイルの自動デプロイと、Neovim、Zsh、Zellij、Alacrittyの組み合わせは、テキスト編集からターミナル操作まで一貫したキーボード中心の効率的なワークフローを実現します。

新しいマシンを手に入れたとき、必要なツールをインストールした後、dotfilesリポジトリをクローンして実行するだけで、自分好みの環境設定が再現できる喜びは何物にも代えがたいものです。ぜひ自分だけのdotfilesリポジトリを作成し、開発環境を進化させていきましょう!

コラボスタイル Developers

Discussion