C言語をvimで始めてみよう - プラグインとセットアップ

## 環境
- OS: macOS / Linux
- Vimのバージョン: 8.2

## Vimのインストール
だいたいどんな環境でもデフォルトで入っているVimですが、もし消してしまっていたり無かったりした場合は下記のコマンドでインストールしてください。

Linux
```bash
sudo apt update && sudo apt install vim
```

MacOS
```bash
brew install vim
```

## プラグインマネージャー「vim-plug」の導入
Linux/macOS
```bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

## coc.nvimのためにnode.jsをインストール

```bash
sudo apt install nodejs npm
```

## COC.nvimのためにNode.jsをインストール
以下のコマンドでNode.jsとnpmをインストールします。COC.nvimはNode.jsを前提とするので下記のコマンドを使って必要なものをインストールしてください。

### Linux
```bash
sudo apt install nodejs npm
```

### Mac
```bash
sudo brew install node npm
```

## coc.nvimのセットアップ
`coc.nvim` を使用するために、COC Extensionsをインストールし、C言語開発に特化した設定を行います。

### COC Extensionsのインストール
以下のコマンドをVimのメニューバーに打ち込むことで、C言語用の拡張機能をインストールします。

```vim
:CocInstall coc-clangd
```

### clangdのインストール
#### Linux
```bash
sudo apt install clangd
```

#### macOS
```bash
brew install llvm
```
macOSでは、だいたいパスが通っていないのでパスを通してください。
```bash
export PATH="/usr/local/opt/llvm/bin:$PATH"
```

最後に下記を~/.vimrcに記述してください。(`vim ~/.vimrc`)
```vim
" ベース設定
set nocompatible
syntax on
set number
set tabstop=4
set shiftwidth=4
set noexpandtab
set autoindent
set smartindent
set showcmd
set laststatus=2
set noshowmode

" 検索設定
set ignorecase
set smartcase
set incsearch
set hlsearch

" 表示とファイル設定
set nowrap
set ruler
set showmode
set nobackup
set nowritebackup
set noswapfile

" C言語特化のローカル設定
autocmd FileType c setlocal cinoptions=(0
autocmd FileType c setlocal formatoptions=croql
autocmd FileType c setlocal comments=s1:/*,mb:*,ex:*/,://

" その他の便利な設定
set wildmenu
set backspace=indent,eol,start

" 選択部分の強調色変更
highlight Search ctermbg=none guibg=#33467c guifg=#c0caf5

" 現在行の背景色変更
highlight CursorLine ctermbg=none guibg=#1e202e


" プラグイン管理（vim-plug利用）
call plug#begin('~/.vim/plugged')

" プラグイン一覧
Plug 'wakatime/vim-wakatime'            " 開発時間計測
Plug 'preservim/nerdtree'               " ファイルツリー
Plug 'itchyny/lightline.vim'            " ステータスライン
Plug 'scrooloose/nerdcommenter'         " コメント管理
Plug 'jiangmiao/auto-pairs'             " 自動括弧補完
Plug 'honza/vim-snippets'               " スニペット
Plug 'tpope/vim-fugitive'               " Git連携
Plug 'ryanoasis/vim-devicons'           " アイコン
Plug 'ghifarit53/tokyonight-vim'
Plug 'puremourning/vimspector'
Plug 'neoclide/coc.nvim', {'branch': 'release'}

call plug#end()

set termguicolors
let g:tokyonight_style = 'night'
let g:tokyonight_enable_italic = 1
colorscheme tokyonight
highlight Comment guifg=#a9b1d6 ctermfg=lightblue

" auto-pairs
let g:auto_pairs = 1

" cocの設定
inoremap <silent><expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <silent><expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

" エラーリストの移動
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" 定義や参照
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gr <Plug>(coc-references)

" lightlineの設定
let g:lightline = {
      \ 'colorscheme': 'tokyonight',
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ],
      \             [ 'gitbranch', 'readonly', 'filename', 'modified' ] ],
      \   'right': [ [ 'lineinfo' ],
      \              [ 'percent' ],
      \              [ 'fileformat', 'fileencoding', 'filetype' ] ]
      \ },
      \ 'component_function': {
      \   'gitbranch': 'FugitiveHead',
      \   'readonly': 'LightlineReadonly',
      \   'filename': 'LightlineFilename',
      \ },
      \ 'mode_map': {
      \   'n': 'N',
      \   'i': 'I',
      \   'R': 'R',
      \   'v': 'V',
      \   'V': 'VL',
      \   "\<C-v>": 'VB',
      \   'c': 'C',
      \   't': 'T',
      \ }
      \ }

" カスタム関数: 読み取り専用表示
function! LightlineReadonly()
  return &readonly ? 'RO' : ''
endfunction

" カスタム関数: ファイル名表示（空の場合は [No Name]）
function! LightlineFilename()
  return expand('%:t') !=# '' ? expand('%:t') : '[No Name]'
endfunction

" Gitブランチ表示のためのvim-fugitive設定
" FugitiveHead関数はvim-fugitiveかｒ
if !exists('*FugitiveHead')
  function! FugitiveHead()
    return ''
  endfunction
endif
```

最後にvimのメニューバーで下記のコマンドを入力することでプラグインのインストールが終わります。
```vim
PlugInstall
```

以上の設定を完了することで、C言語を効率的に開発できるVim環境が整います。