## 背景
[[📜2021-01 VSCode Neovimを試してみる]] からはや2年半。当時と状況が以下のように変わったので、もう一度チャレンジしてみることにした。
- [[Neovim]]が当時より進化した
- [[VSCode Neovim]]も当時より進化した(はず)
- [[Vim]]から[[Neovim]]に移行した
- [[VSCode]]をほとんど使わなくなり、[[IntelliJ IDEA]]と[[Neovim]]で過ごすようになった
- [[vimrc]]から[[init.lua]]に移行した
一言で言うと『自分の中で[[Neovim]]が圧倒的に台頭してきた』し、当時の不満も解消できそうという期待が大きい。
加えて、たまたま以下の記事を目にして思い出したというのもある。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://static.zenn.studio/images/logo-transparent.png" />
<span class="link-card-v2-site-name">Zenn</span>
</div>
<div class="link-card-v2-title">
VSCode VimからVSCode Neovimに移行した
</div>
<img class="link-card-v2-image" src="https://res.cloudinary.com/zenn/image/upload/s--5DpaX_Ms--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:VSCode%2520Vim%25E3%2581%258B%25E3%2582%2589VSCode%2520Neovim%25E3%2581%25AB%25E7%25A7%25BB%25E8%25A1%258C%25E3%2581%2597%25E3%2581%259F%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:yubrot%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2k3bTYyV0NtaVFxMkEyeUk2TTNnWFlpdVBzXzFsa2lUUWVhRUZObHc9czk2LWM=%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png" />
<a href="https://zenn.dev/yubrot/articles/1bf4b8d79d7cae"></a>
</div>
## 環境
- [[Windows 11]]
- [[VSCode]] 1.83.0
- [[VSCode Neovim]] 0.8.2
- [[Neovim]] 0.9.2
## [[VSCodeVim]]の無効化
いきなりアンインストールはリスキーなのでまずは様子見したい。ということで無効化に留める。
## [[VSCode Neovim]]のインストール
[[VSCode]]のUIから。
![[Pasted image 20231007174616.png]]
あとは再起動したら普通に[[Neovim]]の操作が使えた。
## 設定の精査
### READMEの内容把握
公式のREADMEを見ながら設定していく。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - vscode-neovim/vscode-neovim: Vim mode for VSCode, powered by Neovim
</div>
<div class="link-card-v2-content">
Vim mode for VSCode, powered by Neovim. Contribute to vscode-neovim/vscode-neovim development by creating an acc ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/c8eefb9817948b1dace656e15926ef1e8fbe5ef1b71488006ef61636c5c563a8/vscode-neovim/vscode-neovim" />
<a href="https://github.com/vscode-neovim/vscode-neovim"></a>
</div>
> Since many VIM plugins can cause issues in VSCode, it is recommended to start from an empty init.vim. For a guide for which types of plugins are supported, see troubleshooting.
[[VSCode]]だと動かないプラグインも多いから [[init.vim]] ([[init.lua]]) は空から始めた方がいいという内容。それはそれで面倒だから、自分は条件分岐をあとから加えていく方法で対処していく。よく使うモノが動けばOK。
[[init.lua]]内では以下のように条件分岐できるとのこと。
```lua
if vim.g.vscode then
-- VSCode extension
else
-- ordinary Neovim
end
```
> To conditionally activate plugins, vim-plug has a few solutions. packer.nvim and lazy.nvim have built-in support for cond = vim.g.vscode. See plugins in the wiki for tips on configuring VIM plugins.
[[lazy.nvim]]を使っているので特に気にしなくてもよさそう。
### [[Neovim]]と共存できる設定づくり
[[Neovim]]と[[VSCode Neovim]]の両方で使用するプラグインもそれなりにあるはずなので、以下をそれぞれ設定できるようにする。
- [[Neovim]]と[[VSCode Neovim]]の両方で使うプラグイン
- [[Neovim]]でのみ使うプラグイン
- [[VSCode Neovim]]でのみ使うプラグイン
[[init.lua]]には以下のような記載をする。
```lua
function merge_tables(t1, t2)
local merged = {}
for _, v in ipairs(t1) do
table.insert(merged, v)
end
for _, v in ipairs(t2) do
table.insert(merged, v)
end
return merged
end
local is_vscode = vim.g.vscode == 1
local common_plugins = {
-- 両方で使うプラグインを列挙
}
local vscode_plugins = {
-- VSCode Neovimでのみ使うプラグインを列挙
}
local neovim_plugins = {
-- Neovimでのみ使うプラグインを列挙
}
require('lazy').setup(
merge_tables(common_plugins, is_vscode and vscode_plugins or neovim_plugins)
)
```
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
📕init.luaをNeovimとVSCode Neovimとで読み分ける
</div>
<div class="link-card-v2-content">NeovimとVSCode Neovimでinit.luaのプラグイン設定を条件分岐し、環境ごとに読み分ける方法を解説。プラグイン管理や設定分離に役立つ情報である。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/prime.webp" />
<a data-href="📕init.luaをNeovimとVSCode Neovimとで読み分ける" class="internal-link"></a>
</div>
%%[[📕init.luaをNeovimとVSCode Neovimとで読み分ける]]%%
## プラグインの仕分け
プラグインの仕分けを行う。
### 両方で使うプラグイン
- [[hop.nvim]]
- [[commentary.vim]]
- [[vim-textobj-user]]
- [[ReplaceWithRegister]]
- [[nvim-surround]]
- [[CamelCaseMotion (Vim)|CamelCaseMotion]]
- [[vim-highlightedyank]]
### [[Neovim]]でのみ使うプラグイン
基本的には[[VSCode]]で動作しないもの。
- [[gruvbox.nvim]]
- [[gruvbox-material]]
- [[nvim-treesitter]]
- [[vim-signature]]
- [[Nvim-web-devicons]]
- [[bufdelete.nvim]]
- [[barbar.nvim]]
- [[vim-visual-multi]]
- [[lualine.nvim]]
- [[possession.nvim]]
- [[telescope.nvim]]
- [[telescope-file-browser.nvim]]
- [[nvim-tree.lua]]
- [[fm-nvim]]
- [[gitsigns.nvim]]
- [[coc.nvim]]
- [[Markdown Preview for (Neo)vim]]
### [[VSCode Neovim]]でのみ使うプラグイン
今は無し。
## キーバインディングの見直し
[[VSCode Neovim]]のバインディングとバッティングしないように[[keybindings.json]]を見直す。特に`ctrl+w`に関するコマンドは重要
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
VSCode Neovimでctrl+wに関するコマンドが使えない
</div>
<div class="link-card-v2-content">VSCode Neovimで「Ctrl+w w」などのウィンドウ分割・移動コマンドが使えない場合、VSCodeのkeybindings.jsonでCtrl+wのバインディングが競合していることが原因である。不要なキーバインドを削除することで解決できる。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/troubleshooting.webp" />
<a data-href="VSCode Neovimでctrl+wに関するコマンドが使えない" class="internal-link"></a>
</div>
%%[[VSCode Neovimでctrl+wに関するコマンドが使えない]]%%
[[VSCode]] 1.83.0のバグも踏んで地味に大変だった。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
📝VSCodeでユーザーディレクトリ配下のkeybindings.jsonやsettings.jsonがシンボリックリンクだとVSCodeから変更されたときにリンクが切れる
</div>
<div class="link-card-v2-content">Windows 11環境でVSCodeのkeybindings.jsonやsettings.jsonをシンボリックリンクで管理すると、1.83でファイル変更時にリンクが切れるバグが発生する。Git管理やsymlink運用時に注意が必要である。1.83.1で修正済み。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/troubleshooting.webp" />
<a data-href="📝VSCodeでユーザーディレクトリ配下のkeybindings.jsonやsettings.jsonがシンボリックリンクだとVSCodeから変更されたときにリンクが切れる" class="internal-link"></a>
</div>
%%[[📝VSCodeでユーザーディレクトリ配下のkeybindings.jsonやsettings.jsonがシンボリックリンクだとVSCodeから変更されたときにリンクが切れる]]%%