neovimでc++のコーディングに必要な最低限の情報
はじめに(絶対読んで !!!)
- 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を勉強しているときに何度も読んだ記事)なので、この記事の中で重要なところをリンクとして貼り軽く説明を付け加えていきます。そのため、それぞれのリンクの先を開いて読んでみてください。
-
-
cd, ls, pwd, mkdir
が使えたらOK
-
-
- ここで紹介されているコマンドはすべて非常によく使います
- vimを使ってc++のコードを書いていれば1時間ぐらいでマスターできます
- マスターできたら次に行きましょう
-
-
ここで紹介されているコマンドはしょっちゅう使います。
-
正直僕自身最初の1ヶ月ぐらい上の表のコマンドぐらいしか覚えてませんでした。(たったこれで十分使えたから)
-
と記事に書いてあるくらいには、重要でありかつこれだけ覚えていれば最低限使えます
-
これをマスターするには普通は1週間~1ヶ月ぐらいかかります。
-
慣れたら、次(カスタマイズするのステップ1)に行きましょう。
-
-
- 私はよく使っているコマンドです。
-
A, $, v
は非常によく使います
-
- 慣れたら次(カスタマイズするのステップ2)に行きましょう。
- 私はよく使っているコマンドです。
-
-
w, e, b
はよく使います。 - 慣れたら次(カスタマイズするのステップ3)に行きましょう。
-
-
- このあたりは使用頻度が少ないコマンドが多いです。
- 自分がよく使うコマンドだけ覚えたら良いです。
- 例えば、私がよく使っているコマンドは、下のとおりです。
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の方は~/.zshrc
をsource
してください)
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/nerdtree
のhook_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.toml
のhook_add
に直接書くこともできますが、ファイルを分割したほうがスッキリしているので分けています。NERDTree
の場合は設定が1行しかないのでファイルを分けると逆に煩雑になるためdein.toml
に直接設定を記入しています。
ステップ4
neovim dein おすすめプラグイン
やneovim プラグイン おすすめ
とかで検索して、自分でdein.toml
などに便利なプラグインを導入してみてください。
Discussion