Vimから翻訳をしたい

というわけでLet's translategoogle.vim!

このプラグインをインストールすると以下のコマンドが使えるようになります。

:TranslateGoogle
:TranslateGoogleCmd

:TranslateGoogleを実行すると翻訳用のバッファが開き、

f:id:daisuzu:20131222151409p:plain

beforeバッファに入力した内容が翻訳されます。

f:id:daisuzu:20131222151442p:plain

beforeバッファで:TranslateGoogleEnableRetranslateを実行すると
翻訳後のバッファが再翻訳されます。

f:id:daisuzu:20131222151637p:plain

デフォルトでは英語から日本語への翻訳になっているので
変更する場合はvimrcに以下の設定を追加しておきます。

let g:translategoogle_default_sl = 'ja'
let g:translategoogle_default_tl = 'en'

コマンドから翻訳する場合は以下のように実行します。

:TranslateGoogleCmd --sl=ja --tl=en ダークビムマスター

'--sl'と'--tl'を指定しなかった場合はVim起動時の設定が使われます。

もっと詳しい使い方はドキュメントを参照といいたいところですが、
ほとんど書けていないのでソース参照といったところですかねぇ...

今思いつくTODO:

  • ドキュメントをもっと書く(コマンドの説明とか関数の説明とか)
  • :TranslateGoogleの翻訳が遅いことがあるので直す(InsertLeaveとTextChangedが両方発動する)
  • :TranslateGoogleの複数起動(:TranslateGoogleNewとか)
  • :TranslateGoogleCmdの-completeを作る

Fabricで最新のVimをバラまく

Vim Advent Calendar 2013の8日目の記事です。
昨日は@mattn_jpさんのVim script は人々の生活を豊かにしなければならないッ!でした。


以下のような開発環境で作業をするとき、ちょっとした編集なら特に困ることもないのですが、
バリバリとコードを書くとなるとさすがに素のVimは不便で困っていました。

f:id:daisuzu:20131207235804p:plain

最初はvimrcだけ転送したりとか、特定のプラグインだけを転送して使っていましたが、
色々と面倒になってしまったので、もうVim環境をまるごと転送してしまうことにしました。

Vim環境を作るのに用意したのは開発環境と同じOSの仮想マシンです。

f:id:daisuzu:20131207235822p:plain

この仮想マシン

をしたら.tar.gzとかで固めてまるっと開発環境にばらまきます。

ただ、毎回手作業をするとなるとそのうちやらなくなってしまうので
Fabricさんにやってもらいましょう。

# -*- coding: utf-8 -*-
""" fabfile for vim. """

from fabric.api import (
    run,
    get,
    put,
    cd,
    hosts,
)

# Vimのソースコードをhg cloneした場所
VIM_SRC = '~/src/vim'

# Vimのインストール先
VIM_PATH = '$HOME/work/daisuzu/local'

# vimrcをgit cloneした場所
VIMRC_PATH = '~/work/daisuzu/.vim/dotvim'

# 最初に読み込むvimrc
MYVIMRC = '~/work/daisuzu/vimrc'

# 作成したしたVim環境の格納場所
VIM_ARCHIVE = './work/daisuzu'

# Vimをビルドする際に設定する環境変数
env_export = [
    {'vi_cv_path_python3':
        '$HOME/.pyenv/versions/3.3.2/bin/python3'},
]
env_str = ' && '.join(
    [
        'export {key}={value}'.format(
            key=x.keys()[0],
            value=x.values()[0])
        for x in env_export
    ]
)

# Vimの./configureのオプション
config = [
    {'with-features':
        'huge'},
    {'enable-multibyte':
        ''},
    {'enable-gui':
        'gtk2'},
    {'enable-rubyinterp':
        'dynamic'},
    {'enable-pythoninterp':
        'dynamic'},
    {'with-python-config-dir':
        '$HOME/.pyenv/versions/2.7.5/lib/python2.7/config'},
    {'enable-python3interp':
        'dynamic'},
    {'with-python3-config-dir':
        '$HOME/.pyenv/versions/3.3.2/lib/python3.3/config-3.3m'},
    {'enable-perlinterp':
        'dynamic'},
    {'enable-luainterp':
        'dynamic'},
    {'with-luajit':
        ''},
    {'with-lua-prefix':
        '$HOME/.luaenv/versions/luajit-2.0.1-p1'},
    {'enable-gpm':
        ''},
    {'enable-xim':
        ''},
    {'enable-cscope':
        ''},
    {'enable-fontset':
        ''},
    {'with-compiledby':
        '"daisuzu <daisuzu@gmail.com>"'},
    {'prefix':
        '$HOME/work/daisuzu/local'},
]
config_str = ' '.join(
    [
        '--{key}{value}'.format(
            key=x.keys()[0],
            value='=' + x.values()[0] if x.values()[0] else '')
        for x in config
    ]
)


