Mac 標準のVimを魔改造する

## やりたいこと

M1 Mac Ventura において、

1. iTerm2 による便利かつカッコいい見た目のターミナルで、

2. 以下の機能を持った Vim を CUI で使いたい。
    - 文字コード、タブ・インデントあたりの挙動が快適
    - NeoBundle を用いてプラグインを管理できる
    - カラースキーム、ステータスライン、インデント可視化でコードが見やすい
    - クリップボード連携
    - オートセーブ機能
    - 背景色が半透明

Mac に標準インストールされている Vim は最低限の要素しか入っていない「vim.tiny」だと思っていたのですが、私の環境 (M1 Mac Ventura) ではどういうわけか clipboard 連携にはじめから対応していました。ラッキー！

```shell:terminal
% which vim

/usr/bin/vim


% vim --version | grep clipboard

+clipboard         -keymap            +printer           +vertsplit
+eval              -mouse_jsbterm     -sun_workshop      -xterm_clipboard
```

ということで、Mac に最初から入っている Vim をそのままサクッと魔改造していきます。

## iTerm2 のインストールと設定

Mac用のターミナルエミュレータ「iTerm2」をインストールします。Mac標準のターミナルよりもずっと使いやすく、カスタマイズ性が高いです。以下のサイトからインストールファイルをダウンロードできます。

https://iterm2.com/

ありがたい先人達の記事を参考に、使いやすくします。powerlevel10k を使うとお手軽に見た目をカッコよくできます。

<br>

 - ホットキーで画面下半分に半透明のターミナルが現れるような設定

https://qiita.com/yugona/items/7e5b9789098bae92458f

- powerlevel10k の質問に答えて iTerm2 の見た目をかっこよくする

https://qiita.com/aki319809/items/452fa8a1a96323e2677f

powerlevel10k を適用した後は、一度 iTerm2 を再起動する必要があります。

:::note info
この時点で iTerm2 での256色環境の設定も済んでいるはずなので、後で設定する Syntax ハイライトも綺麗に表示されるようになります。
:::

## Vim の設定

### NeoBundle のインストール

まず、Vimプラグインを管理するためのVimプラグインである「NeoBundle」を導入します。

NeoBundle - GitHub

https://github.com/Shougo/neobundle.vim

```shell:terminal
% git clone https://github.com/Shougo/neobundle.vim.git ~/.vim/bundle/neobundle.vim

Cloning into '/Users/xxx/.vim/bundle/neobundle.vim'...
remote: Enumerating objects: 9242, done.
remote: Total 9242 (delta 0), reused 0 (delta 0), pack-reused 9242
```

:::note warn
`git clone`するリンク先は、`https://github.com/Shougo/neobundle.vim` ではなく `https://github.com/Shougo/neobundle.vim.git` です。`Readme.md` のとおりのコマンドを打つと、末尾の`.git`が抜けていてうまくクローンできませんでした。
:::

### `~/.vimrc` の設定

ホームディレクトリに`.vimrc`という名前のテキストファイルを作成し、ここにカスタマイズ内容を記述していくと Vim に反映されます。

私は次の記事のほぼコピペでカスタマイズ内容を構成しました。。

<br>

- 構成の大部分

https://qiita.com/ahiruman5/items/4f3c845500c172a02935

- クリップボード連携

https://qiita.com/n_oshiumi/items/7b3198d3565e84bfa611
- オートセーブ機能

https://qiita.com/Anharu/items/ee156fb34cb2ed0475f4
- 背景の半透明化

https://qiita.com/s4kr4/items/b2c1b692ec430fe24f15

```.vimrc
set encoding=utf-8
scriptencoding utf-8

set fileencoding=utf-8 " 保存時の文字コード
set fileencodings=ucs-boms,utf-8,euc-jp,cp932 " 読み込み時の文字コードの自動判別. 左側が優先される
set fileformats=unix,dos,mac " 改行コードの自動判別. 左側が優先される
set ambiwidth=double " □や○文字が崩れる問題を解決

set expandtab " タブ入力を複数の空白入力に置き換える
set tabstop=4 " 画面上でタブ文字が占める幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=4 " smartindentで増減する幅

set incsearch " インクリメンタルサーチ. １文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を区別しない
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch " 検索結果をハイライト

" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>

" set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行の行頭への移動が可能になる
set number " 行番号を表示
set cursorline " カーソルラインをハイライト

" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソルを移動する
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" バックスペースキーの有効化
set backspace=indent,eol,start

set showmatch " 括弧の対応関係を一瞬表示する
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する

set wildmenu " コマンドモードの補完
set history=5000 " 保存するコマンド履歴の数

if has('mouse')
    set mouse=a
    if has('mouse_sgr')
        set ttymouse=sgr
    elseif v:version > 703 || v:version is 703 && has('patch632')
        set ttymouse=sgr
    else
        set ttymouse=xterm2
    endif
endif

set clipboard+=unnamed " クリップボードとの連携

if &term =~ "xterm"
    let &t_SI .= "\e[?2004h"
    let &t_EI .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

if has('vim_starting')
    " 初回起動時のみruntimepathにNeoBundleのパスを指定する
    set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
"----------------------------------------------------------
" ここに追加したいVimプラグインを記述する

" カラースキームmolokai
NeoBundle 'tomasr/molokai'
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'
" 末尾の全角と半角の空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" オートセーブ
NeoBundle 'vim-scripts/vim-auto-save'

"----------------------------------------------------------
call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
NeoBundleCheck

"----------------------------------------------------------
" molokaiの設定
"----------------------------------------------------------
if neobundle#is_installed('molokai') " molokaiがインストールされていれば
    colorscheme molokai " カラースキームにmolokaiを設定する
endif

set t_Co=256 " iTerm2など既に256色環境なら無くても良い
syntax enable " 構文に色を付ける

" 背景色を半透明にする
highlight Normal ctermbg=NONE guibg=NONE
highlight NonText ctermbg=NONE guibg=NONE
highlight SpecialKey ctermbg=NONE guibg=NONE
highlight EndOfBuffer ctermbg=NONE guibg=NONE

"----------------------------------------------------------
" ステータスラインの設定
"----------------------------------------------------------
set laststatus=2 " ステータスラインを常に表示
set showmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの現在位置を表示する

"----------------------------------------------------------
" Syntasticの設定
"----------------------------------------------------------
" 構文エラー行に「>>」を表示
let g:syntastic_enable_signs = 1
" 他のVimプラグインと競合するのを防ぐ
let g:syntastic_always_populate_loc_list = 1
" 構文エラーリストを非表示
let g:syntastic_auto_loc_list = 0
" ファイルを開いた時に構文エラーチェックを実行する
let g:syntastic_check_on_open = 1
" 「:wq」で終了する時も構文エラーチェックする
let g:syntastic_check_on_wq = 1

" Javascript用. 構文エラーチェックにESLintを使用
let g:syntastic_javascript_checkers=['eslint']
" Javascript以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
                           \ 'active_filetypes': ['javascript'],
                           \ 'passive_filetypes': [] }

"----------------------------------------------------------
" auto-saveの設定
"----------------------------------------------------------
let g:auto_save = 1
let g:auto_save_in_insert_mode = 0

```

以上です。皆様の快適な Vim ライフの一助となれば幸いです。