📝

Neovimのterminalで実行したコマンドをバッファ名に含める

1 min read

一度閉じた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で楽に探せて便利。