• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

neovim

date: 2020-12-20 excerpt: 自分向け資料

tag: neovimvimlualuajit


vimの後継機

概要

  • vimの作者の開発の遅れとか、いろいろあって、vimのforkを行ったもの
  • luaとの統合を推し進めており、vimscriptより簡潔で高速に動作することを目指している
  • version 800からcmdheight=0が設定可能

私の.vimrc

  • .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}レジストリにコピーする

まとめてコメントアウトする

  1. Ctrl+vで一文字だけ選択しビジュアルモードに入る
  2. コメントアウトしたい行すべての先頭一文字を選択する
  3. Shift+iでビジュアルモードからインサートモードに遷移する
  4. 代表の一行を編集し、escでビジュアルモードを抜ける
  5. ノーマルモードに戻った段階ですべての選択されていた行が編集される

ビジュアルモードで選択した範囲のuppercase, lowercaseを変更する

  1. ビジュアルモードで対象を選択
  2. Uでアッパーケースに変換
  3. 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
    • コントラストが低めの落ち着いたカラースキーム

自分でテーマを作成する

  • /vimscript/#テーマを作成

文字・背景の色を変更する

  • 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でハンドルする


neovimvimlualuajit Share Tweet