Vim から Outputz に文字数を投げる

EmacsからOutputzに文字数を投げる - antipop

Outputz の流れに乗りたかったので、vim 用のプラグインを作ってみました。


さきほどプラグイン検索してみると、Outputz 用のプラグインが登録されていました。
outputz - outputz interface for Vim : vim online


でも、一応公開しておきます。文字数のカウントと HTTP 通信は Ruby でやっています。

まぁ、注意点は、

  • どのファイルに対してもカウントするので、ファイルサイズの大きいものを読み込んでしまうと遅くなってしまうかも
  • URI のデフォルト値は "http://localhost/vim"。集計したときに分かりづらい
  • Windows でしか動作確認をしていない

なところ。

" vim: set sts=2 sw=2
" vim:fdm=marker
"
" Outputz for vim plugin
"
" Maintainer:  gtaka555
" Last Modify: 2008-11-22
" Since:       2008-11-22
" Version:     0.0.1
"

if exists("b:outputz_plugin")
  finish
endif
let b:outputz_plugin = 1


" valuables : {{{1
if !exists('g:outputz_key')
  finish
endif

if !exists('g:outputz_uri')
  let g:outputz_uri = 'http://localhost/vim/'
endif
" }}}

" autocommands : {{{1
au BufNewFile,BufReadPost * :call <SID>Init()
au BufWritePost * :call <SID>ReCalc()
" }}}

" commands : {{{1
command! OutputzWc call <SID>CountChar()
" }}}

" functions : {{{1
func! s:Init()
  let b:file_size = s:CountChar()
endfun

func! s:ReCalc()
  let s:new_file_size = s:CountChar()

  if s:new_file_size > b:file_size
    call s:Send(s:new_file_size - b:file_size)
  endif

  let b:file_size = s:new_file_size
endfun

func! s:Send(size)

  " TODO: 
  let s:cmd = "ruby -e \""
  let s:cmd = s:cmd . "key='" . g:outputz_key . "';size='" . a:size . "';uri='" . g:outputz_uri . "';"
" let s:cmd = s:cmd . "require 'net/http'; Net::HTTP.start('localhost', 8080)"
  let s:cmd = s:cmd . "require 'net/http'; Net::HTTP.start('outputz.com', 80)"
  let s:cmd = s:cmd . "{|http| response = http.post('/api/post',"
  let s:cmd = s:cmd . "'key='+URI.encode(key)+'&uri='+URI.encode(uri)+'&size='+URI.encode(size));"
  let s:cmd = s:cmd . "puts response.code }\""

" echo s:cmd
  silent call system(s:cmd)

  return
endfun

fun! s:CountChar()
  let s:total = 0

  if has('ruby')
ruby << RUBY_SRC
    # TODO:
    $KCODE = 'SJIS'

    total = 0

    cb = VIM::Buffer.current
    (1..cb.count).each do |i|
      total = total + cb[i].split(//).size
    end

#   puts "#{total}"
    VIM::command("let s:total = #{total}")
RUBY_SRC
  endif
" echo s:total

  return s:total
endfun
" }}}