Ich versuche, ein Vim-Plugin zu erstellen, das das Fenster beim Laden teilt und eine Infobalken am oberen Rand meines Terminals simuliert. Es funktioniert irgendwie, aber ich glaube, ich habe entweder die Grenzen meines Wissens über die Vim-Syntax erreicht oder es gibt ein Logikproblem in meinem Code.
Der gewünschte Effekt wäre, eine Rückwärtssuche nach einer Deklaration einer Perl-Unterfunktion ab meinem aktuellen Standort im aktiven Puffer durchzuführen und die Zeile im oberen Puffer anzuzeigen. Ich versuche auch, zu verhindern, dass dieser Puffer übersprungen wird, wenn ich Puffer mit Strg-R wechsle. Mein bisheriger Versuch dazu ist im Durcheinander von nested if-Anweisungen zu sehen.
Wie auch immer, hier ist der Code. Ich würde das Feedback von jedem sehr schätzen.
let s:current_function_bufname = 'Aktuelle\ Funktion\/Unterfunktion'
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()
Ähnlich der Frage VIM: eigene Referenzleiste oberhalb des Fensters anzeigen und der Vim-Tipps-Wikiseite Aktuellen Funktionsnamen in C-Programmen anzeigen.
3 Stimmen
Ich bin kein Vim-Benutzer, daher kann ich nichts zu deinem Code sagen, aber dies könnte im Zusammenhang damit stehen, was du zu tun versuchst: blogs.perl.org/users/ovid/2011/01/…
0 Stimmen
Du könntest am vim-perl Projekt interessiert sein: github.com/vim-perl/vim-perl Hier wird die gesamte Perl-Unterstützung für Vim entwickelt. Diese Verbesserungen werden dann in die Hauptveröffentlichungen von Vim integriert.