そのまま使える、コレが私のVim設定だ！2024版

こんにちは！今回は、Vimの基本的なチートシートと、私が日々使用している`.vimrc`の設定をご紹介します。
この記事を読めば、Vimの基本操作から効率的な設定まで、すぐに実践できるはずです。

## Vimチートシート

### 基本モード
- ノーマルモード: デフォルトモード。
- 移動、コピー、削除などの操作を行う。
- インサートモード: テキスト入力モード。
- ビジュアルモード: テキスト選択モード。
- コマンドモード: コマンド実行モード。

### モード切り替え
- `i`: ノーマルモード → インサートモード
- `Esc`: 各モード → ノーマルモード
- `v`: ノーマルモード → ビジュアルモード
- `:`: ノーマルモード → コマンドモード

### 基本的な編集操作
- `x`: カーソル位置の文字を削除
- `dd`: 行を削除
- `yy`: 行をコピー
- `p`: カーソル位置の後にペースト
- `u`: 直前の操作を取り消し

### カーソル移動
- `h`: 左へ移動
- `j`: 下へ移動
- `k`: 上へ移動
- `l`: 右へ移動
- `w`: 次の単語の先頭へ
- `b`: 前の単語の先頭へ
- `0`: 行頭へ
- `$`: 行末へ

### ファイル操作
- `:w`: 保存
- `:q`: 終了
- `:wq` または `:x`: 保存して終了
- `:e filename`: ファイルを開く

### 検索と置換
- `/pattern`: 前方検索
- `?pattern`: 後方検索
- `n`: 次の検索結果へ
- `N`: 前の検索結果へ
- `:%s/old/new/g`: ファイル全体で置換

### ウィンドウ操作
- `:split`: 水平分割
- `:vsplit`: 垂直分割
- `Ctrl-w + h/j/k/l`: ウィンドウ間の移動

### その他の便利な機能
- `Ctrl-r`: やり直し（undoの反対）
- `.`: 直前の操作を繰り返す
- `>`: インデントを増やす
- `<`: インデントを減らす

### 高度な編集操作
- `ciw`: カーソル位置の単語を削除し、インサートモードに入る
- `ca"`: ダブルクォートで囲まれた部分を削除し、インサートモードに入る
- `gUiw`: カーソル位置の単語を大文字に変換
- `guiw`: カーソル位置の単語を小文字に変換
- `gJ`: 下の行を現在の行に結合（スペースを挿入）
- `J`: 下の行を現在の行に結合（スペースなし）

### マクロ
- `q{a-z}`: マクロの記録開始（a-zは任意のレジスタ）
- `q`: マクロの記録終了
- `@{a-z}`: 記録したマクロの実行
- `@@`: 最後に実行したマクロを再実行

### マーク
- `m{a-z}`: 現在の位置をマーク
- `'{a-z}`: マークした位置に移動

### 折りたたみ
- `zf`: 選択範囲を折りたたむ
- `zo`: 折りたたみを開く
- `zc`: 折りたたみを閉じる
- `zR`: すべての折りたたみを開く
- `zM`: すべての折りたたみを閉じる

### ファイル操作の拡張
- `:bnext` または `:bn`: 次のバッファに移動
- `:bprev` または `:bp`: 前のバッファに移動
- `:bd`: 現在のバッファを閉じる
- `:ls`: バッファのリストを表示
- `:edit!`: ファイルを強制的に再読み込み

### カーソル移動の拡張
- `gg`: ファイルの先頭へ移動
- `G`: ファイルの末尾へ移動
- `H`: 画面の先頭行へ移動
- `M`: 画面の中央行へ移動
- `L`: 画面の最下行へ移動

### タブ操作
- `:tabnew [filename]`: 新しいタブを開く
- `:tabclose`: 現在のタブを閉じる
- `:tabn`: 次のタブへ移動
- `:tabp`: 前のタブへ移動

### 便利なコマンド
- `:set list`: 表示不可の文字（空白やタブ）を表示
- `:set nolist`: 表示不可の文字を非表示
- `:set spell`: スペルチェックを有効にする
- `:set nospell`: スペルチェックを無効にする
- `:!command`: 外部コマンドを実行

## vimrcのおすすめ設定と解説

以下に、私が日々使用している`.vimrc`の設定を紹介します。
これらの設定はVimの使い勝手を大幅に向上させる！（と思ってます！）