@hosts(['centos6'])
def build():
    """ build vim. """

    with cd(VIM_SRC):
        result = run('hg incoming', warn_only=True)
        if not result.return_code:
            # 新しいパッチが来ていたらVimをビルドする
            run('hg pull')
            run('hg update')
            run('make distclean')
            run(
                '{env} && {cmd} {arg}'.format(
                    env=env_str,
                    cmd='./configure',
                    arg=config_str
                )
            )
            run('make')
            run('sudo /usr/local/bin/paco -D make install')

    # vimrcを更新する
    with cd(VIMRC_PATH):
        run('git pull --rebase')

    # プラグインを更新する
    run(
        '{vim} {opt} {so_cmd} {update_cmd} --cmd qall'.format(
            vim=VIM_PATH + '/bin/vim',
            opt='-N -u NONE -i NONE -V1 -e -s',
            so_cmd='--cmd "source ' + MYVIMRC + '"',
            update_cmd='--cmd NeoBundleUpdate'
        ),
        warn_only=True
    )

    # Vim環境とif_xxxに必要な環境を圧縮する
    run('tar zcvf dotvim.tar.gz --exclude .git ' + VIM_ARCHIVE)
    run('tar zcvf dotenv.tar.gz --exclude .git .luaenv .pyenv .plenv .rbenv')

    # ローカルマシンに一旦コピー
    get('dotenv.tar.gz', '/home/daisuzu/tmp/dotfiles/dotenv.tar.gz')
    get('dotvim.tar.gz', '/home/daisuzu/tmp/dotfiles/dotvim.tar.gz')


@hosts(['relay-host00'])
def dist():
    """ dist vim. """

    # Vimをバラまくホストたち
    target_hosts = [
        'target-host01',
        'target-host02',
    ]

    # まずは踏み台ホストにファイルをコピー
    put('/home/daisuzu/tmp/dotfiles/dotenv.tar.gz', 'dotfiles/dotenv.tar.gz')
    put('/home/daisuzu/tmp/dotfiles/dotvim.tar.gz', 'dotfiles/dotvim.tar.gz')

    # 対象のホストに一式をコピーしてから展開する
    for h in target_hosts:
        run(
            '{scp} {file} {host}:{dst}'.format(
                scp='myscp',
                file='dotfiles/dotenv.tar.gz',
                host=h,
                dst='work/daisuzu/dotfiles'
            )
        )

        run(
            '{scp} {file} {host}:{dst}'.format(
                scp='myscp',
                file='dotfiles/dotvim.tar.gz',
                host=h,
                dst='work/daisuzu/dotfiles'
            )
        )

        run(
            '{ssh} {host} "{cmd}"'.format(
                ssh='myssh',
                host=h,
                cmd='tar zxvf work/daisuzu/dotfiles/dotenv.tar.gz'
            )
        )

        run(
            '{ssh} {host} "{cmd}"'.format(
                ssh='myssh',
                host=h,
                cmd='tar zxvf work/daisuzu/dotfiles/dotvim.tar.gz'
            )
        )

FabricにしたのはChefとかAnsibleだと踏み台ホストで動かすことができなかったからです。

このfabfileでは以下の環境で動作することを想定しています。

[~/]
+ .luaenv/      ==> luajit-2.0.1-p1がインストール済
+ .plenv/       ==> 5.18.0がインストール済
+ .pyenv/       ==> 2.7.5と3.3.2がインストール済
+ .rbenv/       ==> 1.9.3-p448がインストール済
- src/
 |+ vim/        ==> hg clone https://code.google.com/p/vim/
- work/
 |- daisuzu/
  |- .vim
   |+ Bundle/   ==> neobundle#rcするディレクトリ
   |- dotvim/   ==> git clone git://github.com/daisuzu/dotvim
    |  .vimrc
  |- local/     ==> ビルドしたVimはここにインストールされる
   |- bin/
    |  vim
   |+ share/
  |  vimrc      ==> このvimrcから~/work/daisuzu/.vim/dotvim/.vimrcを読み込む

開発環境は同じユーザに複数人がログインして使うことがあるため、
標準のVimには一切影響を与えないようにしています。

そのため、新たにインストールしたVim

$ ~/work/daisuzu/local/bin/vim -u ~/work/daisuzu/vimrc

として実行するかaliasに設定してあげる必要があります。


