🦁

neovimでc++のコーディングに必要な最低限の情報

2022/06/10に公開約12,300字

はじめに(絶対読んで !!!)

  • vimの道に進むと、他のエディターと比べて
    • メリットがたくさん
      • 爆速でコーディングできます
        • 正確には、コーディング速度のポテンシャルが有名なエディターの中で一番高いです
      • 自分だけの環境を作れます
        • こんなショートカットが欲しいと思ったら、だいたい設定できます
    • デメリットもたくさん
      • マスターするのに時間がかかる
        • vimのポテンシャルを活かすには慣れが必要です
    • コーディング速度が多少落ちてもよく、慣れなくても使えるエディターが良いのならVSCodeを選ぶべきです
      • とはいってもこちらも覚えることはそれなりにありますが...
  • 一度にすべてを覚えるのは無理
    • すこし読んだら体に操作方法を覚えさせましょう
    • 覚えたら、次を読んでまた慣れるまで待ちましょう
    • その繰り返しをすれば1ヶ月もすればこのチュートリアルはマスターできるはずです
  • 下で「基本的な操作方法」と「カスタマイズする」をそれぞれステップごとに分けて書いています。
    • 「基本的な操作」の「ステップ1」をマスターできたら、「カスタマイズする」の「ステップ1」をやってみるのがおすすめです
    • つまり、基本的な操作(ステップ1)、カスタマイズ(ステップ1)、基本的な操作(ステップ2)、カスタマイズ(ステップ2)、...と勉強するのがおすすめです

neovimのインストール方法

neovimをインストールしてvimを削除します。neovimとvimの違いは、簡単に言えばモダンに設計されたvimがneovimです。ただし、neovimもvimとまとめてvimと呼称するので、このチュートリアルでvimと言っていたらneovimと同一視して大丈夫です。vimでできることはだいたいneovimでもできるので。

sudo apt update
sudo apt remove vim
sudo apt-add-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim -y

を実行すればneovimをインストールできます。

これから、vim(neovim)でファイルを編集するときは、

nvim ファイル名

とすればOKです。

基本的な操作方法

vimを何もカスタマイズせずとも使える操作について説明します。

知識0から始めるVim講座が良い記事(私がvimを勉強しているときに何度も読んだ記事)なので、この記事の中で重要なところをリンクとして貼り軽く説明を付け加えていきます。そのため、それぞれのリンクの先を開いて読んでみてください。

  • Vimを触る前にまず最低限のLinuxコマンドを覚えよう

    • cd, ls, pwd, mkdirが使えたらOK
  • HelloVim!

    • ここで紹介されているコマンドはすべて非常によく使います
    • vimを使ってc++のコードを書いていれば1時間ぐらいでマスターできます
    • マスターできたら次に行きましょう
  • ステップ1

    • ここで紹介されているコマンドはしょっちゅう使います。

    • 正直僕自身最初の1ヶ月ぐらい上の表のコマンドぐらいしか覚えてませんでした。(たったこれで十分使えたから)

    • と記事に書いてあるくらいには、重要でありかつこれだけ覚えていれば最低限使えます

    • これをマスターするには普通は1週間~1ヶ月ぐらいかかります。

    • 慣れたら、次(カスタマイズするのステップ1)に行きましょう。

  • ステップ2

    • 私はよく使っているコマンドです。
      • A, $, vは非常によく使います
    • 慣れたら次(カスタマイズするのステップ2)に行きましょう。
  • ステップ3

    • w, e, bはよく使います。
    • 慣れたら次(カスタマイズするのステップ3)に行きましょう。
  • ステップ4, ステップ5

    • このあたりは使用頻度が少ないコマンドが多いです。
    • 自分がよく使うコマンドだけ覚えたら良いです。
    • 例えば、私がよく使っているコマンドは、下のとおりです。
    • D, dw, :n

ここより下の部分(brew/tmuxについてなど)は、環境によるので興味のある方のみ読めば大丈夫です。

カスタマイズする

ステップ1

設定ファイルの概要

~/.config/nvimというディレクトリを作成し、その中に設定を書いていきます。

以下のようにコマンドを打てばOKです。

mkdir -p ~/.config/nvim # ~/.config/nvimというディレクトリを作成している

次に、設定ファイルの全体像について説明します。

1つのファイルに設定をすべて書くと、設定がごちゃごちゃしてくるのでファイルを分割するのがおすすめです。

