Vimでメールを読む

前回のTokyoVim#19unite-notmuchというプラグインを作りました。
このプラグインnotmuchというコンソール上で動作するメールリーダーを使い、
Uniteのインターフェースから

  • メールの表示
  • メールの検索
  • メールの未読/既読の切替

をすることができます。


なお、

  • メールの受信
  • メールの送信

はそもそもnotmuch本体が出来ないのでこのプラグインでも出来ません。

また、notmuchがWindowsでは使えないようなのでこのプラグインも使えません。

必要なソフト

メール環境の設定(offlineimap編)

  1. notmuchのインストール
# Mac OS X
$ brew install notmuch

# Linux(gentoo)
$ sudo emerge notmuch
  1. notmuchの設定
$ vim ~/.notmuch-config
[database]
# 絶対パスで指定する
path=/Users/ユーザ名/Maildir
#path=/home/ユーザ名/Maildir

[user]
name=アカウント名
primary_email=メールアドレス

[new]
tags=unread;inbox;
ignore=

[search]
exclude_tags=deleted;spam;

[maildir]
synchronize_flags=true
  1. offlineimapのインストール
# Mac OS X
$ brew install offlineimap

# Linux(gentoo)
$ sudo emerge offlineimap
  1. offlineimapの設定
$ vim ~/.offlineimaprc
[general]
metadata = ~/.offlineimap
accounts = アカウント設定名

[Account アカウント設定名]
localrepository = ローカル設定名
remoterepository = リモート設定名
status_backend = sqlite
postsynchook = notmuch new

[Repository ローカル設定名]
type = Maildir
# notmuch-configのdatabaseで指定したパス
localfolders = ~/Maildir/

[Repository リモート設定名]
type = IMAP
remotehost = メールサーバ
remoteuser = アカウント名
remotepass = パスワード
maxconnections = 1

folderfilter = lambda foldername: foldername in ['INBOX']

使い方(offlineimap編)

事前に

$ offlineimap

でメールを受信しておく必要があります。
いちいちコマンドを実行するのが面倒ならcronにでも仕込んでおけば良いらしいです。

メールを受信したらVimから以下のコマンドを実行します。

:Unite notmuch

フォルダ一覧画面では以下のアクションが実行可能です。

  • フォルダを開く(open)
  • フォルダ内のメールを既読にする(read)
  • フォルダ内のメールを未読にする(unread) => TokyoVim#20で追加
  • フォルダ内のメールを検索する(search) => TokyoVim#20で追加


フォルダを開いた後のメール一覧画面では以下のアクションが実行可能です。

  • メールを開く(open)
  • 選択したメールを既読にする(read)
  • 選択したメールを未読にする(unread) => TokyoVim#20で追加
  • メールをプレビューウィンドウで開く(preview) => TokyoVim#20で追加

興味がある人は使ってみてください。

TokyoVim#19に行ってきます

今日はTokyoVim#19です。
ゴールデンウィークで鈍ったVim力を鍛え直しましょう。

今年のゴールデンウィークは去年よりたくさん休んでしまい、
なんとその間にメールが4000通近くもたまってしまいました。

普段メーラーWindows上のThunderbirdを使っていますが、
処理するのがさすがにしんどかったのでなんとかしたいです。

そこで思いついたのがVim上でメールを処理するという方法。
リモートからでもsshで繋いでコンソールから使うことができ、
就業時間の99%をVim上で過ごす人にはかなり便利そうです。

ただVim上で動くメーラーというのはGmail用ばかりで普通のメーラー
なかなか良さそうなのがみつかりませんでした。

notmuch.vimというプラグインはあるものの、

  • Vimの設定を勝手に変えるっぽい
  • フォルダに大量のメールがあると固まる

など、ちょっとイマイチだったので今回のTokyoVimでは
このnotmuchをUniteあたりから使えるようにしてみたいと思います。

TokyoVim#18に行ってきた

TokyoVim#18に行ってきました。

今回の目標はdaisuzu/translategoogle.vim · GitHubのドキュメントを書くことだったので最初はgoogle/vimdoc · GitHubで書こうと色々試してみました。
が、LeafCage/vimhelpgenerator · GitHub変数にあたる部分をうまく生成することができず、結局普通に書いてしまいました。

ただ、コードのコメントからドキュメントを自動生成するというのはメンテナンスがしやすそうなので今後のバージョンアップに期待したいです。
※見た感じgoogle/maktaba · GitHubのようなライブラリを対象にしているような気がしたので普通のプラグイン向けになるかはわかりませんが...

