isaiに機種変更した

少しSOL23SHL24と迷ったけど結局LGL22にしました。

今までがINFOBAR C01だったので今回は

  • 前よりバッテリの持ちが良くて
  • 前よりスペックが高くて
  • 前より画面が大きくて
  • 防水対応

の機種にしようと思っていました。
元が元なのでいまどきのAndroidであればほとんどどれでもOKなんですが、
メーカー的に(個人的には)一番良さげなLGを選びました。

1週間ほど使ってみて概ね満足といったところですが、画面が一気に大きくなりすぎたのでちょっと扱いに困っています。
それからたまにEメールがなかなか届かないことがあるのはアプリかWNSがバグってるからかも?
ってこれはINFOBAR C01もそうだったのでまだ直っていないのかという感じですが...


あとは以下の記事にも書いてありますが3845#*22#で裏メニューに入れるようです。

[au]LG LGL22 isai simunlock(シムフリー化)をやってみた | はるアイコン鯖blog

まあ今のところあまり使うこと無さそうな機能ばかりですが。。。

ssh先のVimでSphinxドキュメント編集中にプレビューをしたくなった

Windowsgvimなら:QuickRunコマンドだけでビルドしてFirefoxで開くところまでやってくれるように設定してあるんだけど、コンソールだとテキストブラウザしか使えない...

ふとPythonのSimpleHTTPServerを思い出したので_build/htmlディレクトリで

:let s = vimproc#popen3('python -m SimpleHTTPServer')

を実行してみた。

普通のブラウザからhttp://ssh先のip:8000を開くと生成したhtmlが表示されるのでとりあえずこれでも良さそう。

終了するときは

:call s.kill()

最初からGUIでやれよとは思う。。。

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
でだいたいは紹介されてしまっているような気がします…
が、誌面ではまだ書かれていないような内容を自分なりにまとめてみたつもりです。
(丸かぶりな記事があったらスミマセン)

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