Neovim: Auto close floating windows after window leave

function! CloseFloatingWindowsByFileTypePattern(filetype_pattern) abort
  " Get floating window IDs.
  " If 'relative' is not empty, this windows is a floating window.
  let floating_windows = filter(nvim_list_wins(), "nvim_win_get_config(v:val)['relative'] !=# ''")

  " Filter floating windows by filetype pattern.
  let close_windows = filter(floating_windows, "getbufvar(nvim_win_get_buf(v:val), '&filetype') =~# a:filetype_pattern")

  " Close target floating windows.
  call map(close_windows, 'nvim_win_close(v:val, v:false)')
endfunction

function! s:auto_close_floating_windows() abort
  " Do nothing if floating window.
  " If 'relative' is not empty, this windows is a floating window.
  if nvim_win_get_config(0)['relative'] !=# ''
    return
  endif

  call CloseFloatingWindowsByFileTypePattern('denite')
endfunction

au BufEnter * call s:auto_close_floating_windows()

References