我正在尝试制作一个Vim插件,可以在加载时分割窗口并在终端顶部模拟信息栏。我已经有了一些成果,但我认为我要么达到了我的Vim语法知识的极限,要么我的代码存在逻辑问题。
期望的效果是从活动缓冲区中搜索任何Perl子例程声明,并在顶部缓冲区显示该行。我还试图使其在使用Ctrl-R切换缓冲区时跳过该缓冲区。到目前为止,我尝试使用嵌套的if语句实现此功能。
无论如何,这里是代码。我非常感谢任何人提供的反馈。
期望的效果是从活动缓冲区中搜索任何Perl子例程声明,并在顶部缓冲区显示该行。我还试图使其在使用Ctrl-R切换缓冲区时跳过该缓冲区。到目前为止,我尝试使用嵌套的if语句实现此功能。
无论如何,这里是代码。我非常感谢任何人提供的反馈。
let s:current_function_bufname = 'Current\ Function\/Subroutine'
function! s:get_current_function_name(no_echo)
let lnum = line(".")
let col = col(".")
if a:no_echo
let s:current_function_name = getline(search("^[^s]*sub .*$", 'bW'))
else
echohl ModeMsg
echo getline(search("^[^s]*sub .*$", 'bW'))
"echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
echohl None
endif
endfunction
let s:previous_winbufnr = 1
let s:current_function_name = ''
let s:current_function_buffer_created = 0
let s:current_function_bufnr = 2
function! s:show_current_function()
let total_buffers = winnr('$')
let current_winbufnr = winnr()
if s:previous_winbufnr != current_winbufnr
if bufname(current_winbufnr) == s:current_function_bufname
if s:previous_winbufnr < current_winbufnr
let i = current_winbufnr + 1
if i > total_buffers
let i = 1
endif
if i == s:current_function_bufnr
let i = i + 1
endif
if i > total buffers
let i = 1
endif
exec i.'wincmd w'
else
let i = current_winbufnr - 1
if i < 1
let i = total_buffers
endif
if i == s:current_function_bufnr
let i = i - 1
endif
if i < 1
let i = total_buffers
endif
try
exec i.'wincmd w'
finally
exec total_buffers.'wincmd w'
endtry
endif
endif
let s:previous_winbufnr = current_winbufnr
return 1
endif
if s:current_function_buffer_created == 0
exec 'top 1 split '.s:current_function_bufname
call s:set_as_scratch_buffer()
let s:current_function_buffer_created = 1
let s:current_function_bufnr = winnr()
endif
call s:activate_buffer_by_name(s:current_function_bufname)
setlocal modifiable
call s:get_current_function_name(1)
call setline(1, s:current_function_name)
setlocal nomodifiable
call s:activate_buffer_by_name(bufname(current_winbufnr))
endfunction
function! s:set_as_scratch_buffer()
setlocal noswapfile
setlocal nomodifiable
setlocal bufhidden=delete
setlocal buftype=nofile
setlocal nobuflisted
setlocal nonumber
setlocal nowrap
setlocal cursorline
endfunction
function! s:activate_buffer_by_name(name)
for i in range(1, winnr('$'))
let name = bufname(winbufnr(i))
let full_name = fnamemodify(bufname(winbufnr(i)), ':p')
if name == a:name || full_name == a:name
exec i.'wincmd w'
return 1
endif
endfor
return 0
endfunction
set laststatus=2
autocmd! CursorMoved,CursorMovedI,BufWinEnter * call s:show_current_function()
类似于问题VIM:在窗口顶部显示自定义参考栏和Vim技巧维基页面在C程序中显示当前函数名称。