```vim
" 基本設定
set nocompatible        " 互換モードを無効にする
set encoding=utf-8      " ファイルエンコーディングをUTF-8に設定
set fileencoding=utf-8  " 保存時のエンコーディングをUTF-8に設定
set fileencodings=utf-8,cp932,euc-jp,sjis " 読み込み時のエンコーディング候補
set fileformats=unix,dos,mac " ファイルフォーマットを設定
set ambiwidth=double    " 全角文字の幅を2に設定
set backspace=indent,eol,start " バックスペースキーの挙動を設定
set clipboard=unnamed,unnamedplus " システムクリップボードと共有

" 表示設定
set number              " 行番号を表示
set cursorline          " カーソル行を強調表示
set virtualedit=onemore " カーソルを行末の1文字分超えるように設定
set smartindent         " スマートインデントを有効にする
set visualbell          " ビープ音を視覚ベルに変更
set showmatch           " 対応する括弧を強調表示
set laststatus=2        " ステータスラインを常に表示
set wildmode=list:longest " コマンドライン補完をリスト表示
syntax enable           " シンタックスハイライトを有効にする

" タブ設定
set expandtab           " タブをスペースに変換
set tabstop=4           " タブ幅を4に設定
set shiftwidth=4        " 自動インデントの幅を4に設定

" 検索設定
set ignorecase          " 検索時に大文字小文字を区別しない
set smartcase           " 大文字を含む検索では区別する
set incsearch           " インクリメンタルサーチを有効にする
set wrapscan            " 検索をファイル末尾で折り返す
set hlsearch            " 検索結果を強調表示
nmap <Esc><Esc> :nohlsearch<CR><Esc> " Escキーで検索結果の強調表示を解除

" キーマッピング
inoremap jj <Esc>       " インサートモードでjjを押すとEscにマップ
nnoremap j gj           " jで行が折り返されている場合、物理行に移動
nnoremap k gk           " kで行が折り返されている場合、物理行に移動

" カーソル移動の高速化
nnoremap <C-d> <C-d>zz  " ページダウン後にカーソルを中央に配置
nnoremap <C-u> <C-u>zz  " ページアップ後にカーソルを中央に配置
nnoremap n nzzzv        " 次の検索結果に移動後、カーソルを中央に配置
nnoremap N Nzzzv        " 前の検索結果に移動後、カーソルを中央に配置

" ヤンク・クリップボードの共有
set clipboard+=unnamedplus " システムクリップボードと共有

" プラグイン管理（vim-plugを使用する場合）
call plug#begin('~/.vim/plugged')

" ここにプラグインを追加
" ファイルツリー
Plug 'preservim/nerdtree'
" ステータスライン
Plug 'vim-airline/vim-airline'
" Gitサポート
Plug 'tpope/vim-fugitive'

call plug#end()

" NERDTreeの設定
map <C-n> :NERDTreeToggle<CR> " Ctrl+nでNERDTreeをトグル
autocmd VimEnter * NERDTree   " Vim起動時にNERDTreeを開く

" Airlineの設定
let g:airline#extensions#tabline#enabled = 1   " タブラインを有効にする
let g:airline#extensions#tabline#formatter = 'unique_tail' " タブの表示形式を設定

" バックアップファイルを作成しない
set nobackup
set noswapfile

" 行末の空白を可視化
set listchars=tab:>-,trail:-,extends:>,precedes:<,nbsp:%
set list

" ビジュアルベルを無効化
set t_vb=
set visualbell t_vb=

" マウス操作を有効化
set mouse=a

" 80文字目にラインを表示
set colorcolumn=80

" ファイルタイプごとのインデント設定
augroup fileTypeIndent
    autocmd!
    autocmd BufNewFile,BufRead *.py setlocal tabstop=4 softtabstop=4 shiftwidth=4
    autocmd BufNewFile,BufRead *.rb setlocal tabstop=2 softtabstop=2 shiftwidth=2
    autocmd BufNewFile,BufRead *.js,*.html,*.css setlocal tabstop=2 softtabstop=2 shiftwidth=2
augroup END

" 括弧の自動補完
inoremap ( ()<Left>
inoremap { {}<Left>
inoremap [ []<Left>
inoremap " ""<Left>
inoremap ' ''<Left>
```

### 設定の解説

1. **基本設定**: UTF-8エンコーディングの使用、バックスペースキーの挙動の調整、システムクリップボードとの共有などを設定しています。

2. **表示設定**: 行番号の表示、カーソル行の強調表示、シンタックスハイライトの有効化など、視覚的な改善を行っています。

3. **タブ設定**: タブをスペースに変換し、幅を4に設定しています。これはコードの可読性を高めます。

4. **検索設定**: 大文字小文字を区別しない検索や、インクリメンタルサーチなど、検索機能を使いやすくしています。

5. **キーマッピング**: `jj`でインサートモードを抜けるなど、よく使う操作を効率化しています。

6. **カーソル移動の高速化**: ページ移動後にカーソルを中央に配置するなど、ナビゲーションを改善しています。

7. **プラグイン管理**: vim-plugを使用してプラグインを管理しています。NERDTree、Airline、Fugitiveなど、便利なプラグインを導入しています。

8. **バックアップファイルの無効化**: 不要なバックアップファイルやスワップファイルを作成しないようにしています。

9. **行末の空白の可視化**: 不要な空白を見つけやすくします。

10. **マウス操作の有効化**: GUIエディタのような操作感を実現します。

11. **80文字目のライン表示**: コードの可読性を高めるため、80文字目にラインを表示します。

12. **ファイルタイプごとのインデント設定**: 各プログラミング言語に適したインデント設定を自動的に適用します。

13. **括弧の自動補完**: 開き括弧を入力すると閉じ括弧も自動で挿入されます。

## まとめ

以上が私のVim設定です。
これらの設定を使うことで、Vimをより効率的に使用することができます。
ぜひ、自分の好みに合わせてカスタマイズしてみてください。
Vimの世界は奥が深く、探求し続けることができます
。Happy Vimming!