あとはプラグインに自分が使いそうなコマンドを追加したりとかしていたらあっという間に終わってしまいました。

終了後は懇親会に行き、他のVimmerと交流しながらVim Advent Calendar 2013 : ATNDの記事を書いたりしていました。

次回はちょろっと話に上がったハトクラをやりたいです。

Vimでマウスを使った矩形選択がしたい

Vim Advent Calendar 2013の133日目の記事です。

昨日、後輩(コンソールではVimを使っている)
「矩形選択が楽なのでxyzzy使っています」
と言っていたので

  • Alt + LeftMouse
  • マウスドラッグで選択開始してCtrl + V

Vimでも同じようにできるよ。
と教えてあげました。

Vimでマウス...!?とか言われてしまいそうですが、
任意の範囲を選択したいときにはマウスが便利だと思います。

明日のVim Advent Calendarはどうも書く人がいないようですが、
きっと本日のTokyoVim#18に参加して進捗を出せた人が書いてくれると思います。

ちなみにこの記事はPC利用率100%のTokyoVim#18懇親会会場で書いています。

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

ここ1年で新たに使ったソフトやライブラリなど

転職後、本格的に実務をやるようになって約1年。
色々とやったような気がするので思い出しながら書き出してみる。

ソフトウェア

SIPpみたいなトラフィックジェネレータ。
こっちはIMSだけじゃなくてRadiusとかDiameterも使える。

仮想環境を自動化する。
コマンド一発で環境が立ち上がるのは便利。

ターミナルマルチプレクサ。
ネットが切れやすい環境でsshを使うときは無いと困る。

MySQLインターフェイス
WindowsからMySQLをいじるときはこれを使っている。

デプロイツール。
ChefやAnsibleよりも手軽。

プロセス管理ツール。
適当に書いたスクリプトがデーモンになる。

ログ収集ツール。
設定ファイルだけでデータを集計したりしきい値監視したりメールを出したりできる。

Perl

初めてのWebプログラミングはcgiでした。

実はSQLを書いたのも初めて。

  • Template-Toolkit

さすがにprint関数で1行ずつhtmlを書いていくのはしんどい。。。

  • prove + Test::More + Test::Pretty

テスト関係のモジュール。
実際にはTest::mysqldやTest::Fixture::DBIとかTest::Mock::LWP::Dispatchあたり使っている。

  • String::Trigram

テキストの類似度を計算してくれる。

Python

  • Flask + SQLAlchemy

軽量Webフレームワーク + ORM。
プラグインがたくさんあるしPerlよりPythonの方が好きなので使いやすい。

  • mechanize

WWW::MechanizeのPython版。

  • pyquery

jQueryみたいなセレクタを使えるようになるライブラリ。
最近ではBeautifulSoupよりこっちの方が使われているらしい。

JavaScript

cgiすらやったことなかったので当然jQueryも初めて。

  • AngularJS

Webアプリをいまどきの手法で爆速開発したを読んで気になったので使ってみた。


決してWebエンジニアではないはずなんだけどWeb系のことばっかりやってるように見える...
来年度はもうちょい下のレイヤとか組み込み+モバイルなんかもやっていきたいなぁ。

IT系エンジニアが新しいタスクを振られた時

自分の場合はここ1年間、

  1. 周りを納得させられる理由があれば拒否する
  2. 今抱えているタスクに対し、リソースやスケジュールを調整して対応する
  3. 稼働を上げつつ新しい方法などで効率化しながら対応する
  4. 普通に稼働を上げるだけで対応する

の順でやっていると思う。

といっても1.なんて実際にはほとんど無いかも。
それをやることでビジネス的なメリットが何も無いときくらいしか思いつかないし。

そうなるとその下の2.か3.か4.になるわけだけど、個人的に一番好きなのは3。
達成感もあるし自分自身の成長にもなる。

そもそも評価エンジニアから開発エンジニアに転職したから今までのスキルセットだと何もできなくなってしまうわけで。
だから結果としては2.を選びつつ3.になっていることもあるのかな。

4.は残業時間だけ増えて得るものは少ないから出来れば避けたい選択肢。

ただ3.は終わらなかったり何か問題が起きたらどうするんだ!
的な反対をされることもあるんだけど他の人はどうなんだろ?(どうしてるんだろ?)

そして1.の段階で
「やったことがないからできません」
とか
「わからないからできません」
って言っている人がいてちょっとびっくりする。
(これは転職後も転職前もベテランでも新人でも)

こういった考え方もそのうち変わっていくのかなぁ...