具体的には、下のとおりです。

  • init.vim

    • 他の設定ファイルファイルを読み込んだりしています
  • option.vim

    • vimに存在する様々なオプションをONにしたりOFFにしたりします
  • keymap.vim

    • キーボードショートカットを設定します
  • dein.vim

    • プラグインマネージャーであるdeinの初期化などを行っています。
  • dein.toml

    • インストールしたいプラグイン(拡張機能)を記載します
  • pluginsディレクトリ

    • このディレクトリの中にプラグインごとの設定を記載します。

ステップ1で設定するのは、init.vimの一部とoption.vimです。

.bashrcの追加設定

nvim ~/.bashrc

として(zshを使っている方は~/.zshrc)、

export XDG_CONFIG_HOME=${HOME}/.config

と最後に追記してください。

:wqで閉じた後に、

source ~/.bashrc

を実行して設定を反映させてください。(zshの方は~/.zshrcsourceしてください)

init.vim

cd ~/.config/nvim # ~/.config/nvimというディレクトリに移動している
nvim init.vim

として、~/.config/nvimの中にinit.vimを作成します。

iキーでInsert Mode(左下にInsertと書いてあればInsert Modeです)に入った後、以下の内容をコピペしてください。(windowsだとctrl+vでだめならctrl+shift+vとしてください)。

if &compatible
  set nocompatible
endif

" 外部設定ファイルの読み込み
runtime! option.vim

" シンタックスハイライトをONにする
syntax enable

:wで保存しましょう。

option.vim

vimをまだ開いたままであれば、:e option.vimとすると新しくoptions.vimというファイルを開けます。

閉じてしまった場合は、

cd ~/.config/nvim
nvim option.vim

とすればOKです。

そこで、下の内容をコピペしてください。

" ######################## 見た目 ########################
set termguicolors " True Color対応
set title " ターミナルのタブ名に現在編集中のファイル名を設定
set number " 行番号を表示する
set relativenumber " 行番号を今いる行から相対的に表示する(13ddとかするときに便利)
set wrap " 右端まで表示される行を折り返して表示する
set showmatch " 括弧入力時の対応する括弧を表示
set list "不可視文字(改行記号など)の可視化
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:↲ " デフォルト不可視文字は美しくないのでUnicodeできれいに
set matchtime=3 " 対応括弧のハイライト表示を3sにする

" ######################## 検索・置換 ########################

set ignorecase " 大文字小文字の区別なく検索する
set smartcase " 検索文字列に大文字が含まれている場合は区別して検索する
set wrapscan " 検索時に最後まで行ったら最初に戻る
set hlsearch " 検索語をハイライト表示
set incsearch " 検索文字列入力時に順次対象文字列にヒットさせる
set inccommand=split " インタラクティブに変更

" ######################## インデント ########################
set smartindent " オートインデント
set expandtab " softtabstop や shiftwidth で設定されている値分のスペースが挿入されたときに、挿入されたスペース数が tabstop に達してもタブに変換されない
set tabstop=4 " スペースn個分で1つのタブとしてカウントするか
set softtabstop=4 " <tab>を押したとき、n個のスペースを挿入
set shiftwidth=4 " <Enter>や<<, >>などを押したとき、n個のスペースを挿入

" ######################## 補完 ########################
set wildmode=list:longest " コマンドラインの補完
set infercase " 補完時に大文字小文字を区別しない
set wildmenu "コマンドの補完を有効に

" ######################## 操作 ########################
set clipboard+=unnamedplus " クリップボードにコピーできるようにする
set backspace=indent,eol,start " backspaceで様々な文字を消せるようにする(デフォルトだと改行文字などはbackspaceで削除できない)
set hidden " タブを切り替えるときに保存していなくてもOKにする
set textwidth=0 "自動改行する文字数

" ######################## ログ ########################
set history=500 "保持するコマンド履歴の数
set noswapfile " swapファイルを保存しない
set noundofile " undoファイルを保存しない
set nobackup " backupを保存しない
set nowritebackup "writebackupを保存しない
set viminfo= " viminfoファイルに保存しない

" ######################## その他 ########################
filetype plugin indent on " ファイルタイプの検索とプラグインをONにする
set encoding=utf-8 " 文字コードをutf-8にする

オプション1つ1つの意味はコメントに書いてあります。そのため、どんなオプションが書いてあるのかを軽く目を通してみてください。意味がわからないコメントがあれば、ググっても良いし、わかる方に質問するのでも良いし、無視しても良いです。

