TokyoVim#17に行ってきた

久しぶりにTokyoVimに行ってきました。
今回は#17でした。

内容はいつも通りのもくもく会
今まで何かと忙しくて去年作ったままほったらかしになっていた
translategoogle.vimをようやく修正することができました。


まず直したのは:TranslateGoogleCmdのオプション補完。
このプラグインではVitalのOptionParserを使って引数の解析をしていたのですが、
少し前にLinda_ppさんが補完もできるようにしてくれたのでその対応をしました。

既に組み込まれているVitalは古いバージョンなので以下コマンドでVitalを更新します。

" プラグインのあるディレクトリで実行する場合はtarget-dirに"."を指定
:Vitalize --name=translategoogle . Vim.BufferManager Vim.Message Web.HTTP Web.HTML OptionParser

" 更新の場合はmoduleの指定は省略可(@haya14busaさんに教えていただきました)
:Vitalize --name=translategoogle . 

これでOptionParserの新しい機能を使う準備ができました。

実際にオプション補完をするにはcommandの-completeに
オプション補完用の関数を指定するだけです。

let s:V = vital#of('translategoogle')
let s:OptionParser = s:V.import('OptionParser')

let s:parser = s:OptionParser.new()
call s:parser.on('--sl=VALUE', 'source language')
call s:parser.on('--tl=VALUE', 'target language')
call s:parser.on('--ie=VALUE', 'input encoding')
call s:parser.on('--oe=VALUE', 'outout encoding')

" 新たに追加した関数
function! translategoogle#complete_command(arglead, cmdline, cursorpos)
    return s:parser.complete(a:arglead, a:cmdline, a:cursorpos)
endfunction

" -completeにcustomlist,translategoogle#complete_commandを追加
command! -nargs=* -complete=customlist,translategoogle#complete_command
            \ TranslateGoogleCmd echo translategoogle#command(<q-args>)

以下のように"--"まで入力した後にTabキーを押すと

:TranslateGoogleCmd --

補完候補に

--tl=, --oe=, --ie=, --sl=

が出てくるようになりました。

ただ、これだけではオプションに指定する値は補完できないのでもう少し修正します。

" オプション値の補完候補
let g:translategoogle_languages =
            \ get(g:, 'translategoogle_languages', ['ja', 'en'])

" オプション値の補完に使用する関数
function! s:complete_language(optlead, cmdline, cursorpos)
    return filter(copy(g:translategoogle_languages),
                \ 'a:optlead == "" ? 1 : (v:val =~# a:optlead)')
endfunction

" --slと--tlにオプション補完関数を指定
call s:parser.on('--sl=VALUE', 'source language', {'completion': function('s:complete_language')})
call s:parser.on('--tl=VALUE', 'target language', {'completion': function('s:complete_language')})

これで

:TranslateGoogleCmd --sl=

の後にTabを押すと

--sl=ja, ==sl=en

が補完されるようになりました。

また、OptionParserはデフォルトで"--help"というオプションが用意されているため、

:TranslateGoogleCmd --help

として実行すると

Options:
  --tl=VALUE : target language
  --oe=VALUE : outout encoding
  --ie=VALUE : input encoding
  --sl=VALUE : source language

のようなヘルプを表示することができます。

この時、ヘルプを表示しても:TranslateGoogleCmd自体の実行は終了しないため、
処理を止めたい場合は

function! translategoogle#command(args)
    let args = s:parser.parse(a:args)
    if exists('args.help')
        return ''
    endif

    " 処理はこの下で行う
    " ...

endfunction

のようにして関数をreturnさせてあげる必要があります。


他には翻訳用バッファでInsertLeaveやTextChangedイベントが発生すると
すぐに翻訳を始めてしまうので、有効/無効を切り替えるコマンドや

" autocmdでの自動翻訳を有効化
:TranslateGoogleEnableAutoUpdate

" autocmdでの自動翻訳を無効化
:TranslateGoogleDisableAutoUpdate

翻訳用バッファをまとめて閉じるためのキーマッピングの設定

" デフォルトは'q'、''を指定するとマッピングをしない
let g:translategoogle_mapping_close = 'q'

を追加しました。


そして致命的だった、特定の文字列を翻訳すると
エラーが発生してしまう問題を修正しました。


とりあえず自分が普段使う分には良さそうな感じです。
daisuzu/translategoogle.vim · GitHub


なお、オプションの補完で使用している

function('s:complete_language')

は古いVimだと使えないようなので注意してください。
http://lingr.com/room/vim/archives/2014/03/15#message-18588733