up:: Vim

Neovim plugins

設定は~APPDATA\Local\nvim\init.lua。
分からない場合でも:echo stdpath('config')で見つかる。

-- jjでインサートモードからノーマルモードに変更 
vim.api.nvim_set_keymap('i', 'jj', '<Esc>', { noremap = true, silent = true })
 
-- システムクリップボードを使用
vim.opt.clipboard:append({"unnamedplus"})

Neovim Part1.5 ~jjとクリップボードの設定~
NeoVimでクリップボードを使う | ツイートするには長すぎる

WSL越しのクリップボードだとちょっと面倒。

WSL×NeoVim(init.lua) クリップボードにコピーできるようにする方法 neovim - Qiita

init.vimのほかinit.luaが使えるが、これはどちらかしか使えない。
NeovimのためのLua入門 init.lua編

プラグインはたまに見直す。
Neovimの設定を見直して起動を30倍速にした

プラグインマネージャー関係
Vimのプラグインマネージャの種類と選び方 Vim - Qiita

init.vimをinit.luaに変える

Neovimのconfigファイルをinit.lua化したので覚書 | Atusy’s blog
init.vimからinit.luaへの移行手順 Vim - Qiita

行番号

vim.opt.number = true -- 行番号を表示する
vim.opt.relativenumber = true -- 相対行番号を表示する
両方設定すると、現在行だけ絶対で残りは相対になる。
Vim/NeoVim で行番号を表示する (set number, vim.opt.number) - まくまく Vim ノート
NeoVimで現在行だけ絶対行、他は相対行番号で表示する

tab

:tabe。新しいタブを開く。edit
:tabn。次のタブに移動。gtでもOK。next
:tabp。前のタブに移動。gTでもOK。present
:tabc。タブを閉じる。close
Tabpage - Neovim docs

space leader

spaceキーをleaderという特殊な修飾キーに割り当てられる。

vim.api.nvim_set_keymap('', '<Space>', '<Nop>', { noremap = true, silent = true })
vim.g.mapleader = " "
vim.g.maplocalleader = " "

Neovim 初心者向け設定ガイド Vim - Qiita

試に以下を入れておくと、<leader>e でファイルエクスプローラーが開く。

-- <leader>e でファイルエクスプローラーを開く 
vim.api.nvim_set_keymap('n', '<leader>e', ':Ex<CR>', { noremap = true, silent = true })

最初のは、spaceがデフォルトで一文字進む操作に入ってるのでその無効化。
leaderはグローバル、localleaderはファイルタイププラグインで使うらしい。
Map - Neovim docs

leaderの初期位置はバックスラッシュらしい。
【Vim/Neovimキーマップ】map/noremapやLeaderキー - フルスタックLinuxプログラミング

vimだが、全選択や保存を割り当てると楽。
[Vim]基本操作負担軽減のための最低限Leader設定 Linux - Qiita

terminalモード

:terminalで起動する。:teでも可。

insertはiでいいが、normalに戻るのに<C-\><C-n>というコマンドが必要。Escじゃないのは<C-c>とぶつかるから説。
neovimの便利設定 ターミナルモードのマッピング – MY ROBOTICS

たいていはinsertから入りたいはずなので、以下の設定を追加してterminalに入った瞬間insertにするようにする。

vim.api.nvim_create_autocmd("TermOpen", {
    pattern = "*",
    command = "startinsert",
})
 

neovimでターミナルモードから元のファイル編集画面に戻るには

元のファイルに戻るにはバッファを辿る。
:bnextで即戻れる。:bn。
:bpresent,:bp,前バッファ
:bdelete,:bd,バッファ削除

:lsか:buffers(:b)でバッファ一覧を表示し、:b 数値でも戻れる。

面倒なら事前に:vsや:splitで分割画面にする手がある。<C-w>sなどでも分割可能。
分割後は<C-w>hなどで選択可能。
慣れてきた頃に知りたいVimの便利機能

ターミナルを変更

vim.o.shell = "C:\\Scoop\\apps\\pwsh\\current\\pwsh.exe"を追加。
パスは(Get-Process -Id $PID).Pathで拾える。

WindowsのNeovimで任意のPowerShellを起動する

矩形選択出来ない

visual blockモード。<C-v>が貼り付けになってしまう場合、<C-q>に代替のキーバインドがある。

vim - How do you select a whole column in visual block mode? - Stack Overflow

複数の設定を使いたい

NVIM_APPNAMEにフォルダ名を突っ込むことで、その設定ファイルを読むようになる。
linuxなら以下のコマンドでエイリアスを張ることもできる。

alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim'

GitHub - nvim-lua/kickstart.nvim: A launch point for your personal nvim configuration
Starting - Neovim docs

gitのマージツールとして使う

gitconfigに以下を追加。

[mergetool "neovimdiff"]
  cmd = nvim -d $LOCAL $MERGED $REMOTE -c 'wincmd l' -c 'wincmd J'
[merge]
  tool = neovimdiff

mergeが必須部分、mergetoolはneovimdiffの中身を定義している。
-dはdiffモードでneovimを開く。

Git mergetool with Neovim

toolにはデフォルトでいくつか入力できる変数が定義されている。
local, merged, remoteの3ペインならneovimdiff2だけで開ける。

Git - git-mergetool Documentation
Site Unreachable

操作は:diffg[et],:diffp[ut]を用いる。範囲もしくはカーソルを合わせたところが動く。
:doで全部get、:dpで全部put?

Diff - Neovim docs

これを知らないとdiffview.nvimが使えない。

全角スペース表示

元々制御文字を表示するlistモードというのがvimにある。

Vim/NeoVim で制御文字(改行、タブ文字、行末のスペースなど)を表示する (list, listchars)

加えて全角スペースを表示するには、init.luaの編集が必要。

-- Show double byte spaces
vim.cmd[[
  hi DoubleByteSpace term=underline ctermbg=blue guibg=darkgray
  match DoubleByteSpace / /
]]

Vim/NeoVim で全角スペースを見えるように表示する

vim.keymap.set vs. vim.api.nvim_set_keymap

r/neovim - Reddit
neovimでノーマルモードのまま一行挿入を行うには

keymap.setがnvim_set_keymapを適切なオプション付きで呼んでいる。
あとnoremap = trueがデフォなので再帰的にマッピングされない。

luaしか使わないならkeymap.setだけでいい。