一番左に"をつけるとその行はコメントになるため、簡単にオプションの有効化/無効化ができます。

また、vimに存在するオプションはこれだけではなく、もっとたくさんあります。

なので、最初のうちはこの設定のいらないオプションを"を使って無効化することでカスタマイズして、慣れてきたら自分でオプションを検索して付け加えてみましょう

ちなみに、上のオプションをする前と後では下のように変わります。



慣れたら、「基本的な操作方法」のステップ2に行きましょう。

ステップ2

ここでは、キーボードショートカットを設定するkeymap.vim を設定します。

init.vim

cd ~/.config/nvim
nvim init.vim

をして、

runtime! option.vim

の下に、

runtime! keymap.vim

と書き加えましょう。

これによって、keymap.vimというファイルを読み込むようになりました。

keymap.vim

vimを開いている場合は、:e keymap.vimをしましょう。

開いていない場合は、

cd ~/.config/nvim
nvim keymap.vim

をしましょう。

そして、以下の内容を貼り付けてください。

" leaderをスペースに変更
let mapleader = "\<Space>"

" 入力モード中に素早くjjと入力した場合はESCとみなす
inoremap <silent> jj <Esc>:<C-u>w<CR>

" ESCを2回押すことでハイライトを消す
nmap <silent> <Esc><Esc> :nohlsearch<CR>

" ##### ウィンドウ操作系 #####
" 画面をspace+vで縦に分割する
nnoremap <silent> <Leader>v :vs<CR>
" 画面をspace+sで横に分割する
nnoremap <silent> <Leader>s :sp<CR>

" hjklの方向ににカーソルを移動させる
nnoremap <silent> <Leader>h <C-w>h
nnoremap <silent> <Leader>j <C-w>j
nnoremap <silent> <Leader>k <C-w>k
nnoremap <silent> <Leader>l <C-w>l

" ##### 行・列関係 #####

" 文章が画面の右端に到達すると折り返す設定をoption.vimで入れている
" hjklはデフォルトだと、折り返す前の表示で上下左右に移動できる
" つまり、折り返して表示した状態だと直感と実際のhjklの動作が違う
" これを修正するオプションがしたの4つ
nnoremap j gj
nnoremap k gk
vnoremap j gj
vnoremap k gk

" 補完
" tabキーと shift+tabキーで補完候補を選択できる
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<S-TAB>"

こちらも説明はコメントとして書かれていますが、念のため説明を書き加えます。

まず前提として、**space, hと記載されている場合は、スペースキーを押し、手を離してからできるだけ早くhを押すという操作です。**切り取りはctrl+xで、ctrlを押しながらxを押します。ですが、space, hの場合はスペースとhの両方

まず、leaderをスペースに変更というのは、スペースキーを押すとleaderキー(物理的には存在しないキー)を押したことになります。そして、leaderキーを様々なショートカットキーの起点として登録しています。たとえば、leader, hで画面を移動させるショートカットキーがあります。leaderをスペースに割り当てるメリットは、親指がleaderキーの近くに存在することが多いため、ショートカットを実行するときに簡単に実行できます。また、vimにもともと用意されているショートカットキーにスペースから始まるものを知らないので、すでに設定と被らないのがメリットです。

次に、InsertモードからNormalモードに戻る方法は今までEscキーを押していましたが、j, jと押せばEscキーを押したことと同じことになります。Escまで小指を持っていくのは大変ですが、jなら右手の人差し指の非常に近くにあります。

また、画面分割は例えば下の写真のように行なえます。

これは、space,sやspace,vを押すとできます。ちなみに、分割した画面を閉じるには:qです。画面間の移動は、space, hjklのどれかでできます。例えば、左の画面から一つ右に移動するには、space,lです。

補完については今度登場するので今は忘れてください。

ステップ3

neovimには様々なプラグインをインストールすることができます。

今回は、プラグインマネージャーの導入と、プラグインをインストールします。

環境構築

まず、deinのダウンロード&インストールを行います。

curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh ~/.cache/dein
rm ./installer.sh

と実行してください。

この写真みたいになればOkです。(どこのディレクトリで実行しても構いません)

次に、nodeのインストールをします。

windows(WSL)の方は、

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

と実行してください。

macの方は、

brew install nodejs

と実行してください。

最後にclangdのインストールをします。

windows(WSL)の方は、

sudo apt install clangd-12 build-essential cmake
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100

macの方は、

brew install llvm

を実行してください。

