📝
Neovimのterminalで実行したコマンドをバッファ名に含める
一度閉じたterminalバッファを探したいとき、
何のコマンドを実行したバッファなのかバッファ名に手がかりがなくて探しにくい。
fuzzy finderのpreview機能で目視してもいいが、数が多いと面倒。
実行直前に実行するコマンド含めたバッファ名をセットすると探しやすくなった。
function! s:set_title(prompt_pattern, max_length) abort
let path = nvim_buf_get_name(0)
let shell = split(fnamemodify(path, ':t'), ':')[0]
let term_path = printf('%s/%s', fnamemodify(path, ':h'), shell)
let prompt_line = getline(search(a:prompt_pattern, 'nbcW'))
let prompt = matchstr(prompt_line, a:prompt_pattern)
let cmd = prompt_line[strlen(prompt) : a:max_length]
let cmd = substitute(cmd, '/', '\\', 'g') " fnamemodify(path, ':t') の邪魔なので置き換えちゃう
call nvim_buf_set_name(0, printf('%s:%s', term_path, cmd))
redrawtabline " nvim_buf_set_name()は`:file {name}`と異なり純粋にバッファ名を変えるだけなので必要に応じて
endfunction
tnoremap <CR> <Cmd>call <SID>set_title('^\$ ', 24)<CR><CR>
プロンプトのパターンを与えて、今から実行するコマンドを探してきてbuffer名にくっつける実装。
プロンプト2行派なのでパターンが単純になっている。
[notomo@DESKTOP ~/dotfiles]
$
もともとのバッファ名term://{cwd}//{pid}:{cmd}
に実行するコマンド名がついて、
例えばmake build
を実行するとterm://~/dotfiles//2721:/usr/local/bin/zsh:make build
のようになる。
もともとpidが含まれるので、複数terminalを扱ってもE95: Buffer with this name already exists
エラーを回避できている。
雑にterminalバッファを開いて捨てる使い方をしているので、fuzzy finderで楽に探せて便利。
Discussion