先日、GitHubの内部情報がVSCodeの拡張機能経由で流出した事件があった。

GitHubの内部情報が流出、Visual Studio Codeの拡張機能経由で約3800のリポジトリに不正アクセスされる - GIGAZINE

自分はVSCodeをメインに使っておらず、ほとんど拡張機能も使っていないのだが、愛用しているvimも同じようにplugin経由で侵害される危険性があるので、悪意ある変更が意図せずに取り込まれないようにversion pinningすることにした。 (もちろんこれだけで全ての危険性に対処できるわけではないが)

対応

vimにはいくつもプラグインマネージャがあるが、自分は vim-plug を使用している。

vim-plugには:PlugSnapshot というコマンドがあり、それによって各プラグインのcommit hashを含んだリストア用のvimスクリプトを生成する機能がある。

lockファイルそのものではないが、同じような用途として使えそうなので、これを一旦lockファイルとして使うことにした。 ついでに使用するプラグインも整理した。

参考までに、自分が :PlugSnapshot で生成したファイルは↓な感じ。

" Generated by vim-plug
" Sun May 24 18:43:33 2026
" :source this file in vim to restore the snapshot
" or execute: vim -S snapshot.vim

silent! let g:plugs['async.vim'].commit = '2082d13bb195f3203d41a308b89417426a7deca1'
silent! let g:plugs['asyncomplete-lsp.vim'].commit = 'da23f4418a6301feac7b99e1728fb79acb243d69'
silent! let g:plugs['asyncomplete.vim'].commit = '17b654a87a834d4e835fb7467e562b4421ad9310'
silent! let g:plugs['committia.vim'].commit = 'c8c0f255e8090ed90dd9d5dd2e8672994f8e3671'
silent! let g:plugs['fzf'].commit = '3953d1c649f51b129adac1f065c431320f3db467'
silent! let g:plugs['fzf.vim'].commit = 'e5b53de3d3b402d2ef9f74da91c2bb808d0afb34'
silent! let g:plugs['lexima.vim'].commit = 'ab621e4756465c9d354fce88cff2bd1aa7887065'
silent! let g:plugs['lightline.vim'].commit = '6c283f8df85aa7219fa4096a6ed4ff45d48aa9e1'
silent! let g:plugs['rust-doc.vim'].commit = 'fecc20ff24a34cbc6599fb89c0cb79e92e0c581b'
silent! let g:plugs['rust.vim'].commit = '889b9a7515db477f4cb6808bef1769e53493c578'
silent! let g:plugs['spelunker.vim'].commit = 'a0bc530f62798bbe053905555a4aa9ed713485eb'
silent! let g:plugs['stoptypofile.vim'].commit = '994ed74a00771bc06d98578874f2e7e80a258cd5'
silent! let g:plugs['typescript-vim'].commit = '4740441db1e070ef8366c888c658000dd032e4cb'
silent! let g:plugs['vim-abolish'].commit = 'dcbfe065297d31823561ba787f51056c147aa682'
silent! let g:plugs['vim-colors-off'].commit = '8d491e15a396be671b0d8e85e67de3252429819b'
silent! let g:plugs['vim-commentary'].commit = '64a654ef4a20db1727938338310209b6a63f60c9'
silent! let g:plugs['vim-dirvish'].commit = '9525f46ccbf2dd585523fe3e3b72151554df3a42'
silent! let g:plugs['vim-easy-align'].commit = '9815a55dbcd817784458df7a18acacc6f82b1241'
silent! let g:plugs['vim-emoji'].commit = '9ed6515401a6e20a9781ba508db7d67a5e4e231f'
silent! let g:plugs['vim-endwise'].commit = '4994afb0cdf956d9a665a14b9c834869e602c396'
silent! let g:plugs['vim-findroot'].commit = '76af2f097cf8196b00f049054444966d10c82f95'
silent! let g:plugs['vim-goimports'].commit = 'e50dae830c3cc405003bbc79e90c2dfb5c8da7f5'
silent! let g:plugs['vim-json'].commit = '3727f089410e23ae113be6222e8a08dd2613ecf2'
silent! let g:plugs['vim-lsp'].commit = '474c656659b5fb51eec6770309e0211c8aa49b5b'
silent! let g:plugs['vim-lsp-icons'].commit = '409a0008d017a412166dbede92ca85f53b6903e2'
silent! let g:plugs['vim-lsp-settings'].commit = '1558bbaba4cbb593901e3dfc4d0f1a0cd212b09c'
silent! let g:plugs['vim-repeat'].commit = '65846025c15494983dafe5e3b46c8f88ab2e9635'
silent! let g:plugs['vim-signature'].commit = '6bc3dd1294a22e897f0dcf8dd72b85f350e306bc'
silent! let g:plugs['vim-submode'].commit = 'be74a7aabe44492432a86f4c954ba3b14a757b10'
silent! let g:plugs['vim-surround'].commit = '3d188ed2113431cf8dac77be61b842acb64433d9'
silent! let g:plugs['vim-tabpagecd'].commit = '5f647097d868318002de4d971ed446b8b44e4e90'
silent! let g:plugs['vim-textobj-entire'].commit = '64a856c9dff3425ed8a863b9ec0a21dbaee6fb3a'
silent! let g:plugs['vim-textobj-user'].commit = '41a675ddbeefd6a93664a4dc52f302fe3086a933'
silent! let g:plugs['vim-tmux-navigator'].commit = 'e41c431a0c7b7388ae7ba341f01a0d217eb3a432'
silent! let g:plugs['vimdoc-ja'].commit = '46ed6cadecc4d42704d5ef314ca842d7be2921ad'
silent! let g:plugs['vimwiki'].commit = 'a54a3002e229c4b43d69ced170ff77663a5b2c40'
silent! let g:plugs['vista.vim'].commit = '1e90efad6e32c4f7d16b1ca8f49bf63d0693802e'

PlugUpdate!

これを、vim -S ファイル名 または vim内で :source ファイル名 で読み込ませると、PlugSnapshotした時点でのプラグインが復元される。

:PlugDiff を使えば最新との差分が、:PlugUpdate プラグイン名 で個々のプラグインをアップデートできるので、一旦はこれで...

雑に :PlugUpdate してしまった際に全てのプラグインを更新してしまうので、そこは塞いだほうがいいかもしれない。

参考

Lockfiles for your Vim Plugins | Sheharyar Naseer