init.vim

cd ~/.config/nvim
nvim init.vim

をしてinit.vimを開いてください。

下の写真のようになっていると思います。

この、runtime! keymap.vimの下に

runtime! dein.vim

を追加して、:wで保存してください。

dein.vim

vimを開いている方は、:e dein.vimとしてください。

開いていない方は、

cd ~/.config/nvim
nvim dein.vim

としてdein.vimをvimで開いてください。

そして、下の文章を貼り付けてください。

let g:dein#auto_recache=1

set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim

let s:watch_files = ['~/.config/nvim/dein.vim', '~/.config/nvim/dein.toml']

if dein#load_state('~/.cache/dein')
  call dein#begin('~/.cache/dein', s:watch_files)

  call dein#load_toml('~/.config/nvim/dein.toml', {'lazy': 0})

  call dein#end()
  call dein#save_state()
endif

if dein#check_install()
  call dein#install()
endif

そして、:wで保存してください。

dein.toml

vimを開いている方は:e dein.tomlとしてください。

開いていない方は、

cd ~/.config/nvim
nvim dein.toml

として、dein.tomlをvimで開いてください。

そして、下の内容を貼り付けてください。

# [dein.toml]
[[plugins]]
repo = 'Shougo/dein.vim'


# coc
[[plugins]]
repo = 'neoclide/coc.nvim'
merged = 0
rev = 'release'
hook_add = '''
source ~/.config/nvim/plugins/coc.vim
'''

# ファイルツリーを表示
[[plugins]]
repo = 'scrooloose/nerdtree'
depends = ['ryanoasis/vim-devicons']
hook_add='''
nnoremap <silent> <Leader>e :NERDTreeToggle<CR>
'''

できたら、:wqで保存してvimを修了しましょう。

上の設定ファイルは、インストールするプラグイン一覧が書かれています。

repoで指定されている文字列は、プラグインの名前です。

また、scrooloose/nerdtreehook_addに書いてある内容は、Leader(スペース), eで、NERDTreeToggleというコマンドを実行することを意味しています。これを使うと、space, eを押したときに左側にファイル一覧が表示されます。

また、neoclide/coc.nvimの中のhook_addでは、source ~/.config/nvim/plugins/coc.vimとあり、これはplugin/coc.vimというファイルを読み込んでいることがわかります。

plugins/coc.vim

vimを閉じた状態で、

mkdir -p ~/.config/nvim/plugins
cd ~/.config/nvim/plugins

と実行して、pluginsディレクトリを作成し、そこに移動してください。

その後、nvim coc.vimを実行して下の内容を貼り付けてください。

その際、下に赤色でエラーメッセージが表示されると思いますが、Enterを押して無視してください。

" デフォルトでインストールするもの
let g:coc_global_extensions = [
    \'coc-clangd',
    \'coc-pyright'
    \]

" エラーと警告の色を指定
highlight CocErrorSign ctermfg=15 ctermbg=196
highlight CocWarningSign ctermfg=0 ctermbg=172

"スペースinfoでHover
noremap <silent> <Leader>info :<C-u>call CocAction('doHover')<cr>
"スペースdfでDefinition
nnoremap <silent> <Leader>df :call CocAction('jumpDefinition')<CR>
"スペースfmtでFormat
nnoremap <space>fmt :call CocAction('format')<CR>
" Coc-quick-fix
nnoremap <space>fx :call CocAction('doQuickfix')<CR>

cocを導入すると、下のコードのように間違っているところを教えてくれます。

また、下線が引かれているところまでカーソルを持っていくと、どういうエラーメッセージなのかを表示してくれます。

さらに、便利なショートカットキーがいくつかあります。

  • space, d, f
    • 定義にジャンプ
    • 例えば、aという名前の変数があったときにaという変数の上にカーソルを持ってきて、space, d, fとするとaが定義された場所に移動します。
  • space, f, m, t
    • clang-formatを使って整形してくれます

これらの設定は、plugins/coc.vimではなくてdein.tomlhook_addに直接書くこともできますが、ファイルを分割したほうがスッキリしているので分けています。NERDTreeの場合は設定が1行しかないのでファイルを分けると逆に煩雑になるためdein.tomlに直接設定を記入しています。

ステップ4

neovim dein おすすめプラグインneovim プラグイン おすすめとかで検索して、自分でdein.tomlなどに便利なプラグインを導入してみてください。

GitHubで編集を提案

Discussion

ログインするとコメントできます