📚

NERDTreeでエラーE1312: Not allowed to change the window layout...

2024/05/01に公開

概要

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

参考リンク

原因

vim-nerdtree-tabsg:nerdtree_tabs_autocloseを使用してたことが原因で、
vim9.0.907からautocmdによるバッファのクローズなどの特定の操作の実行を禁止になったとのこと。

対応方法1

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-tabsg: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