vimの後継機
概要
- vimの作者の開発の遅れとか、いろいろあって、vimのforkを行ったもの
- luaとの統合を推し進めており、vimscriptより簡潔で高速に動作することを目指している
- version 800から
cmdheight=0が設定可能
私の.vimrc
ファイル構成
.vimrcに一つにまとまっているわけでなくて、以下のファイルに分割されている
~/.config/nvim/init.vim
~/.config/nvim/after/plugin/last.vim
~/.config/nvim/dein/lazy.toml
~/.config/nvim/dein/realtime.toml
~/.vim
またPlugモジュールに依存しており、これは手動でインストールする必要がある
neovim, vimのよく使う標準機能の説明
termguicolorsとnotermguicolors
set termguicolors- 24 bit color(true color)がサポートされており、GUIの色表現が利用できる
- 256色までの環境でこの設定を有効化してしまうと、ほとんど見えなくなる
set notermguicolors- 256色までの色表現の時の設定に制限する時
vimを画面右端で折り返すかどうか
set nowrap- 右端で折り返さない
set wrap- 右端で折り返す
ノーマルモード
- 通常モードで編集できない
- ショートカットキーがこのモードで沢山割り当てられており様々な操作が可能
hjklとw,e,b
h- 左へカーソルを移動
j- 下へカーソルを移動
k- 上へカーソルを移動
l- 右へカーソルを移動
w- 単語レベルで次の移動
wd- 単語レベルで文字を削除
b- 単語レベルで前の単語へ移動
f{char}
- ノーマルモードで
f{char}{char}は任意の文字を入力するとその場所にジャンプする - 一文字しか取得できないのと複数行検索できないのでvimscriptで拡張できる
"! fコマンドの拡張
function FindChars()
let c0 = nr2char(getchar())
let c1 = nr2char(getchar())
let query = c0.c1
call feedkeys("/".query."\<CR>")
endfunction
nmap <buffer><silent> f :call FindChars()<CR>
- 二文字で検索できる +
n,Nで次に進む、戻るができる
text object関連
text objectとは"hoobar",(foobar),<a tag>hoo bar</a>などカッコや意味のある粒度で区切られた範囲である- neovimでは
cから始まるコマンドが一部機能しないが、だいたいの操作はできる iとaオプションが存在し、i = inner,a = a objectである%はマッチオペレータといってカッコの粒度である
カッコ内を選択
vi"で"hoobar"の内側をビジュアルモードで選択va"で"hoobar"の"を含めた全体の選択vi(で(hoobar)の内側をビジュアルモードで選択va(で(hoobar)のカッコを含めた全体の選択vitで<a tag>hoo bar</a>の内側をビジュアルモードで選択vatで<a tag>hoo bar</a>のカッコを含めた全体の選択
カッコ内を削除
vi"で"hoobar"の内側をビジュアルモードで選択va"で"hoobar"の"を含めた全体の選択vi(で(hoobar)の内側をビジュアルモードで選択va(で(hoobar)のカッコを含めた全体の選択vitで<a tag>hoo bar</a>の内側をビジュアルモードで選択vatで<a tag>hoo bar</a>のカッコを含めた全体の選択
次のカッコへジャンプ
]%でカッコ(")}>)閉じへジャンプ[%でカッコ("({<)開始へジャンプ
マクロ
- 現在、カーソルが置かれている場所の単語を得ることができるマクロ
:echo expand("<cword>")とすると今あるカーソルの単語がわかる- 日本語の単語区切りは連続するひらがなの塊か漢字の塊など、あまり正確ではない
- デフォルトのノーマルモードで
*を入力するとでマッチした単語を検索する
インサートモード
- 編集できるモード
インサートモードでyankした内容を貼り付ける
<C-r>"で匿名レジスタを貼り付ける
コマンドモード
- ノーマルモードで
:を入力するとインラインコマンドモードになる - ノーマルモードで
q:を入力すると履歴を表示した編集できるコマンドモードになる
:versionコマンド
- 現在のneovimのバージョンを得る
- neovimの場合、バンドルされているluajitの情報やコンパイルオプションを知ることができる
ビジュアルモード
- テキストや行が選択されてたモード
Shift+vで行レベルで選択Ctrl+vでcharレベルで選択yで匿名レジスタにコピー- 匿名レジスタは
""である
- 匿名レジスタは
"{char}yで"{char}レジストリにコピーする
まとめてコメントアウトする
Ctrl+vで一文字だけ選択しビジュアルモードに入る- コメントアウトしたい行すべての先頭一文字を選択する
Shift+iでビジュアルモードからインサートモードに遷移する- 代表の一行を編集し、
escでビジュアルモードを抜ける - ノーマルモードに戻った段階ですべての選択されていた行が編集される
ビジュアルモードで選択した範囲のuppercase, lowercaseを変更する
- ビジュアルモードで対象を選択
Uでアッパーケースに変換uでローワーケースに変換
folding
特定の行を折りたたむ機能
zf- ビジュアルモードに入ったら折りたたみたい行を選択し、折りたたむ
zo- 折りたたまれた行にカーソルがあたった状態で、折りたたみが解除される
zc- 一度折りたたまれたことがある行にカーソルがあたった状態で、再び折りたたまれる
zO- すべて開く
zC- すべて閉じる
zd- 折りたたみを削除
zE- 全ての折りたたみを削除
marks
ノーマルモードで、m{char}を押すと、その行にそのキーのショートカットが作られる
`{char}で、ショートカットが設定された行にジャンプできる
highlightした要素の置換
Shift+vで選択したのち、:を押すと:'<,'>となっている- これに続けて、
:'<,'>s/hoo/bar/とするとhooをbarに選択範囲のみのリプレースができる
最低限のインストール
ubuntu
$ sudo apt-get install neovim
$ sudo pip3 install neovim
$ sudo pip3 install pynvim
便利なPlugin
- dein.vim
- パッケージマネージャ
:call dein#install()でtomlに記されたパッケージをインストール:call dein#update()でtomlに記されたパッケージをアップデート
- vim-plug
- パッケージマネージャ
:PlugInstallで.vimrcに記されたパッケージを導入できる:PlugUpgradeでvim-plugのアップグレード:PlugUpdateでインストールされているプラグインのアップデートvim-plug自体のインストールは以下のコマンドsh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
- telescope.nvim
:Telescope find_files-> fuzzyなfiler:Telescope symbols-> fuzzyな絵文字入力
- treesitter
- vimの制約を越えた構文解析+ハイライト
- ale
- linter+fixer
- 非同期で未定義の変数などを指摘することなどが可能
- pylintモジュールがpythonに必要
:ALEInfoでエラーが発生している場合、特定できる- 使用しないときは
:ALEToggleでon/offの設定が可能
- jedi-vim
- 入力補完
- systemのpythonがあるところの定義を参照するので、pandas等を保管させたいときはsystemのpythonにもpandasをインストールする
- neovimでは
Plugでのみ動作して、deinでは動作しなかった
- dein
- Pluginマネージャ
~/.config/deinにパッケージを管理する
- Plug
- Pluginマネージャ
- インストールが早い
~/.vimにパッケージを管理する
- vim-signature
- markしたポイントを左のスペースに表示する
カラースキームとテーマ
- gruvbox
- コントラストが低めの落ち着いたカラースキーム
自分でテーマを作成する
文字・背景の色を変更する
- background変数を設定する
:set background=light:set background=dark
- normalの背景を設定する
:hi Normal ctermbg=0:hi NonText ctermbg=0
トラブルシューティング
jedi-vimが動かない
- 原因
neovimモジュールがインストールされていないpythonのパスは正しいくない:py3 print("foo")でfooが表示されればpythonバインディングは動作しているはず
モジュールソースがduplicateしていると出る
- 原因
- 2つ以上のパッケージマネージャで同時に管理していると出る
- 対応
- 片方のパッケージマネージャのキャッシュをクリアすると直る
neovimのソースコードからのビルドができない
- どののパッケージが入っていればできるか明示されていないのでエラーログから読み取る必要がある
- debianだと
libtool libtool-bin cmake unzip gettextが暗黙的に必要
^Mの文字コードがエディタ上で表示されるが、入力、操作できない
- 改行文字が一部変更された状態
\r\nが変更され\rなどになった場合^Mと表示される- 直接
^Mのコントロール文字を入力してもファイル上の改行になってしまうので\rでハンドルする