あとは気が向いたタイミングでこのfabfile.pyを叩くなりcronで回すなりすれば
Vim環境をアップデートすることができます。

ね、簡単でしょう?


なんでわざわざこんなことをするかって!?
そんなのよく使うプラグインがより速く、より強くとif_luaを...
な なにをする そのまさかー!
He has turned to the dark side.


明日は@Linda_ppさんです。

VimConf2013に行ってきた

昨日(11/16)はVimConf2013に参加してきました

発表内容

  • How to suggest new features for Vim(by @kaoriya)

Vimは単なるテキストエディタなので新機能を取り込んでもらうにはストーリー作りが大事

  • Evil is Justice.(by @esehara)

Emacsの機能を使いたいけどVim風に編集したい時にはEvilが便利

  • How to use Git from Vim(by @c0hama)

プラグインがあってもなくてもVimからGitを使うのは便利

  • vital.ProcessManager(by @ujm)

外部プロセスとの連携にif_xxx + スレッドは危険だけどProcessManagerを使うと簡単で安全

  • Do You Know About Vim Builtin Runtime Files?(by @Linda_pp)

Vimには色々と便利なスクリプトが付属しているので「それデフォルトのVimでもできるよ!」

  • How to write patches for Vim(by @k_takata)

Vimのパッチを書くための環境を作ったら気軽にパッチを書いてみて自分だけのVimを構築しよう

  • About of neocomplete(by @ShougoMatsu)

neocomplete誕生秘話とif_luaのパフォーマンス、続きはFAQで!

スライドはそのうちVimConf2013のページにリンクされるのかな?

個人的には最近仕事でquick hack的なソリューションをボコられてしまったので
kaoriyaさんの発表がグサッときました。
そのへんも含めて色々とお話できればと思ったらほぼ猫トークで終わってしまった...

それから懇親会ではピザを食べながら他のVimmerの方々と交流したり、
Shougoさんのライブで盛り上がったり、とても楽しかったです。

ということで皆さまお疲れ様です、ありがとうございました。

momonga.vim #2に行ってきた

最近は自分のPCのvimrcを全然更新してないし、そろそろvimの勉強会が開催されないかなぁ...
と思っていたらちょうどmomonga.vim #2というイベントを発見したので行ってきました。

なんとなく早めに着いたら改札前でたまたまthincaさんとrbtnnさんを発見し、
そのままお昼に行く勢(+derisさん、2GMonさん)に混じって武蔵野プレイスのカフェへ。

カフェではパスタを食べながらVim至上主義の裏話や面接でのVimトークについて話したりしました。

そして良い時間になった頃にsupermomongaさんと合流し、会場の会議室へ。
前半はVPNに繋げていたのでインターネットの世界からは隔離されてもくもくとvimrcいじり。
後半は前から気になっていたvital.vimのBufferManagerを使ってみました。

対象はちょうどAPI絡みで修正しなければいけなかったfacebook.vimです。
それまではvital.vimのdate_time.vimというモジュールのみを使っていたんですが、
そもそもvital.vimってどうやって使うんだっけ?ってのを思い出すところからスタートでした。

幸いvital.vimはドキュメントが充実しているので:Vitalizeコマンドで
なんとか最新のDateTimeとBufferManagerをvitalizeすることができました。

" DateTimeとBufferManagerをvitalize
:Vitalize facebook.vim +DateTime +Vim.BufferManager

ただ、いつの間にかdate_time.vimはDateTime.vimになっており、
timzezoneの挙動も少し変わっていたのまずはその部分の修正から。

" 変更前(引数は省略)
s:DateTime.from_date().timezone().to_string()

" 変更後(引数は省略)
s:DateTime.from_date().to().to_string()

ようやく悲惨なコードで処理していたバッファをBufferManagerで巻き取る準備ができました。
BufferManagerの使い方はドキュメントにも書いてあるとおりで

let s:BufferManager = s:V.import('Vim.BufferManager')
let s:home_buffer = s:BufferManager.new()

" [Facebook Home]を新規タブで開く
call s:home_buffer.open('[Facebook Home]', {'opener': 'tabnew'})

とすることで簡単に使うことができました。
そんなことを言いつつ、違うところで余計なバグを仕込んでしまったりしたので
時間内ではこれ以上のことをすることができませんでした...
(バグは帰ってから直しましたが)

そんなこんなで1次会が終了し、2次会へ。
Linda_ppさんと犬トークをしたり、
t9mdさんからLearn Vimscript the Hard Wayを教わったり、
とても楽しかったです。

