2011-03-04 17 views
8

Quiero hacer un complemento de hoja de trucos vim. Es muy simple:Vim script: Buffer/CheatSheet Toggle

  • Quiero alternar mis hojas de prueba. Un conmutador vertsplit, como Taglist o NERDTree.
  • Quiero que la hoja de trucos sea específica de un archivo. Así que alternar mi cheatsheet C++ cuando he abierto un archivo .cpp.
  • Quiero que la hoja de trucos se divida horizontalmente. Por lo tanto, muestra dos archivos, mi hoja de referencia de sintaxis y mi hoja de trucos de fragmentos de fragmentos.

Ya tengo una colección de estas hojas de prueba, en formato vimhelp, pero ahora tengo que abrirlas manualmente.

Realmente no he hecho ninguna secuencia de comandos vim, pero me imagino que esto sería muy simple de armar. Estoy harto de sorta googlear CodeSnippets no relacionados, así que lo que estoy haciendo aquí es:

  1. Podría alguien darme una breve suma de lo que tengo que aprender en cuanto a secuencias de comandos de vim para reconstruir juntos . Lo que me cuesta encontrar es cómo alternar la ventana del búfer.

  2. Si conoce algún tutorial de introducción que cubra el material que necesito para ponerlo en funcionamiento, proporcione un enlace.

TX,

aktivb

Respuesta

2

Me había olvidado de esto hasta que recibí un aviso sobre la respuesta de Eduan. Desde que publiqué esta pregunta, he hecho bastantes guiones de vim, incluido hacer que esto funcione:

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

Ésta función no puede hacer exactamente lo que quiere, y yo no lo he probado, pero hay que darle algunas ideas.

La idea principal es que la función lea el tipo de archivo del búfer en uso (puede probar esto escribiendo :echo &ft) y luego establece la ruta de la protección contra estafas correspondiente. Si existe, esta ruta se abre (de solo lectura y no modificable) en una ventana dividida. A continuación, puede llamar a esta función de la forma que desee, por ejemplo asignándola a la tecla {F5} como se muestra.

No estoy seguro de las posibilidades de alternar (¿esto es realmente más fácil que simplemente cerrar la ventana dividida?) Pero podría mirar la función bufloaded(), que devuelve si se está accediendo o no a un archivo determinado.

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> 

Espero que esto ayude. Simplemente grite si algo no está claro o si quiere saber más.

+0

Gracias, no es exactamente lo que estoy buscando, pero me ayudó a comenzar.Pero sí, quiero alternar. Voy a necesitar eso para otras secuencias de comandos que he planeado también. – aktivb

+0

@aktivb ¿Alguna vez lo hiciste funcionar? Estoy buscando hacer exactamente lo mismo –

1

Pensé que agregaría a la respuesta de Goulash.

Creo que para implementar el alternar simplemente usaría algunos enunciados if y una variable global.

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 

Espero que esto explique esa lógica. :)