Closed3

Vimのtablineにバッファを表示する

ピクリン酸ピクリン酸

プラグインでは定番のtablineにバッファを表示するやつです。
プラグインのない環境でも.vimrcに追加すれば動きます。
中身としてはlsコマンドでバッファ一覧を取得してtablineに設定しているだけですね。

function! BufferTabLine()
	let buffer_tabline = ''
	let sep = '|'
	let s:buffer_info = s:GetBufferName()
	for i in s:buffer_info
		if i[3] == 1
			let buffer_tabline = buffer_tabline . '%#TabLineSel#'
		else
			let buffer_tabline = buffer_tabline . '%#TabLine#'
		endif
		
		let buffer_tabline = buffer_tabline . i[0] . ': ' . i[1]
		if i[2] == 1
			let buffer_tabline = buffer_tabline . ' +'
		endif
		
		let buffer_tabline = buffer_tabline . sep
	endfor
	
	let buffer_tabline = buffer_tabline . '%#TabLineFill#%T'
	let buffer_tabline = buffer_tabline . '%=buffers'
	return buffer_tabline
endfunction

function! s:GetBufferName()
	let s:buffers = execute('ls')
	
	let s:result = []
	let s:buffer_list = split(s:buffers, "\n")
	
	for b in s:buffer_list
		let s:buffer_line = split(b)
		let s:buffer_num = s:buffer_line[0]
		let s:buffer_name = ''
		let s:current_buffer = 0
		let s:edit_flag = 0
		
		for i in s:buffer_line
			if i == '%a'
				let s:current_buffer = 1
			elseif i == '+'
				let s:edit_flag = 1
			elseif i[0] == '"'
				let s:path = substitute(i, '"', '', 'g')
				let s:name_path = split(s:path, '/')
				let s:buffer_name = s:name_path[len(s:name_path) - 1]
			else
			endif
		endfor
		
		let s:result = add(s:result, [s:buffer_num, s:buffer_name, s:edit_flag, s:current_buffer])
	endfor
	
	return s:result
endfunction

set tabline=%!BufferTabLine()
ピクリン酸ピクリン酸

Vim8以前だとexeute()が使えないのでリダイレクトします。

redir => s:buffers
	silent ls
redir END
ピクリン酸ピクリン酸

neovimにも対応するためluaで書き直しました。

local api = vim.api

vim.o.tabline = "%!v:lua.BufferTabLine()"

function _G.BufferTabLine()
    local buffer_tabline = ""
    local sep = "|"

    local buffers_num = api.nvim_list_bufs()
    for _, buf_num in ipairs(buffers_num) do
        if api.nvim_buf_is_loaded(buf_num) then
            --- 選択しているバッファである場合、ハイライトを変える
            local current_buf_num = api.nvim_get_current_buf()

            if buf_num == current_buf_num then
                buffer_tabline = buffer_tabline .. "%#TabLineSel#"
            else
                buffer_tabline = buffer_tabline .. "%#TabLine#"
            end

            --- バッファ番号、バッファ名を表示
            local buf_name = vim.fn.fnamemodify(api.nvim_buf_get_name(buf_num), ":t")
            buffer_tabline = buffer_tabline .. buf_num .. ":" .. buf_name

            --- バッファに変更が加えられている場合、"+"を表示
            local modified = api.nvim_buf_get_option(buf_num, "modified")
            if modified then
                buffer_tabline = buffer_tabline .. "+"
            end

            buffer_tabline = buffer_tabline .. sep
        end
    end
    buffer_tabline = buffer_tabline .. "%#TabLineFill#%T" .. "%=buffers"

    return buffer_tabline
end
このスクラップは2024/01/04にクローズされました