Closed14

Bad Apple!! in Vim 比較

kawarimidollkawarimidoll

https://github.com/willelz/badapple.nvim

  • nvim用 フローティングウィンドウで起動
  • 自分の環境ではなぜかフローティングウィンドウの表示される位置が中央からずれてしまう
  • 表示はされるがカーソルはちらつく
  • こちらもコントロールを奪われるので動画をかけながら作業したりすることはできない
kawarimidollkawarimidoll

https://github.com/ryoppippi/bad-apple.vim

  • denops上で動く
  • enewで動作する これフローティングだったらよかったんだけど
  • フローティングウィンドウを自分で表示させて実行してみたところ、フローティングウィンドウを途中で閉じても処理が終わらないため、 現在のバッファにBad Apple!!が書き込まれつづける という挙動が判明 これは厳しいな
kawarimidollkawarimidoll

https://github.com/seandewar/bad-apple.nvim

  • lua製
  • フローティングウィンドウからカーソルを外せるのは好印象 要するに表示させながら他のVim操作が可能
  • サウンド連携もできるらしいが手元ではうまく行かなかった
  • たぶんこのプラグインとは関係ないけどchowcho.nvimで[bad-apple]が正規表現として判定されているっぽく[d-a]の部分でE944が出る
kawarimidollkawarimidoll

splitならこんなかんじでいける

botright 20 split +enew
  \ | setl nonumber nocursorline nocursorcolumn
  \ | execute 'terminal cd /path/to/bad-apple-nodejs && yarn start'
  \ | set bufhidden=wipe
  \ | execute 'normal! G'
kawarimidollkawarimidoll

フローティングウィンドウ、こんな感じかな

command! RunBadApple execute 'lua vim.api.nvim_open_win(0, true, { style = "minimal", relative = "editor", width = 48, height = 20, anchor = "NE", row = 0, col = vim.api.nvim_get_option("columns"), focusable = false , noautocmd = true })'
  \ | enew
  \ | execute 'terminal cd /path/to/bad-apple-nodejs && yarn start'
  \ | set winblend=100 bufhidden=wipe
  \ | execute 'normal! G'
  \ | wincmd p

termopen()を使うとうまく行かない

kawarimidollkawarimidoll

だんだんでかくなってきた

function! s:run_bad_apple() abort
  lua vim.api.nvim_open_win(0, true, { style = "minimal", relative = "editor", width = 48, height = 20, anchor = "NE", row = 0, col = vim.api.nvim_get_option("columns"), noautocmd = true })
  enew
  let winid = win_getid()
  terminal cd /path/to/bad-apple-nodejs && yarn start
  stopinsert
  execute 'autocmd TermClose <buffer> execute win_id2win(' .. winid .. ') .. "wincmd w" | call feedkeys("ii") | unlet g:bad_apple_buf'
  set winblend=100 bufhidden=wipe
  let b:term_title = 'BadApple'
  let g:bad_apple_buf = bufnr()
  normal! G
  wincmd p
endfunction
function! s:stop_bad_apple() abort
  if get(b:, 'bad_apple_buf')
    execute g:bad_apple_buf .. 'bwipeout'
    unlet g:bad_apple_buf
  endif
endfunction
command! RunBadApple call s:run_bad_apple()
command! StopBadApple call s:stop_bad_apple()

TermCloseのautocmdを仕掛けることで[Process exited 0]を出さずに叩き落とすことが可能だ

参考
https://www.reddit.com/r/neovim/comments/f2py7h/exit_from_neovim_terminal_without_pressing/

kawarimidollkawarimidoll

ひとつまえのやり方だとうまく終了できない場合があるぽいのでterminalのラッパーを作成

function! s:terminal_autoclose(cmd) abort
  execute 'terminal' get(a:, 'cmd', '')
  execute 'autocmd TermClose <buffer>'
  \ ' if win_gotoid(' .. win_getid() .. ')'
  \ ' |   stopinsert'
  \ ' |   call feedkeys("ii")'
  \ ' | endif'
endfunction
command! -nargs=* TerminalAutoclose call s:terminal_autoclose(<q-args>)

:TerminalAutoclose echo hello && sleep 1のように使う
コマンド実行終了後、自動的にターミナルを終了する

→ あー実行中にonlyとかで終了すると現在のwindowにinsertされてしまうな どうしよう

kawarimidollkawarimidoll

これでいけそう

function! s:run_bad_apple() abort
  if get(g:, 'bad_apple_buf')
    lua vim.notify('BadApple is running. Run :StopBadApple to clear.')
    return
  endif
  lua vim.g.bad_apple_buf = vim.api.nvim_create_buf(false, true)
  lua vim.api.nvim_open_win(vim.g.bad_apple_buf, true, {
    \ style = "minimal", relative = "editor",
    \ width = 48, height = 20, anchor = "NE",
    \ row = 0, col = vim.api.nvim_get_option("columns"),
    \ focusable = false, noautocmd = true })
  let cmd = 'cd /path/to/bad-apple-nodejs && yarn start'
  call termopen(cmd, {'on_exit':{_->get(g:, 'bad_apple_buf') && execute(g:bad_apple_buf .. 'bwipeout! | unlet! g:bad_apple_buf', 'silent!')}})
  stopinsert
  set winblend=100 bufhidden=wipe
  normal! G
  wincmd p
endfunction
function! s:stop_bad_apple(...) abort
  if get(g:, 'bad_apple_buf')
    silent! execute g:bad_apple_buf .. 'bwipeout!'
  endif
endfunction
command! RunBadApple call s:run_bad_apple()
command! StopBadApple call s:stop_bad_apple()
kawarimidollkawarimidoll

右上・右下に出してしまうとコードの最上段・最下段が隠れてしまう可能性あり
カーソル位置で表示位置を動かすこともできるけどCursorMovedにautocmdを仕込むのは正直避けたい
ということで右中段に出すのが良いかな…winblendは文字までは透過してくれないのでコードが隠れるのは避けられない

このスクラップは2023/05/24にクローズされました