2010/09/02

Recent entries from same category

  1. VimConf 2023 Tiny に参加しました
  2. Vim で Go 言語を書くために行った引越し作業 2020年度版
  3. Vim をモダンな IDE に変える LSP の設定
  4. ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版
  5. VimConf 2019 を終えて

RubyKaigiの一部として開催されてVimKaigi、なかなか面白そうでした。
Vimmerもだんだん増えてきました。plugin使ってる人も多い様です。実は私はあまりpluginの使用に依存しない様に心がけていたりするんですが、中にどうしても手放せない物があり、その中の一つがquickrun.vimだったりします。
thinca's vim-quickrun at master - GitHub

Run commands quickly.

http://github.com/thinca/vim-quickrun
ちなみにtwitterでquickrun.vimを検索すると結構出てきます。 さて、私が使っているWindows環境にはpythonが数バージョン入っていて、あえてどれにもPATHを通していなかったりします。にも関わらず起動したvimから何時もの癖でquickrunを実行し、悲しい事になったりしました。
んー。これは私の環境が変わってるからなんだけど、もっと手軽に、もっとquickにすることは出来ないか...と30秒程度考え、思いついた時には既に「quickdan.vim」というファイルを書き始めていました。

if &cp || (exists('g:loaded_quickdan_vim') && g:loaded_quickdan_vim)
  finish
endif
let g:loaded_quickdan_vim = 1

function! s:quickdanLang(vimLang)
  let l:filetypeMap = {
  \  'perl': 'pl',
  \  'perl6': 'p6',
  \  'awk': 'awk',
  \  'basic': 'bas',
  \  'brainfuck': 'bf',
  \  'c': 'c',
  \  'elisp': 'el',
  \  'lisp': 'lsp',
  \  'scheme': 'scm',
  \  'haskell': 'hs',
  \  'io': 'io',
  \  'javascript': 'js',
  \  'lua': 'lua',
  \  'm4': 'm4',
  \  'ocaml': 'ml',
  \  'php': 'php',
  \  'python': 'py',
  \  'python3': 'py3',
  \  'ruby': 'rb',
  \  'ruby19': 'rb19',
  \  'postscript': 'ps',
  \  'tcl': 'tcl',
  \}
  return get(l:filetypeMap, a:vimLang, 'auto')
endfunction

function! s:nr2byte(nr)
  if a:nr < 0x80
    return nr2char(a:nr)
  elseif a:nr < 0x800
    return nr2char(a:nr/64+192).nr2char(a:nr%64+128)
  else
    return nr2char(a:nr/4096%16+224).nr2char(a:nr/64%64+128).nr2char(a:nr%64+128)
  endif
endfunction

function! s:nr2enc_char(charcode)
  if &encoding == 'utf-8'
    return nr2char(a:charcode)
  endif
  let char = s:nr2byte(a:charcode)
  if strlen(char) > 1
    let char = strtrans(iconv(char, 'utf-8', &encoding))
  endif
  return char
endfunction

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 .= ch
    elseif ch == ' '
      let outstr .= '+'
    else
      let outstr .= '%' . substitute('0' . s:nr2hex(char2nr(ch)), '^.*\(..\)$', '\1', '')
    endif
    let i = i + 1
  endwhile
  return outstr
endfunction

function! s:item2query(items, sep)
  let ret = ''
  if type(a:items) == 4
    for key in keys(a:items)
      if strlen(ret) | let ret .= a:sep | endif
      let ret .= key . "=" . s:encodeURIComponent(a:items[key])
    endfor
  elseif type(a:items) == 3
    for item in a:items
      if strlen(ret) | let ret .= a:sep | endif
      let ret .= item
    endfor
  else
    let ret = a:items
  endif
  return ret
endfunction

function! s:doHttp(url, getdata, postdata, cookie, returnheader)
  let url = a:url
  let getdata = s:item2query(a:getdata, '&')
  let postdata = s:item2query(a:postdata, '&')
  let cookie = s:item2query(a:cookie, '; ')
  if strlen(getdata)
    let url .= "?" . getdata
  endif
  let command = "curl -s -k"
  if a:returnheader
    let command .= " -i"
  endif
  if strlen(cookie)
    let command .= " -H \"Cookie: " . cookie . "\""
  endif
  let command .= " \"" . url . "\""
  if strlen(postdata)
    let file = tempname()
    exec 'redir! > '.file
    silent echo postdata
    redir END
    let quote = &shellxquote == '"' ?  "'" : '"'
    let res = system(command . " -d @" . quote.file.quote)
    call delete(file)
  else
    let res = system(command)
  endif
  return res
endfunction

function! s:quickdan(src)
  let url = 'http://api.dan.co.jp/lleval.cgi'
  let res = s:doHttp(url, { 's': a:src, 'c': '', 'l': s:quickdanLang(&ft) }, {}, {}, 0)
  try
    return eval(iconv(res, "utf-8", &encoding))
  catch
    return { 'stdout': '', 'stderr': 'unkonwn error(maybe timeout)' }
  endtry
endfunction

function! g:QuickDan()
  let src = join(getline('0', '$'), "\n")
  let res = s:quickdan(src)
  echohl WarningMsg
  echo res['stderr']
  echohl None
  echo res['stdout']
endfunction

command! QuickDan call g:QuickDan()
qist: 557424 - Github
使い方はquickrunとあまり変わりません。curlさえ入っていればperl/perl6/awk/basic/branfuck/c/elips/lisp/scheme/haskell/io/javascript/lua/m4/ocaml/php/python/python3/ruby/ruby19/postscript/tclが実行出来ます。なおかつどんなに危ないコードを書いても自分のPCが壊れる心配はありません。まぁなんて便利。
中身はDankogaiさんのllevalを使ってます。まぁAPIとして公開されておられるので、いいかな...と思ったり(まずかったらご指摘下さい)。
名前もパクリ度80%程度にquickdan.vimとしました。お役立て下さい。
Posted at by | Edit