我想制作一个vim备忘单插件。这很简单:
我已经有了这些cheatsheets的集合,采用vimhelp格式,但现在我必须手动打开它们。
我还没有真正完成任何vim脚本,但我想这可以很简单地放在一起。我不习惯谷歌搜索不相关的代码片段,所以我在这里问的是:
任何人都可以简单总结一下我需要学习的关于vim脚本编写的内容。我很难找到的是如何切换缓冲区窗口。
如果你知道任何介绍我需要的材料的介绍教程,请提供链接。
TX,
aktivb
答案 0 :(得分:2)
下面的功能可能不完全符合您的要求,我没有测试过,但它应该给您一些想法。
主要思想是函数读取当前缓冲区的文件类型(您可以通过键入:echo &ft
来测试它),然后设置适当的作弊者的路径。如果存在,则在拆分窗口中打开此路径(只读且不可修改)。然后,您可以按照自己的方式调用此函数,例如将其映射到{F5}键,如图所示。
我不确定切换的可能性(这是否比关闭分割窗口更容易?)但你可以查看bufloaded()函数,它返回当前是否正在访问给定文件。 / p>
function! Load_Cheat_Sheet()
let l:ft = &ft
if l:ft == 'html'
let l:path = 'path/to/html/cheat/sheet'
elseif l:ft == 'c'
let l:path = 'path/to/c/cheat/sheet'
elseif l:ft == 'tex'
let l:path = 'path/to/tex/cheat/sheet'
endif
if l:path != '' && filereadable(l:path)
execute ':split +setlocal\ noma\ ro ' l:path
endif
endfunction
map <F5> :call Load_Cheat_Sheet()<CR>
希望这会有所帮助。如果有什么不清楚,或者你想了解更多,请大声喊叫。
答案 1 :(得分:2)
在我收到有关Eduan答案的通知之前,我已经忘记了这一点。自从我发布这个问题以来,我已经完成了相当多的vim脚本,包括让它工作:
let g:cheatsheet_dir = "~/.vim/bundle/cheatsheet/doc/"
let g:cheatsheet_ext = ".cs.txt"
command! -nargs=? -complete=customlist,CheatSheetComplete CS call ToggleCheatSheet(<f-args>)
nmap <F5> :CS<CR>
" strip extension from complete list
function! CheatSheetComplete(A,L,P)
return map(split(globpath(g:cheatsheet_dir, a:A.'*'.g:cheatsheet_ext)),
\ "v:val[".strlen(expand(g:cheatsheet_dir)).
\ ":-".(strlen(g:cheatsheet_ext) + 1)."]")
endfun
" specify cheatsheet or use filetype of open buffer as default
" instead of saving window status in a boolean variable,
" test if the file is open (by name). If a boolean is used,
" you'll run into trouble if you close the window manually with :wq etc
function! ToggleCheatSheet(...)
if a:0
let s:file = g:cheatsheet_dir.a:1.g:cheatsheet_ext
else
if !exists("s:file") || bufwinnr(s:file) == -1
let s:file = g:cheatsheet_dir.&ft.g:cheatsheet_ext
endif
endif
if bufwinnr(s:file) != -1
call ToggleWindowClose(s:file)
else
call ToggleWindowOpen(s:file)
endif
endfun
" stateless open and close so it can be used with other plugins
function! ToggleWindowOpen(file)
let splitr = &splitright
set splitright
exe ":vsp ".a:file
exe ":vertical resize 84"
if !splitr
set splitright
endif
endfun
function! ToggleWindowClose(file)
let w_orig = bufwinnr('%')
let w = bufwinnr(a:file)
exe w.'wincmd w'
exe ':silent wq!'
if w != w_orig
exe w_orig.'wincmd w'
endif
endfun
答案 2 :(得分:1)
我想我会加入Goulash的答案。
我认为为了实现切换,你只需使用一些if语句和一个全局变量。
let g:cheatsheet_toggle_on=0
if (g:cheatsheet_toggle_on == 0)
" Turn the cheatsheet on
" Also make sure to know that the toggle is on:
let g:cheatsheet_toggle_on=1
elseif (g:cheatsheet_toggle_on=1
" Do whatever you need to turn it off, here
endif
希望这可以找出逻辑。 :)