読者です 読者をやめる 読者になる 読者になる

余白の書きなぐり

aueweのブログ

vimのメモ取り環境

Windows Vim Mail

僕は全てのメモを「Gmailで自分宛てに送信」して記録している。 インストールログや便利なツールのメモ、数学のパズル、役所の手続きから買い物リストまで、何もかもをGmailに送信しているのだ。 リマインダもToDoリストも全てメール管理。 閲覧は主にスマホとPCのブラウザで、検索はGmailの検索窓を使っている。

話は変わるが、人生とgitの最大の違いは因果律にあると思う。 人生にタイムマシンは存在せず、git reset --hardgit rebaseなどの便利コマンドもなく、ひたすらコミットを積み重ねることしかできない。 メモは人生のコミットログであり、その媒体に相応しいのは再編集不可能なメールだと、僕は思う。 EvernoteやSlackを使いこなす意識の高い連中には分かるまい~

だいぶ脱線したが、僕のWindowsのメモ取り環境は以下のような感じ。

  1. Winキー + R で「ファイル名を指定して実行」を開く
  2. "gvim"と入力して、gvim.exeを起動
  3. 無名バッファにメモ内容を書く
  4. コマンドラインモードで:Gmailと入力してメール送信

コンセプトは「とにかく素早いメモ書き」「原始的」の2点。 後者について補足すると、vimプラグインは一切使わず、vim以外のフリーソフトも一切使わず、Windows謹製の機能だけで手軽なメモ取り環境を作りたい。 ちなみにLinuxMacだと、msmtp等を使えば原始的なメモ環境の構築など造作も無いので、今回は(厄介な)Windowsに焦点を絞った。

Windowsvimを即座に起動する

パスの通ったディレクトリにgvim.exeへのショートカットリンクgvim.lnkを設置すれば、上で書いた

  1. Winキー + R で「ファイル名を指定して実行」を開く
  2. "gvim"と入力して、gvim.exeを起動

が実現できる。起動時間の短縮には、やはりマウスよりキーボードの方が向いていると思う。
参考:http://www.kamomer.com/entry/windows10-run-filename

gvim.exeの起動は簡単だが、問題はメモ内容をメール送信する部分だ。これを外部ツールに頼らずに実現したい。

vimで書いたメモをSMTPGmailに送信

まず以下のsendGmail.vbsというファイルを、:set fenc=cp932で保存する。 このファイルは標準入力を受け取ってメール送信するVBSスクリプト

Dim objStdIn
Dim intExitCode
Set objStdIn = Wscript.StdIn

Set cdo = Wscript.CreateObject("CDO.Message")
With cdo
  .From             = "hoge@gmail.com"
  .To               = "hoge@gmail.com"
  .Subject          = "自分用メモ"
  .ReplyTo          = "hoge@gmail.com"
  .Textbody         = objStdIn.ReadAll
  .BodyPart.Charset = "Shift-JIS"
end With

schemas_url ="http://schemas.microsoft.com/cdo/configuration/"
With cdo.Configuration.Fields
  .Item (schemas_url & "sendusing")             = 2
  .Item (schemas_url & "smtpserver")            = "smtp.gmail.com"
  .Item (schemas_url & "smtpserverport")        = 465
  .Item (schemas_url & "smtpconnectiontimeout") = 30
  .Item (schemas_url & "smtpusessl")            = true
  .Item (schemas_url & "smtpauthenticate")      = true
  .Item (schemas_url & "sendusername")          = "hoge@gmail.com"
  .Item (schemas_url & "sendpassword")          = "パスワード"
  .Update
end With
cdo.Send

再度注意するが、sendGmail.vbsは:set fenc=cp932で保存するように!。 パスワードは平文直書きで、セキュリティコストは自腹。ワイルドだろう?

次に~/.vimrcに以下を追加

command! Gmail set fenc=cp932 | w !cscript C:/Path/To/sendGmail.vbs

" Markdownで書く場合はfiletype切替コマンド(sm)を自作すると便利
nnoremap sm :<C-u>set filetype=MARKDOWN<CR>

以上で設定は終わりだ。

使い方は冒頭で説明したが、vimでメモを書いた後コマンドラインモードで

:Gmail

とすれば、メモがGmailに送信される。めでたしめでたし。

蛇足

メールをUTF-8で送りたかったので、sendGmail.vbs

.BodyPart.Charset = "Shift-JIS"

のあたりをいじくり回したのだが、うまくいかなかった。 普通メールの文字コードといえばiso-2022-jpなのだが、windowsでコードを変換するには外部のソフトウェアが必要になる(たぶん)。 少なくとも僕の環境では、vim単体で無名バッファ(UTF-8)をiso-2022-jpに変換することができなかった。 またVBSスクリプトでメールを送信する際も、UTF-8は扱いづらいようだった。

" 変換に失敗する
:set fenc=iso-2022-jp
:w
" うまくいく
:set fenc=cp932
:w

文字コードをcp932(Shift-JIS)にしておけば、vimもVBSスクリプトもハマることなく動作した。 やはりWindowsではShift-JISが最強なのだと思いました。

参考