diff options
| author | Ben Beltran <ben@freshout.us> | 2012-10-08 11:44:10 -0500 |
|---|---|---|
| committer | Ben Beltran <ben@freshout.us> | 2012-10-08 11:44:10 -0500 |
| commit | 0d23b6e515a01a5782532351821ebfa11f3d6cf2 (patch) | |
| tree | aa395b7e50ccb533d6b48b809016ac06f2d5bc8c /vim/plugin/gist.vim | |
| parent | a91731eac872b7837c2821341db5888702125cef (diff) | |
Add vim again :)
Diffstat (limited to 'vim/plugin/gist.vim')
| -rw-r--r-- | vim/plugin/gist.vim | 826 |
1 files changed, 826 insertions, 0 deletions
diff --git a/vim/plugin/gist.vim b/vim/plugin/gist.vim new file mode 100644 index 0000000..9081d00 --- /dev/null +++ b/vim/plugin/gist.vim @@ -0,0 +1,826 @@ +"============================================================================= +" File: gist.vim +" Author: Yasuhiro Matsumoto <mattn.jp@gmail.com> +" Last Change: 20-Aug-2011. +" Version: 5.0 +" WebPage: http://github.com/mattn/gist-vim +" License: BSD +" Usage: +" +" :Gist +" post current buffer to gist, using default privicy option +" (see g:gist_private) +" +" :'<,'>Gist +" post selected text to gist., using default privicy option +" This applies to all permutations listed below (except multi) +" (see g:gist_private) +" +" :Gist -p +" create a private gist +" +" :Gist -P +" create a public gist +" (only relevant if you've set gists to be private by default) +" +" :Gist -P +" post whole text to gist as public +" This is only relevant if you've set gists to be private by default +" :Gist -a +" create a gist anonymously +" +" :Gist -m +" create a gist with all open buffers +" +" :Gist -e +" edit the gist. (you need to have opend the gist buffer first) +" you can update the gist with :w command on gist buffer +" +" :Gist -d +" delete the gist. (you need to have opend the gist buffer first) +" password authentication is needed +" +" :Gist -f +" fork the gist. (you need to have opend the gist buffer first) +" password authentication is needed +" +" :Gist -e foo.js +" edit the gist with name 'foo.js'. (you need to have opend the gist buffer first) +" +" :Gist XXXXX +" get gist XXXXX +" +" :Gist -c XXXXX +" get gist XXXXX and add to clipboard +" +" :Gist -l +" list your public gists +" +" :Gist -l mattn +" list gists from mattn +" +" :Gist -la +" list all your (public and private) gists +" +" Tips: +" * if set g:gist_clip_command, gist.vim will copy the gist code +" with option '-c'. +" +" # mac +" let g:gist_clip_command = 'pbcopy' +" +" # linux +" let g:gist_clip_command = 'xclip -selection clipboard' +" +" # others(cygwin?) +" let g:gist_clip_command = 'putclip' +" +" * if you want to detect filetype from gist's filename... +" +" # detect filetype if vim failed auto-detection. +" let g:gist_detect_filetype = 1 +" +" # detect filetype always. +" let g:gist_detect_filetype = 2 +" +" * if you want to open browser after the post... +" +" let g:gist_open_browser_after_post = 1 +" +" * if you want to change the browser... +" +" let g:gist_browser_command = 'w3m %URL%' +" +" or +" +" let g:gist_browser_command = 'opera %URL% &' +" +" on windows, should work with original setting. +" +" * if you want to show your private gists with ':Gist -l' +" +" let g:gist_show_privates = 1 +" +" * if don't you want to copy URL of the post... +" +" let g:gist_put_url_to_clipboard_after_post = 0 +" +" or if you want to copy URL and add linefeed at the last of URL, +" +" let g:gist_put_url_to_clipboard_after_post = 2 +" +" default value is 1. +" +" Thanks: +" MATSUU Takuto: +" removed carriage return +" gist_browser_command enhancement +" edit support +" +" GetLatestVimScripts: 2423 1 :AutoInstall: gist.vim +" script type: plugin + +if &cp || (exists('g:loaded_gist_vim') && g:loaded_gist_vim) + finish +endif +let g:loaded_gist_vim = 1 + +if (!exists('g:github_user') || !exists('g:github_token')) && !executable('git') + echohl ErrorMsg | echomsg "Gist: require 'git' command" | echohl None + finish +endif + +if !executable('curl') + echohl ErrorMsg | echomsg "Gist: require 'curl' command" | echohl None + finish +endif + +if !exists('g:gist_open_browser_after_post') + let g:gist_open_browser_after_post = 0 +endif + +if !exists('g:gist_put_url_to_clipboard_after_post') + let g:gist_put_url_to_clipboard_after_post = 1 +endif + +if !exists('g:gist_curl_options') + let g:gist_curl_options = "" +endif + +if !exists('g:gist_browser_command') + if has('win32') || has('win64') + let g:gist_browser_command = "!start rundll32 url.dll,FileProtocolHandler %URL%" + elseif has('mac') + let g:gist_browser_command = "open %URL%" + elseif executable('xdg-open') + let g:gist_browser_command = "xdg-open %URL%" + else + let g:gist_browser_command = "firefox %URL% &" + endif +endif + +if !exists('g:gist_detect_filetype') + let g:gist_detect_filetype = 0 +endif + +if !exists('g:gist_private') + let g:gist_private = 0 +endif + +if !exists('g:gist_show_privates') + let g:gist_show_privates = 0 +endif + +if !exists('g:gist_cookie_dir') + let g:gist_cookie_dir = substitute(expand('<sfile>:p:h'), '[/\\]plugin$', '', '').'/cookies' +endif + +function! s:nr2hex(nr) + let n = a:nr + let r = "" + while n + let r = '0123456789ABCDEF'[n % 16] . r + let n = n / 16 + endwhile + return r +endfunction + +function! s:encodeURIComponent(instr) + let instr = iconv(a:instr, &enc, "utf-8") + let len = strlen(instr) + let i = 0 + let outstr = '' + while i < len + let ch = instr[i] + if ch =~# '[0-9A-Za-z-._~!''()*]' + let outstr = outstr . ch + elseif ch == ' ' + let outstr = outstr . '+' + else + let outstr = outstr . '%' . substitute('0' . s:nr2hex(char2nr(ch)), '^.*\(..\)$', '\1', '') + endif + let i = i + 1 + endwhile + return outstr +endfunction + +" Note: A colon in the file name has side effects on Windows due to NTFS Alternate Data Streams; avoid it. +let s:bufprefix = 'gist' . (has('unix') ? ':' : '_') +function! s:GistList(user, token, gistls, page) + if a:gistls == '-all' + let url = 'https://gist.github.com/gists' + elseif g:gist_show_privates && a:gistls == a:user + let url = 'https://gist.github.com/mine' + else + let url = 'https://gist.github.com/'.a:gistls + endif + let winnum = bufwinnr(bufnr(s:bufprefix.a:gistls)) + if winnum != -1 + if winnum != bufwinnr('%') + exe winnum 'wincmd w' + endif + setlocal modifiable + else + exec 'silent split' s:bufprefix.a:gistls + endif + if a:page > 1 + let oldlines = getline(0, line('$')) + let url = url . '?page=' . a:page + endif + + setlocal foldmethod=manual + let oldlines = [] + if g:gist_show_privates + echon 'Login to gist... ' + silent %d _ + let res = s:GistGetPage(url, a:user, '', '-L') + silent put =res.content + else + silent %d _ + exec 'silent r! curl -s' g:gist_curl_options url + endif + + 1delete _ + silent! %s/>/>\r/g + silent! %s/</\r</g + silent! %g/<pre/,/<\/pre/join! + silent! %g/<span class="date"/,/<\/span/join + silent! %g/^<span class="date"/s/> */>/g + silent! %v/^\(gist:\|<pre>\|<span class="date">\)/d _ + silent! %s/<div[^>]*>/\r /g + silent! %s/<\/pre>/\r/g + silent! %g/^gist:/,/<span class="date"/join + silent! %s/<[^>]\+>//g + silent! %s/\r//g + silent! %s/ / /g + silent! %s/"/"/g + silent! %s/&/\&/g + silent! %s/>/>/g + silent! %s/</</g + silent! %s/&#\(\d\d\);/\=nr2char(submatch(1))/g + silent! %g/^gist: /s/ //g + + call append(0, oldlines) + $put='more...' + + let b:user = a:user + let b:token = a:token + let b:gistls = a:gistls + let b:page = a:page + setlocal buftype=nofile bufhidden=hide noswapfile + setlocal nomodified + syntax match SpecialKey /^gist:/he=e-1 + nnoremap <silent> <buffer> <cr> :call <SID>GistListAction()<cr> + + cal cursor(1+len(oldlines),1) + setlocal foldmethod=expr + setlocal foldexpr=getline(v:lnum)=~'^\\(gist:\\\|more\\)'?'>1':'=' + setlocal foldtext=getline(v:foldstart) +endfunction + +function! s:GistGetFileName(gistid) + let url = 'https://gist.github.com/'.a:gistid + let res = system('curl -s '.g:gist_curl_options.' '.url) + let res = substitute(res, '^.*<a href="/raw/[^"]\+/\([^"]\+\)".*$', '\1', '') + if res =~ '/' + return '' + else + return res + endif +endfunction + +function! s:GistDetectFiletype(gistid) + let url = 'https://gist.github.com/'.a:gistid + let mx = '^.*<div class=".\{-}type-\([^"]\+\)">.*$' + let res = system('curl -s '.g:gist_curl_options.' '.url) + let res = substitute(matchstr(res, mx), mx, '\1', '') + let res = substitute(res, '.*\(\.[^\.]\+\)$', '\1', '') + let res = substitute(res, '-', '', 'g') + " TODO: more filetype detection that is specified in html. + if res == 'bat' | let res = 'dosbatch' | endif + if res == 'as' | let res = 'actionscript' | endif + if res == 'bash' | let res = 'sh' | endif + if res == 'cl' | let res = 'lisp' | endif + if res == 'rb' | let res = 'ruby' | endif + if res == 'viml' | let res = 'vim' | endif + if res == 'plain' || res == 'text' | let res = '' | endif + + if res =~ '^\.' + silent! exec "doau BufRead *".res + else + silent! exec "setlocal ft=".tolower(res) + endif +endfunction + +function! s:GistWrite(fname) + if substitute(a:fname, '\\', '/', 'g') == expand("%:p:gs@\\@/@") + Gist -e + else + exe "w".(v:cmdbang ? "!" : "") fnameescape(v:cmdarg) fnameescape(a:fname) + silent! exe "file" fnameescape(a:fname) + silent! au! BufWriteCmd <buffer> + endif +endfunction + +function! s:GistGet(user, token, gistid, clipboard) + let url = 'https://raw.github.com/gist/'.a:gistid + let winnum = bufwinnr(bufnr(s:bufprefix.a:gistid)) + if winnum != -1 + if winnum != bufwinnr('%') + exe winnum 'wincmd w' + endif + setlocal modifiable + else + exec 'silent split' s:bufprefix.a:gistid + endif + filetype detect + silent %d _ + exec 'silent 0r! curl -s' g:gist_curl_options url + $delete _ + setlocal buftype=acwrite bufhidden=delete noswapfile + setlocal nomodified + doau StdinReadPost <buffer> + if (&ft == '' && g:gist_detect_filetype == 1) || g:gist_detect_filetype == 2 + call s:GistDetectFiletype(a:gistid) + endif + if a:clipboard + if exists('g:gist_clip_command') + exec 'silent w !'.g:gist_clip_command + else + %yank + + endif + endif + 1 + au! BufWriteCmd <buffer> call s:GistWrite(expand("<amatch>")) +endfunction + +function! s:GistListAction() + let line = getline('.') + let mx = '^gist:\(\w\+\).*' + if line =~# mx + let gistid = substitute(line, mx, '\1', '') + call s:GistGet(g:github_user, g:github_token, gistid, 0) + return + endif + if line =~# '^more\.\.\.$' + delete + call s:GistList(b:user, b:token, b:gistls, b:page+1) + return + endif +endfunction + +function! s:GistUpdate(user, token, content, gistid, gistnm) + if len(a:gistnm) == 0 + let name = s:GistGetFileName(a:gistid) + else + let name = a:gistnm + endif + let namemx = '^[^.]\+\(.\+\)$' + let ext = '' + if name =~ namemx + let ext = substitute(name, namemx, '\1', '') + endif + let query = [ + \ '_method=put', + \ 'file_ext[gistfile1%s]=%s', + \ 'file_name[gistfile1%s]=%s', + \ 'file_contents[gistfile1%s]=%s', + \ 'login=%s', + \ 'token=%s', + \ ] + let squery = printf(join(query, '&'), + \ s:encodeURIComponent(ext), s:encodeURIComponent(ext), + \ s:encodeURIComponent(ext), s:encodeURIComponent(name), + \ s:encodeURIComponent(ext), s:encodeURIComponent(a:content), + \ s:encodeURIComponent(a:user), + \ s:encodeURIComponent(a:token)) + unlet query + + let file = tempname() + call writefile([squery], file) + echon 'Updating it to gist... ' + let quote = &shellxquote == '"' ? "'" : '"' + let url = 'https://gist.github.com/gists/'.a:gistid + let res = system('curl -i '.g:gist_curl_options.' -d @'.quote.file.quote.' '.url) + call delete(file) + let headers = split(res, '\(\r\?\n\|\r\n\?\)') + let location = matchstr(headers, '^Location: ') + let location = substitute(location, '^[^:]\+: ', '', '') + if len(location) > 0 && location =~ '^\(http\|https\):\/\/gist\.github\.com\/' + setlocal nomodified + redraw + echo 'Done: '.location + else + let message = matchstr(headers, '^Status: ') + let message = substitute(message, '^[^:]\+: [0-9]\+ ', '', '') + echohl ErrorMsg | echomsg 'Edit failed: '.message | echohl None + endif + return location +endfunction + +function! s:GistGetPage(url, user, param, opt) + if !isdirectory(g:gist_cookie_dir) + call mkdir(g:gist_cookie_dir, 'p') + endif + let cookie_file = g:gist_cookie_dir.'/github' + + if len(a:url) == 0 + call delete(cookie_file) + return + endif + + let quote = &shellxquote == '"' ? "'" : '"' + if !filereadable(cookie_file) + let password = inputsecret('Password:') + if len(password) == 0 + echo 'Canceled' + return + endif + let url = 'https://gist.github.com/login?return_to=gist' + let res = system('curl -L -s '.g:gist_curl_options.' -c '.quote.cookie_file.quote.' '.quote.url.quote) + let token = substitute(res, '^.* name="authenticity_token" type="hidden" value="\([^"]\+\)".*$', '\1', '') + + let query = [ + \ 'authenticity_token=%s', + \ 'login=%s', + \ 'password=%s', + \ 'return_to=gist', + \ 'commit=Log+in', + \ ] + let squery = printf(join(query, '&'), + \ s:encodeURIComponent(token), + \ s:encodeURIComponent(a:user), + \ s:encodeURIComponent(password)) + unlet query + + let file = tempname() + let command = 'curl -s '.g:gist_curl_options.' -i' + let command .= ' -b '.quote.cookie_file.quote + let command .= ' -c '.quote.cookie_file.quote + let command .= ' '.quote.'https://gist.github.com/session'.quote + let command .= ' -d @' . quote.file.quote + call writefile([squery], file) + let res = system(command) + call delete(file) + let res = matchstr(split(res, '\(\r\?\n\|\r\n\?\)'), '^Location: ') + let res = substitute(res, '^[^:]\+: ', '', '') + if len(res) == 0 + call delete(cookie_file) + return '' + endif + endif + let command = 'curl -s '.g:gist_curl_options.' -i '.a:opt + if len(a:param) + let command .= ' -d '.quote.a:param.quote + endif + let command .= ' -b '.quote.cookie_file.quote + let command .= ' '.quote.a:url.quote + let res = iconv(system(command), "utf-8", &encoding) + let pos = stridx(res, "\r\n\r\n") + if pos != -1 + let content = res[pos+4:] + else + let pos = stridx(res, "\n\n") + let content = res[pos+2:] + endif + return { + \ "header" : split(res[0:pos], '\r\?\n'), + \ "content" : content + \} +endfunction + +function! s:GistDelete(user, token, gistid) + echon 'Deleting gist... ' + let res = s:GistGetPage('https://gist.github.com/'.a:gistid, a:user, '', '') + if (!len(res)) + echohl ErrorMsg | echomsg 'Wrong password? no response received from github trying to delete ' . a:gistid | echohl None + return + endif + let mx = '^.* name="authenticity_token" type="hidden" value="\([^"]\+\)".*$' + let token = substitute(matchstr(res.content, mx), mx, '\1', '') + if len(token) > 0 + let res = s:GistGetPage('https://gist.github.com/delete/'.a:gistid, a:user, '_method=delete&authenticity_token='.token, '') + if len(res.content) > 0 + redraw + echo 'Done: ' + else + let message = matchstr(res.header, '^Status: ') + let message = substitute(message, '^[^:]\+: [0-9]\+ ', '', '') + echohl ErrorMsg | echomsg 'Delete failed: '.message | echohl None + endif + else + echohl ErrorMsg | echomsg 'Delete failed' | echohl None + endif +endfunction + + +" GistPost function: +" Post new gist to github +" +" if there is an embedded gist url or gist id in your file, +" it will just update it. +" -- by c9s +" +" embedded gist url format: +" +" Gist: https://gist.github.com/123123 +" +" embedded gist id format: +" +" GistID: 123123 +" +function! s:GistPost(user, token, content, private) + + " find GistID: in content, then we should just update + for l in split(a:content, "\n") + if l =~ '\<GistID:' + let gistid = matchstr(l, 'GistID:\s*[0-9a-z]\+') + + if strlen(gistid) == 0 + echohl WarningMsg | echo "GistID error" | echohl None + return + endif + echo "Found GistID: " . gistid + + cal s:GistUpdate(a:user, a:token, a:content, gistid, '') + return + elseif l =~ '\<Gist:' + let gistid = matchstr(l, 'Gist:\s*https://gist.github.com/[0-9a-z]\+') + + if strlen(gistid) == 0 + echohl WarningMsg | echo "GistID error" | echohl None + return + endif + echo "Found GistID: " . gistid + + cal s:GistUpdate(a:user, a:token, a:content, gistid, '') + return + endif + endfor + + let ext = expand('%:e') + let ext = len(ext) ? '.'.ext : '' + let name = expand('%:t') + + let query = [ + \ 'file_ext[gistfile1]=%s', + \ 'file_name[gistfile1]=%s', + \ 'file_contents[gistfile1]=%s', + \ ] + + if len(a:user) > 0 && len(a:token) > 0 + call add(query, 'login=%s') + call add(query, 'token=%s') + else + call add(query, '%.0s%.0s') + endif + + if a:private + call add(query, 'action_button=private') + endif + let squery = printf(join(query, '&'), + \ s:encodeURIComponent(ext), + \ s:encodeURIComponent(name), + \ s:encodeURIComponent(a:content), + \ s:encodeURIComponent(a:user), + \ s:encodeURIComponent(a:token)) + unlet query + + let file = tempname() + call writefile([squery], file) + echon 'Posting it to gist... ' + let quote = &shellxquote == '"' ? "'" : '"' + let url = 'https://gist.github.com/gists' + let res = system('curl -i '.g:gist_curl_options.' -d @'.quote.file.quote.' '.url) + call delete(file) + let headers = split(res, '\(\r\?\n\|\r\n\?\)') + let location = matchstr(headers, '^Location: ') + let location = substitute(location, '^[^:]\+: ', '', '') + if len(location) > 0 && location =~ '^\(http\|https\):\/\/gist\.github\.com\/' + redraw + echo 'Done: '.location + else + let message = matchstr(headers, '^Status: ') + let message = substitute(message, '^[^:]\+: [0-9]\+ ', '', '') + echohl ErrorMsg | echomsg 'Post failed: '.message | echohl None + endif + return location +endfunction + +function! s:GistPostBuffers(user, token, private) + let bufnrs = range(1, bufnr("$")) + let bn = bufnr('%') + let query = [] + if len(a:user) > 0 && len(a:token) > 0 + call add(query, 'login=%s') + call add(query, 'token=%s') + else + call add(query, '%.0s%.0s') + endif + if a:private + call add(query, 'action_button=private') + endif + let squery = printf(join(query, "&"), + \ s:encodeURIComponent(a:user), + \ s:encodeURIComponent(a:token)) . '&' + + let query = [ + \ 'file_ext[gistfile]=%s', + \ 'file_name[gistfile]=%s', + \ 'file_contents[gistfile]=%s', + \ ] + let format = join(query, "&") . '&' + + let index = 1 + for bufnr in bufnrs + if !bufexists(bufnr) || buflisted(bufnr) == 0 + continue + endif + echo "Creating gist content".index."... " + silent! exec "buffer!" bufnr + let content = join(getline(1, line('$')), "\n") + let ext = expand('%:e') + let ext = len(ext) ? '.'.ext : '' + let name = expand('%:t') + let squery .= printf(substitute(format, 'gistfile', 'gistfile'.index, 'g'), + \ s:encodeURIComponent(ext), + \ s:encodeURIComponent(name), + \ s:encodeURIComponent(content)) + let index = index + 1 + endfor + silent! exec "buffer!" bn + + let file = tempname() + call writefile([squery], file) + echo "Posting it to gist... " + let quote = &shellxquote == '"' ? "'" : '"' + let url = 'https://gist.github.com/gists' + let res = system('curl -i '.g:gist_curl_options.' -d @'.quote.file.quote.' '.url) + call delete(file) + let res = matchstr(split(res, '\(\r\?\n\|\r\n\?\)'), '^Location: ') + let res = substitute(res, '^.*: ', '', '') + if len(res) > 0 && res =~ '^\(http\|https\):\/\/gist\.github\.com\/' + redraw + echo 'Done: '.res + else + echohl ErrorMsg | echomsg 'Post failed' | echohl None + endif + return res +endfunction + +function! Gist(line1, line2, ...) + if !exists('g:github_user') + let g:github_user = substitute(system('git config --global github.user'), "\n", '', '') + if strlen(g:github_user) == 0 + let g:github_user = $GITHUB_USER + end + endif + if !exists('g:github_token') + let g:github_token = substitute(system('git config --global github.token'), "\n", '', '') + if strlen(g:github_token) == 0 + let g:github_token = $GITHUB_TOKEN + end + endif + if strlen(g:github_user) == 0 || strlen(g:github_token) == 0 + echohl ErrorMsg + echomsg "You have no setting for github." + echohl WarningMsg + echo "git config --global github.user your-name" + echo "git config --global github.token your-token" + echo "or set g:github_user and g:github_token in your vimrc" + echo "or set shell env vars GITHUB_USER and GITHUB_TOKEN" + echohl None + return 0 + end + + let bufname = bufname("%") + let user = g:github_user + let token = g:github_token + let gistid = '' + let gistls = '' + let gistnm = '' + let private = g:gist_private + let multibuffer = 0 + let clipboard = 0 + let deletepost = 0 + let editpost = 0 + let listmx = '^\(-l\|--list\)\s*\([^\s]\+\)\?$' + let bufnamemx = '^' . s:bufprefix .'\([0-9a-f]\+\)$' + + let args = (a:0 > 0) ? split(a:1, ' ') : [] + for arg in args + if arg =~ '^\(-la\|--listall\)$\C' + let gistls = '-all' + elseif arg =~ '^\(-l\|--list\)$\C' + if g:gist_show_privates + let gistls = 'mine' + else + let gistls = g:github_user + endif + elseif arg == '--abandon\C' + call s:GistGetPage('', '', '', '') + return + elseif arg =~ '^\(-m\|--multibuffer\)$\C' + let multibuffer = 1 + elseif arg =~ '^\(-p\|--private\)$\C' + let private = 1 + elseif arg =~ '^\(-P\|--public\)$\C' + let private = 0 + elseif arg =~ '^\(-a\|--anonymous\)$\C' + let user = '' + let token = '' + elseif arg =~ '^\(-c\|--clipboard\)$\C' + let clipboard = 1 + elseif arg =~ '^\(-d\|--delete\)$\C' && bufname =~ bufnamemx + let deletepost = 1 + let gistid = substitute(bufname, bufnamemx, '\1', '') + elseif arg =~ '^\(-e\|--edit\)$\C' && bufname =~ bufnamemx + let editpost = 1 + let gistid = substitute(bufname, bufnamemx, '\1', '') + elseif arg =~ '^\(-f\|--fork\)$\C' && bufname =~ bufnamemx + let gistid = substitute(bufname, bufnamemx, '\1', '') + let res = s:GistGetPage("https://gist.github.com/fork/".gistid, g:github_user, '', '') + let loc = filter(res.header, 'v:val =~ "^Location:"')[0] + let loc = substitute(loc, '^[^:]\+: ', '', '') + let mx = '^https://gist.github.com/\([0-9a-z]\+\)$' + if loc =~ mx + let gistid = substitute(loc, mx, '\1', '') + else + echohl ErrorMsg | echomsg 'Fork failed' | echohl None + return + endif + elseif arg !~ '^-' && len(gistnm) == 0 + if editpost == 1 || deletepost == 1 + let gistnm = arg + elseif len(gistls) > 0 && arg != '^\w\+$\C' + let gistls = arg + elseif arg =~ '^[0-9a-z]\+$\C' + let gistid = arg + else + echohl ErrorMsg | echomsg 'Invalid arguments' | echohl None + unlet args + return 0 + endif + elseif len(arg) > 0 + echohl ErrorMsg | echomsg 'Invalid arguments' | echohl None + unlet args + return 0 + endif + endfor + unlet args + "echo "gistid=".gistid + "echo "gistls=".gistls + "echo "gistnm=".gistnm + "echo "private=".private + "echo "clipboard=".clipboard + "echo "editpost=".editpost + "echo "deletepost=".deletepost + + if len(gistls) > 0 + call s:GistList(user, token, gistls, 1) + elseif len(gistid) > 0 && editpost == 0 && deletepost == 0 + call s:GistGet(user, token, gistid, clipboard) + else + let url = '' + if multibuffer == 1 + let url = s:GistPostBuffers(user, token, private) + else + let content = join(getline(a:line1, a:line2), "\n") + if editpost == 1 + let url = s:GistUpdate(user, token, content, gistid, gistnm) + elseif deletepost == 1 + call s:GistDelete(user, token, gistid) + else + let url = s:GistPost(user, token, content, private) + endif + endif + if len(url) > 0 + if g:gist_open_browser_after_post + let cmd = substitute(g:gist_browser_command, '%URL%', url, 'g') + if cmd =~ '^!' + silent! exec cmd + elseif cmd =~ '^:[A-Z]' + exec cmd + else + call system(cmd) + endif + endif + if g:gist_put_url_to_clipboard_after_post > 0 + if g:gist_put_url_to_clipboard_after_post == 2 + let url = url . "\n" + endif + if exists('g:gist_clip_command') + call system(g:gist_clip_command, url) + elseif has('unix') && !has('xterm_clipboard') + let @" = url + else + let @+ = url + endif + endif + endif + endif + return 1 +endfunction + +command! -nargs=? -range=% Gist :call Gist(<line1>, <line2>, <f-args>) +" vim:set et: |