📚
NERDTreeでエラーE1312: Not allowed to change the window layout...
概要
vimのソースツリーのpluginでNERDTreeを使用していてvim-nerdtree-tabsで、
タブにNERDTreeしかない場合は閉じるように設定を入れていたらエラーが起きるようになった。
githubのcopilot.vimを使うためにVimを9.0.0185以上のバージョンにしたのが原因なのはわかっていたが忙しくて調べてなかったので調べてみた。
環境
- macOS Sonoma 14.4.1
- vim 9.0.2150
- NERDTree 7.1.2
- vim-nerdtree-tabs 1.4.7
参考リンク
- https://github.com/jistr/vim-nerdtree-tabs/issues/102
- https://github.com/AndrewRadev/linediff.vim/issues/36
- https://groups.google.com/g/vim_dev/c/Cw8McBH6DDM
原因
vim-nerdtree-tabs
のg:nerdtree_tabs_autoclose
を使用してたことが原因で、
vim9.0.907
からautocmd
によるバッファのクローズなどの特定の操作の実行を禁止になったとのこと。
対応方法1
- vim-nerdtree-tabsを自分で修正
- vim-nerdtree-tabsのissues#102参照
- nerdtree_plugin/vim-nerdtree-tabs.vim#L328あたりを下記のように修正
fun! s:CloseIfOnlyNerdTreeLeft()
if exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1 && winnr("$") == 1
if has('patch-9.0.907')
" Vim forbids closing the window inside an autocommand
" Ref: https://groups.google.com/g/vim_dev/c/Cw8McBH6DDM?pli=1
" So let's do it afterwards. Solution came from @mattmartini
" Ref: https://github.com/jistr/vim-nerdtree-tabs/issues/102
call timer_start(1, {-> execute('q', 'silent!') }) " close buffer after we exit autocmd
call timer_start(100, {-> execute('vertical resize 31', 'silent!') }) " window sizing is goofed up, so fix it
call timer_start(250, {-> execute('wincmd w', 'silent!') }) " shift focus from NerdTree window to buffer window
else
q
endif
endif
endfun
対応方法2
-
vim-nerdtree-tabs
はメンテナンスをされなくなって数年経ってるので環境変えるたびにソースの修正はしたくない(個人的な意見) -
vim-nerdtree-tabs
のg:nerdtree_tabs_autoclose
をoff -
.vimrc
に下記設定を追加
.vimrc
" tabがNERDTreeだけの場合はNERDTreeを閉じる
" vim9.0.907以降autocmdでwindowが閉じることを禁止してるので、制限が終わった後に実行
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | call timer_start(1, {-> execute("quit") }) | endif
※ 対応1より簡素なので不具合があると思います、修正などあればコメントいただけると嬉しいです
Discussion