Vim の input() でキャンセル(<Esc>)されたか判定する

Viminput() でキャンセル(<Esc>)されたか判定出来ないかぐぐってたら以下のようなワークアラウンドがあったので覚書。

" see: https://github.com/vim-jp/issues/issues/467#issuecomment-23766972
scriptencoding utf-8

function! s:input(...) abort
  new
  cmap <buffer> <esc> __CANCELED__<cr>
  let ret = call('input', a:000)
  bw!
  redraw
  if ret =~ '__CANCELED__$'
    throw "キャンセルされました"
  endif
  return ret
endfunction

echo s:input("foo:")

この発想はなかった。