そんなところで今日はかなりだいぶ眠くなってしまったので
あとは他の人が補完してくれることを期待して寝ることにします。

Software Design 2013年10月号「Vimプラグインの導入」を書かせて頂きました。

タイトルはmattnさんの
Software Design 2013年10月号「生産性を向上させるVimのTips」を書かせて頂きました。
のパクりです。

Vimのプラグインというと、今も続いている
Vim Advent Calendar 2012
でだいたいは紹介されてしまっているような気がします…
が、誌面ではまだ書かれていないような内容を自分なりにまとめてみたつもりです。
(丸かぶりな記事があったらスミマセン)

ところでサポートページは明日から表示されるものだと思っていたらもうリンクがあるんですねぇ。
プラグインのサンプル設定があるので興味のある方は見てみてはいかがでしょう。

Windows7(64bit)でVirtualBox + Vagrant + veewee環境を構築した時のメモ

ちょっと前にVim7.3のパチラッシュとプラグインのif_lua化に対応するために
ゴニョゴニョしたのを(もう忘れてるかもしれないけど)忘れないうちにメモっておく。
(後半はそのうちchefとかansibleあたりでやってみたい)


まずは
WindowsでのVagrant環境構築
とか
veeweeを使ってVagrant用のboxを自分で作る方法
を参考に必要なソフト類をインストール
 

ここからダウンロードしてインストール
 

  • Vagrant

ここからダウンロードしてインストール
 

ここから2.0.0(x64版)とDevKit(mingw64-64)をダウンロードしてインストール
DevKitはC:\Ruby200-x64\dkに展開し、

> gem install bundler

でbundlerを入れる
 

  • veewee

githubから持ってきてインストール

> git clone git://github.com/jedi4ever/veewee.git
> cd veewee
> bundle install

 
準備ができたら仮想マシンを作成し、Vimをビルドする。
 

  • boxの作成
> bundle exec veewee vbox define 'CentOS-6.4-x86_64-minimal' 'CentOS-6.4-x86_64-minimal' -workdir=veeweeのパス

で設定ファイルを作成し、適宜ファイルを編集したら、

> bundle exec veewee vbox build 'CentOS-6.4-x86_64-minimal' -workdir=veeweeのパス

VirtualBox用のイメージを作成して

> bundle exec veewee vbox export 'CentOS-6.4-x86_64-minimal'

でVagrant用のイメージに変換
 
ここまではコマンドプロンプトで実行。
この後は都合によりcygwinを使う。
 

  • Vagrantに追加
vagrant box add 'CentOS-6.4-x86_64-minimal' 'イメージのあるパス'

 

  • Vagrantfileを編集
Vagrant.configure("2") do |config|
  config.vm.define :gentoo do |gentoo|
    gentoo.vm.box = "gentoo-amd64"
    gentoo.vm.network :private_network, ip: "192.168.56.101"
  end

  config.vm.define :centos64 do |centos64|
    centos64.vm.box = "CentOS-6.4-x86_64-minimal"
    centos64.vm.network :private_network, ip: "192.168.56.102"
  end
end

 

  • Vimをビルド

vagrant upするとgentoocentosが立ち上がるようになったので、
(gentooのインストールは省略)
VimをビルドしたいOSにsshで入って

# これから作成する.soのパスを追加しておく
$ echo 'export LD_LIBRARY_PATH="$HOME/.pyenv/versions/2.7.5/lib:$HOME/.pyenv/versions/3.3.2/lib:$HOME/.rbenv/versions/1.9.3-p448/lib:$HOME/.luaenv/versions/luajit-2.0.1-p1/lib:$HOME/.plenv/versions/5.18.0/lib/perl5/5.18.0/x86_64-linux-thread-multi/CORE"' >> ~/.bash_profile
$ echo '' >> ~/.bash_profile

# pyenvのインストール
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYTHON_CONFIGURE_OPTS="--enable-shared"' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ echo '' >> ~/.bash_profile

# plenvのインストール
$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(plenv init -)"' >> ~/.bash_profile
$ echo '' >> ~/.bash_profile

# rbenvのインストール
$ echo 'export RUBY_CONFIGURE_OPTS="--enable-shared"' >> ~/.bash_profile
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ echo '' >> ~/.bash_profile

# luaenvのインストール
$ git clone git://github.com/cehoffman/luaenv.git ~/.luaenv
$ git clone git://github.com/cehoffman/lua-build.git ~/.luaenv/plugins/lua-build
$ echo 'export PATH="$HOME/.luaenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(luaenv init -)"' >> ~/.bash_profile
$ echo '' >> ~/.bash_profile

