Skip to content

Instantly share code, notes, and snippets.

@SidOfc
Created August 26, 2018 20:35

Revisions

  1. SidOfc created this gist Aug 26, 2018.
    54 changes: 54 additions & 0 deletions fullscreen-scratch-2.vim
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,54 @@
    " since it is fullscreen, I'd like a 50/50 split
    let g:codi#width = 50.0

    " instead of destroying buffers, hide them and
    " index them by filetype into this dictionary
    let s:codi_filetype_tabs = {}

    fun! s:FullscreenScratch()
    " store filetype and bufnr of current buffer
    " for later reference
    let current_buf_ft = &ft
    let current_buf_num = bufnr('%')

    " check if a scratch buffer for this filetype already exists
    let saved_scratch = get(s:codi_filetype_tabs, current_buf_ft, -1)

    " if a tabpage exists for current_buf_ft, go to it instead of
    " creating a new scratch buffer
    if saved_scratch != -1
    if index(map(gettabinfo(), 'v:val.tabnr'), saved_scratch) == -1
    unlet s:codi_filetype_tabs[current_buf_ft]
    else
    exe 'tabn' saved_scratch
    return
    endif
    endif

    " create a new empty tab, set scratch options and give it a name
    tabe
    setlocal buftype=nofile noswapfile modifiable buflisted bufhidden=hide
    exe ':file scratch::' . current_buf_ft

    " set filetype to that of original source file
    " e.g. ruby / python / w/e Codi supports
    let &filetype = current_buf_ft

    " store the tabpagenr per filetype so we can return
    " to it later when re-opening from the same filetype
    let s:codi_filetype_tabs[&filetype] = tabpagenr()

    " create a buffer local mapping that overrides the
    " outer one to delete the current scratch buffer instead
    " when the buffer is destroyed, this mapping will be
    " destroyed with it and the next <Leader><Leader>
    " will spawn a new fullscreen scratch window again
    nmap <silent><buffer> <Leader><Leader> :tabprevious<Cr>
    " everything is setup, filetype is set
    " let Codi do the rest :)
    Codi
    endfun

    " create a mapping to call the fullscreen scratch wrapper
    nmap <silent> <Leader><Leader> :call <SID>FullscreenScratch()<Cr>