VimConf 2014に行ってきて

改めて思ったのは、

若手の勢いがすごい

ということ。


今回の発表者は多分ほとんどが自分と同年代かそれ以下だったはず。
参加者も懇親会でちょこちょこと話した感じだと若い/ビギナーな人が多かったし、
(凡人の自分と比べても仕方がないんだけど)みんな才能に溢れているように感じた。


他の勉強会にはほとんど行ったことがないからよくわからないけど
10年以上使われているとはいえ、プログラミング言語ではなく
ソフトウェアでこんなに素晴らしい若手が集まるのは本当に凄いと思う。


一利用者として今後のVimがとても楽しみだし期待しています。
って言ってるだけじゃなく、負けずに少しでも何かに貢献していきたいとは思うんけど
さてどうなることやら...



あ、各セッションの感想については小並感なので割愛で。

autorepeat.vim作った

Vimmerはf拡張プラグインを作る*1

自分も犬Vimmer

けどf系って実はあまり使っていない...

ひとまずfにこだわらず横移動プラグインを考えてみよう

1キーで自動的にカーソル移動が始まって好きなタイミングで止める、とかどうだろう?

autorepeat.vim完成

結局1キーではできなかったのでトリガーを入力した後に
繰り返したい操作を続けて入力するという作りにしました。

具体的な使い方としてはvimrcに

nmap <Space>. <Plug>(autorepeat)

のような設定をし、

<Space>.

の後に繰り返したいノーマルモードコマンドを入力します。

" 例
<Space>.l

なお、今のところノーマルモードにしか対応していません。

繰り返しが始まるまでの時間は

g:autorepeat_timeout

に秒単位の数値、

繰り返し操作の間隔は

g:autorepeat_interval

に:sleepコマンドの引数と同様の文字列で指定することが可能です。

ちょっと使ってみた感じ、慣れないと使いこなすのは難しそう...
まだ微妙なプラグインを作ってしまったか。

*1:日本の代表的な犬Vimmerである@Linda_ppさん、@deris0126さんが作っていたので勝手にそう思っただけです

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