# 設定した環境変数を読み込む
$ exec $SHELL -l

# Vimのif_xxx用にインストール
$ pyenv install 2.7.5
$ pyenv install 3.3.2
$ plenv install 5.18.0 -Dusethreads -Duseshrplib
$ rbenv install 1.9.3-p448
$ luaenv install luajit-2.0.1-p1

# vimをインストール
$ hg clone https://code.google.com/p/vim/
$ cd vim
$ export vi_cv_path_python3=$HOME/.pyenv/versions/3.3.2/bin/python3
$ ./configure \
    --with-features=huge \
    --enable-multibyte \
    --enable-gui=gtk2 \
    --enable-rubyinterp=dynamic \
    --enable-pythoninterp=dynamic \
    --with-python-config-dir=$HOME/.pyenv/versions/2.7.5/lib/python2.7/config \
    --enable-python3interp=dynamic \
    --with-python3-config-dir=$HOME/.pyenv/versions/3.3.2/lib/python3.3/config-3.3m \
    --enable-perlinterp=dynamic \
    --enable-luainterp=dynamic \
    --with-luajit \
    --with-lua-prefix=$HOME/.luaenv/versions/luajit-2.0.1-p1 \
    --enable-gpm \
    --enable-xim \
    --enable-cscope \
    --enable-fontset \
    --with-compiledby="daisuzu <daisuzu@gmail.com>" \
    --prefix=$HOME/local
$ make
$ make install

とするとVimとif_xxxに必要な.soが揃うので一式を.tar.gzとかで固めて
貧弱な(gitもhgもyumも使えない)環境に持っていけばOK。

TokyoVimに参加して人生が変わりました!

Vim Advent Calendar 2012の219日目の記事です。
昨日は@KSuzukiiiさんの「unite:bookmarkを使って Vimfilerをもっと快適に使う」でした。

えーと、いきなり宗教っぽいタイトルで始まっていますが…
何があったのかというと、
TokyoVimに参加して


結婚することができました!
(さっき婚姻届を提出してきました)

あ、念のため断っておくとVimと結婚したとか
TokyoVimで彼女ができたとかいう話ではありません。


な… 何を言っているのか わからねーと思うが(ry
なのでザックリと時系列に並べてみると、


TokyoVim#5に参加する(初参加!)

【中略】

TokyoVim#10に参加する

転職活動を始める

彼女ができる

退職する

婚約する

入社する

家を買う

入籍する


という感じ。

転機となったのはTokyoVimに参加して転職活動を始めたことでしょう。


実際TokyoVimに参加する前から転職について考えてみたりすることもありましたが
具体的に何かするわけでもなく、もやもやとしながら働いていました。


前職では評価系の業務が中心だったので仕事の中でコードを
書いたりといったことはあまり求められていませんでした。
(手作業がダルいので簡単なスクリプトを書く程度)


そんな職場でもVimを使っていた私は変態扱いされることもあったのですが、
TokyoVimの会場ではみんな当たり前のようにVimを使っていて(まあ当たり前ですが)
しかも皆レベルが高いことに正直焦りを感じました。


前職では課の中で最もスキルが高いとされていたのに(自分で言うのもアレですが)
一歩外に出るとハッキリ言ってただの雑魚。

このままスキルアップの望めない会社にいると年齢を重ねていくに連れて
ますますこの差は開いていくのだろうと思いました。


TokyoVim#5からTokyoVim#10の間でさらにその思いは強くなり、
ついに新しい環境で自分のスキルを磨き、その差を埋めていこうと決意しました。


そこからはまさに「どうしてこうなった!?」と言いたくなるくらいに
物事があっという間に進んでいき、今に至るというわけです。


これはやはりTokyoVimで受けた刺激が大きく影響しているのだと思います。
私の場合は自分の周辺環境を変える方向にエネルギーが向いたようですが、
もしかすると輝煌美夢王(シャイニングビムマスター)を目指す...
という選択肢もあったのかもしれません。


そんなこんなで多少強引なオチですが、何か悩みを抱えている人は
是非TokyoVimに参加してみませんか?


きっと何らかの変化を与えてくれることでしょう。
輝煌美夢王になるのはあなたかもしれませんよ!


最後に、TokyoVimを主催者のkanaさんをはじめ、
TokyoVimでお会いしたVimmerの方々に、
この場を借りて感謝の意を表したいと思います。
本当にありがとうございます。


さて、明日のVim Advent Calendar 2012はよくお世話になっている@thincaさんです。




そうそう、今日は七夕でした。

早くVim7.4が正式リリースされますように
(BETA版の7.4aは昨日リリースされたようです)