Closed14
Bad Apple!! in Vim 比較
- Vimのポップアップで動く
- 古いバージョンやNeovimではsplitで動作する
- カーソルを動かせない?表示しながら作業するのはむりぽ
- nvim用 フローティングウィンドウで起動
- 自分の環境ではなぜかフローティングウィンドウの表示される位置が中央からずれてしまう
- 表示はされるがカーソルはちらつく
- こちらもコントロールを奪われるので動画をかけながら作業したりすることはできない
- denops上で動く
- enewで動作する これフローティングだったらよかったんだけど
- フローティングウィンドウを自分で表示させて実行してみたところ、フローティングウィンドウを途中で閉じても処理が終わらないため、 現在のバッファにBad Apple!!が書き込まれつづける という挙動が判明 これは厳しいな
- lua製
- フローティングウィンドウからカーソルを外せるのは好印象 要するに表示させながら他のVim操作が可能
- サウンド連携もできるらしいが手元ではうまく行かなかった
- たぶんこのプラグインとは関係ないけどchowcho.nvimで
[bad-apple]
が正規表現として判定されているっぽく[d-a]
の部分でE944
が出る
手元では起動できなかった
こいつをフローティングウィンドウで動かすくらいが一番良いのでは…
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'
フローティングウィンドウ、こんな感じかな
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()
を使うとうまく行かない
だんだんでかくなってきた
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]
を出さずに叩き落とすことが可能だ
参考
ひとつまえのやり方だとうまく終了できない場合があるぽいので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されてしまうな どうしよう
うまくいかない やはりterminal操作は魔窟か…
これでいけそう
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()
右上・右下に出してしまうとコードの最上段・最下段が隠れてしまう可能性あり
カーソル位置で表示位置を動かすこともできるけどCursorMovedにautocmdを仕込むのは正直避けたい
ということで右中段に出すのが良いかな…winblendは文字までは透過してくれないのでコードが隠れるのは避けられない
このスクラップは2023/05/24にクローズされました