Vim脚本:Buffer / CheatSheet Toggle

时间:2011-03-04 14:26:37

标签: vim scripting buffer toggle

我想制作一个vim备忘单插件。这很简单:

  • 我想切换我的秘籍表。一个vertsplit切换,如Taglist或NERDTree。
  • 我希望cheatsheet是特定于文件类型的。所以当我打开一个.cpp文件时,我切换了我的c ++ cheatsheet。
  • 我想让备忘单水平分割。所以它显示了两个文件,我的语法备忘单和我的代码段触发器备忘单。

我已经有了这些cheatsheets的集合,采用vimhelp格式,但现在我必须手动打开它们。

我还没有真正完成任何vim脚本,但我想这可以很简单地放在一起。我不习惯谷歌搜索不相关的代码片段,所以我在这里问的是:

  1. 任何人都可以简单总结一下我需要学习的关于vim脚本编写的内容。我很难找到的是如何切换缓冲区窗口。

  2. 如果你知道任何介绍我需要的材料的介绍教程,请提供链接。

  3. TX,

    aktivb

3 个答案:

答案 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

希望这可以找出逻辑。 :)