Vim скрипт: Buffer / CheatSheet Toggle - PullRequest
8 голосов
/ 04 марта 2011

Я хочу сделать плагин Vim шпаргалки.Это очень просто:

  • Я хочу переключить свои читы.Переключатель vertsplit, такой как Taglist или NERDTree.
  • Я хочу, чтобы чит-лист соответствовал типу файла.Поэтому я переключаю свой чит-лист c ++, когда открываю файл .cpp.
  • Я хочу, чтобы чит-лист был разделен по горизонтали.Таким образом, он показывает два файла, мой чит-лист с синтаксисом и чит-лист моего триггера.

У меня уже есть коллекция этих читов в формате vimhelp, но теперь я должен открыть их вручную.

На самом деле я не делал никаких скриптов для vim, но я думаю, это было бы очень просто собрать.Меня тошнит от поисков не связанных между собой кодзиппетов, поэтому я спрашиваю здесь:

  1. Может ли кто-нибудь дать мне краткую сводку того, что мне нужно изучить в отношении vimсценарии, чтобы собрать это воедино.Что мне трудно найти, так это как переключать окно буфера.

  2. Если вы знаете какие-нибудь вводные руководства, которые охватывают материал, который мне нужен, чтобы начать работу, пожалуйста, предоставьте ссылку.

tx,

aktivb

Ответы [ 3 ]

2 голосов
/ 03 января 2013

Я забыл об этом, пока не получил уведомление об ответе Эдуана. С тех пор, как я опубликовал этот вопрос, я выполнил немало сценариев 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 голосов
/ 07 марта 2011

Приведенная ниже функция может не выполнять то, что вам нужно, и я ее не проверял, но она должна дать вам некоторые идеи.

Основная идея заключается в том, что функция читает тип файла текущего буфера (вы можете проверить это, набрав :echo &ft), а затем задает путь к соответствующему списку читов. Если он существует, этот путь затем открывается (только для чтения и не модифицируется) в разделенном окне. Затем вы можете вызывать эту функцию любым способом, например, сопоставив ее с клавишей {F5}, как показано.

Я не уверен насчет возможностей переключения (это действительно проще, чем просто закрытие разделенного окна?), Но вы могли бы взглянуть на функцию bufloaded (), которая возвращает информацию о том, доступен ли в данный момент файл или нет.

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 голос
/ 02 января 2013

Думаю, я бы добавил к ответу Гуляша.

Я думаю, что для реализации переключения вы бы просто использовали некоторые операторы 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

Надеюсь, что это понять эту логику. :)

...