Self Reference

Are you receiving this?

MacのVimで通知センターを使う

Vim Advent Calenderの338日目ですこんにちは。

Macのお話です。
OSXには、画面の右上にメールの新着やスケジュールの通知、ソフトウェアのアップデート等をポップアップ通知してくれる通知センター機能があります。

主にシステムからの通知に使われていたのですが、OSがMavericksとなり、ユーザーもコマンドラインから利用できるようになりました。
こんな感じで使えます。

1
echo 'display notification "VimConfは11月16日開催です♪" with title "Vim Girl"' | osascript'

display notificationの引数に表示したい文字列を指定して、AppleScriptとして実行します。
with titleやsubtitleを指定すれば、メッセージのタイトルを変更することができます。

では、Vimからも利用できるようにしてみましょう。
.vimrcに直接書いてみます。

1
2
3
4
5
function! s:mac_notify(say)
  call vimproc#system("echo 'display notification "."\"".a:say."\" with title \"Vim\"' | osascript")
endfunction
command! -nargs=1 MacNotify call s:mac_notify(<q-args>)
command! -nargs=1 MacNotifyExpand call s:mac_notify(<args>)

MacNotifyコマンドを定義して、引数の文字列を表示するようにしました。
変数とかを指定して展開したい場合は、MacNotifyExpandコマンドの方を使います。
実行にはvimprocが必要です。

VimScript化してgithubにもあげました。
https://github.com/modsound/mac_notify-vim.git

以下利用例です。
Vim Girlが天気予報してくれるように設定してみました。秘書っぽい機能です。

1
2
3
4
5
6
7
8
function! s:weather_report()
  let g:weather = system("curl --silent http://weather.livedoor.com/forecast/rss/area/130010.xml
  \ | grep '<description>'
  \ | sed -e 's/<description>//g'
  \ | sed -e 's@</description>@@g' | head -n 3 | tail -n 1")
  exec "MacNotifyExpand g:weather"
endfunction
command! WeatherReport call s:weather_report()

いい感じです。
コンパイルが完了したときとか、未操作時間が10分を超えたときとかに通知してくれると面白いかもしれません。

みなさんもMacNotify.vimを使ってVimを秘書にしてみませんか?

明日のVim Advent Calendarは@thincaさんです!

Vimmer名刺を持ってVimConfへ出かけよう

Vim Advent Calendarの324日目です。
昨日は@manga_osyoさんの「Vim で範囲内を検索する operator をつくった」でした。

VimConfの開催が近づいてきましたね!

当日に向けて、プラグインを作ったり、.vimrcを見直してニヤニヤしたりと、準備に忙しいことと思いますが、VimConfはVimmer同士の交流の場でもありますので、名刺を用意しておくと便利な気がします。会社の名刺もよいですが、みなさんこの機会にVimmerとしての名刺を作成してみてはいかがでしょうか。

この記事では、私が作成したVimmer名刺を自慢紹介したいと思います。

どこでつくる?

町の名刺屋さんへ行って、明朝体のテキストオンリー名刺を作ってもらうのは今や昔のこと。
現在では自宅でPCの画面を確認しながら、デザイン・レイアウトを指定することができます。また、プリンタで自作するのとあまり費用は変わりませんし、質も段違いです。
お店はGoogle先生で「名刺作成 web上」とか検索するとたくさん出てきます。私は費用と納期と評判を確認して、マヒトデザインさんにお願いしました(ステマ)。

デザイン

デザインテンプレートが多く用意されています。それを微修正する形で作成したいと思います。
Vimといえば緑のイメージなので、このテンプレートを選んでみました。

せっかくなのでVimのロゴは入れたいです。以前ステッカーを作成した際はクラシックタイプのロゴだったので、今回はTango Vimアイコンを使用させていただくことにしました。ファイル作成者のKyo Nagashimaさんに感謝。ライセンスはCreative Commons Attribution 3.0です。

ブラウザ上で外部ファイルとして読み込んで配置しました。

いい感じ!

では注文します。

費用

私の場合、費用内訳はこんな感じでした。2箱200枚で1000円いきませんでした。

1
2
3
4
5
6
7
8
9
10
11
12
合計数: 2 箱  
印刷代金: 780 円  
角丸加工料金: 0 円  
名刺ケース料金: 0 円  
印刷代 お値引き: - 15 円  

配送方法: ヤマトメール便  
送 料: 180 円  
お支払い方法: 銀行振込  
代引き手数料: 0 円(※代引き以外は0円となります)  
---------------------------  
合計金額 : 945 円  

到着

できました!
これでVimConfの準備は万端です。

みなさんも、Vimmer名刺を持って私と名刺交換VimConfに参加してみませんか?

おまけ

thincaさんの作成されたvim-splashを使えば、Vimも名刺に早変わり!

1
2
3
4
5
6
7
8
9
10
11
__     ___           
\ \   / (_)_ __ ___  
 \ \ / /| | '_ ` _ \ 
  \ V / | | | | | | |
   \_/  |_|_| |_| |_|
                     

mail:    
github:  
blog:    
twitter: 

明日は@LeafCageさんです。

MacのVimでBGMを聴く

Vim Advent Calendar 318日目の記事です。
365日更新も目前です。Vimmerの2012年はまだ明けません。

昨日は@unmoremasterさんのページング・エラーでした。皆様ご存知の通り、Vim小説というジャンルを切り開いた方です。今後のご活躍に目が離せません。

さて、今回もMacのお話です。

私の家では音楽データをNASに溜め込んで、いろんなPCからネットワーク経由で再生できるようにしています。
再生はVimから行います。VimfilerがあればネットワークパスもVimから開けるので、NAS内へ移動して音楽ファイルにxを実行し、システムで関連づけられたプログラムで再生しています。しかしその都度GUIがポップアップするので、バックグラウンドで再生できればいいなあと思っていました。

Vimfilerはunite.vimと融合しているので、コマンドラインで音楽を再生できる環境があれば、そのコマンドへ処理を投げるactionをuniteに定義し、Vimfilerからactionを呼べば実現できそうです。

MacOSXにはafplayという素敵なコマンドが入っているようでした。

なんだかやれそうな気がしてきたので、.vimrcに設定してみることにしました。

事前にインストールが必要なもの

設定する

[再生機能]

まずuniteのactionを定義します。

1
2
3
4
5
6
7
let s:start_afplay= {'is_selectable': 0}
function! s:start_afplay.func(candidate)
  call vimproc#system_bg("killall afplay")
  call vimproc#system_bg('afplay -q 1 ' . '"'.a:candidate.action__path.'"')
  echo "Playing... " . a:candidate.vimfiler__filename
endfunction
unlet s:start_afplay

’s:start_afplay’は、afplayコマンドに’candidate’を投げて処理させるfunctionにします。 ‘candidate’はuniteが用意してくれます。’candidate’がどんなプロパティを提供しているかは、functionの中で’echo candidate’とかするとわかります。
afplayコマンドはvimproc#system_bgを通して実行しています。でもafplayじゃなくてもよい気がします。

続いてuniteに’s:start_afplay’を登録します。

1
call unite#custom_action('file', 'afplay', s:start_afplay)

これで、uniteの’file’ kindに、’afplay’という名で、’s:start_afplay’ functionが定義されました。

[停止機能]
1
2
3
4
function! s:stop_afplay()
  call vimproc#system_bg("killall afplay")
endfunction
command! StopAfplay call s:stop_afplay()

いわゆる’ボスが来た’ functionです。
killallが不格好なのはご容赦ください。

[キーマッピング]

‘af’で再生、’fa’で停止するようにしてみました。

1
2
autocmd! FileType vimfiler nnoremap <buffer><expr>af vimfiler#do_action('afplay')
nnoremap <silent>fa :<C-u>StopAfplay<CR>

設定全体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
" 再生する
let s:start_afplay= {'is_selectable': 0}
function! s:start_afplay.func(candidate)
  call vimproc#system_bg("killall afplay")
  call vimproc#system_bg('afplay -q 1 ' . '"'.a:candidate.action__path.'"')
  echo "Playing... " . a:candidate.vimfiler__filename
endfunction
call unite#custom_action('file', 'afplay', s:start_afplay)
unlet s:start_afplay

" 停止する
function! s:stop_afplay()
  call vimproc#system_bg("killall afplay")
endfunction
command! StopAfplay call s:stop_afplay()

" キーマッピング
autocmd! FileType vimfiler nnoremap <buffer><expr>af vimfiler#do_action('afplay')
nnoremap <silent>fa :<C-u>StopAfplay<CR>

これでVimからBGMを再生できるようになりました!

課題

  • 対応していないファイル形式(flac, oggとか)に実行した場合エラーをだす。
  • ファイル名にダブルクォーテーションがあった場合でもうまい具合に再生する。
  • 連続再生できるようにする。
  • Mac以外でも再生できるようにする。

謝辞

当初掲載したコードはuniteのaction定義で’is_selectable’を1にしていて、この場合対象ファイルを複数選択できるようになっていましたが、@osyo-mangaさんが教えてくださり、’is_selectable’が0になるよう修正いたしました。ありがとうございました!

参考にさせていただいたページ

http://hrsh7th.hatenablog.com/entry/20120229/1330525683
http://d.hatena.ne.jp/osyo-manga/20131006/1381065976
http://d.hatena.ne.jp/osyo-manga/20130512/1368370556
http://d.hatena.ne.jp/osyo-manga/20130520/1369049201
http://kuchitama.hateblo.jp/entry/2013/02/08/000320

まとめ

Vimはエディタであり、ブラウザであり、音楽プレイヤーでもあり、つまり良き配偶者だったのです。

明日は@akira_simpsonさんです。

VimからMacの内蔵辞書を引きたい

Vim Advent Calendarの289日目です。2012年21月15日になりました。
昨日は@cocoponさんの色見本スクリプトを活用して、lightlineのステータス行をクールに彩るでした。

今日はMacOS X限定のお話です。それ以外の方ごめんなさい。

Macには辞書がたくさん搭載されていますよね。ウィズダムとか大辞林とかフランス語やらドイツ語やらいろいろ。

これらは辞書.appから活用できますし、SpotlightとかAlfredから引いても便利だと思うのですが、やはりVimユーザーとしてはVimから参照したいわけです。

ただ、コマンドラインから引きたい、ということであれば、たとえば次のコマンドが提供されています。

1
open dict://せめてVimVimしく

これをVimから外部コマンドとして実行すれば辞書が使えます。

でもこれだと辞書.appに処理を投げているので、検索のたびにGUI画面がポップアップ表示される点がどうももにょもにょします。

そんなわけでVimから直接Macの内蔵辞書を引くプラギンをつくってみました。

macdict-vim

https://github.com/modsound/macdict-vim

引数に検索したい言葉を指定すると、バッファを分割して訳語を出してくれます。
いくつかコマンドを用意していて、カーソル位置の単語も引きます。詳細はリンク先のREADMEをご覧ください。
実装はObjective-Cです。

残念なところとしては、
・特殊文字が表示できないので一部歯抜けになります。
・出力結果は変なところで改行が入ってしまいます(なぜか句点の前)。

そのほか

OSがLionからMountain Lionになった際に、いくつか搭載辞書が変更されているみたいです。 Objective-Cで次のコードを実行すると、そのPCで使用可能な辞書一覧が表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import <Cocoa/Cocoa.h>

NSArray *DCSCopyAvailableDictionaries(); 
NSString *DCSDictionaryGetShortName(DCSDictionaryRef dictID); 

// function show dictionaries you have
int main(){
  NSArray *availables = DCSCopyAvailableDictionaries();
  for (NSObject *d in availables) {
    NSString *sn = DCSDictionaryGetShortName((DCSDictionaryRef)d);
    printf("%s\n", [sn UTF8String]);
  }
return 0;
}

私の辞書一覧にWikipediaとAppleも存在したので、当初は今回のプラギンにもこの2つを入れていたのですが、 どうにもうまく参照できないので外しました。。

参考にさせていただいたサイト(元ネタ)

http://tobioka.net/716
http://www.wizard-limit.net/mt/pc/archives/004552.html

明日は@manga_osyoさんです!

Vimステッカーを作ったお話

Vim Advent Calenderの111日目ですこんにちは。

勉強会に参加すると、みなさんPCにいろいろなステッカーを貼っているのを見かけますが、私は常々、「なぜVimステッカーを貼っている変態人はいないのか?」と思っていました。
そこで自分で作ってみることにしたわけです。

著作権の問題

Vimのロゴは私の作ったものではないので、私が勝手に編集したり、ステッカーにしたりするわけにはいきません。ライセンスがどうなっているかを調べる必要があります。Vimのサイトを確認しましたがロゴについては記載がなかったため、Google先生に「Vim logo license」と問い合わせてみると、利用者からの問い合わせにBram氏が返答しているメールのアーカイブがありました。

In general you are free to use the Vim logo for promotion of Vim. No need to get written permission. However, if I notice misuse of the Vim logo I might get furious and poke someone with soft cushions. Have at you!

http://www.mail-archive.com/vim@vim.org/msg12850.html

「なめた使い方しやがったらぬっこぬこにしてやんよ!」(意訳)と仰っていますが、”In general you are free to use the Vim logo for promotion of Vim”とあるので、個人でステッカーを作ってニヤニヤしたり、布教のためにそれを無償配布したりといったことは問題なさそうです。ありがたく使用することにします。ただし、このメールが特定個人に向けたもの、という点には留意する必要があると思います。

次は印刷するためのデータです。私に絵心がなく、またVimのサイトに高解像度のロゴデータが見つからなかったので、Wikipediaに頼りました。

こちらのデータの許諾は下記のようになっています。

https://commons.wikimedia.org/wiki/File:Vimlogo.svg?uselang=ja

この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行する GNU 一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリの再配布や改変ができます。この作品は、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、バージョン2およびバージョン3のGNU 一般公衆利用許諾書をご覧ください。

作者のD0ktorz氏に感謝して使用します。ベクター形式ばんざい!

印刷会社とのやり取り

印刷会社はデジタさんを利用しました(ステマ)。 印刷会社は無数にあるので、どこへ依頼してもよいと思うのですが、私が注意したのは次の点です。

  • 小ロットから発注できるか
    業者用だと1000枚から受け付けのところもあります。
  • 素材は選べるか
    耐水素材が選べたり、ラミネート加工等ができるとなんとなく安心。
  • 個人の依頼を受けているか
    同人の印刷とかやっていると、いろいろ分かってくれそうな気がする。
  • 手続きは明確か
    データはどうやって入稿すればよいか、フォーマットはai限定なのか、版下は先方で作成?それともこちらが完全版下で入稿? 代引き等の対応は可能か、納期は何日かなどなどなど

発注したらあとはわくわくしながらステッカーの到着を待つだけ!

ステッカーできたー!

これがプロの仕事…!
会社の同僚に見せたところ、「いいね。自己満足っぽくて」「いやほんとそういうの気持ち悪いんで」と好評でした!(泣)

意外と気軽に作れるので、みなさんもやってみるとよいと思います!

Vimmer養成ギプス

Vim Advent Calenderの84日目です。

みなさんvimでのカーソル移動にはhjklキーを使用されていることと思います。
コマンドを組み合わせたエキセントリックな操作をして、今日もまた周囲から気味悪がられ羨望の目で見られているのでしょう。

しかし百戦錬磨のvimmerのみなさんも、かつて遠い昔、うっかりカーソルキーを使って移動してしまい、老vimmerにたしなめられたご経験があるのではないでしょうか。

私自身はまだまだ修練が足りません。そこでvimmer養成ギプスの意味を込めて、カーソルキーを使うとvimに叱られるプラグインを作成してみました。

https://github.com/modsound/gips-vim

ノーマルモードでカーソルキーを押すと、移動する代わりに、vimからのメッセージをランダムにステータスラインへ表示します。

実装としては、改行区切りのテキストファイルをreadfileでlistとして読み込み、そこからランダムにひとつ選んでecho出力しているだけです。乱数の生成はosyo-mangaさんのものをパクリ参考にさせていただきました。また、先日2月17日に開催されたYokohama.vim #4では、thincaさんにアドバイスを頂戴いたしました。この場にて御礼申し上げます。

なお、テキストファイルをご自身でご用意いただければ、お好みのセリフでvimに罵ってもらうことができます。
その場合は、次のようにファイルの場所を.vimrc等でご指定ください。

1
let g:gips_reading_txt = '$HOME/.vim/bundle/gips-vim/autoload/dict/tsundere.txt'

今後は添付するテキストの種類を充実させるのと、Shaberu.vimと連携できるようになればいいなと思います!!

最後に

今回初めてvimプラグインを作成しました(ネームスペース的な意味で)。プラグインのディレクトリ構成はどうすればいいの? とか、autoloadってなに? とか、変数のスコープとか、.vimrcから~/.vim以下にプラグインを移動したらうまく動かなくなった(>_<)とか、いろいろ調べて分かることがあり、表層をさらっと撫でただけですが、vimとより仲良くなるにはプラグインを作るのが一番だなあと思いました。

明日は@tyruさんです。ではみなさん素敵なvim lifeを!!

追記

当初、テキストファイルをプラグインからの相対パスで読み込む方法がうまく分からず、これmacでBundle使ってる人しか使えないんじゃ?? 状態だったのですが、本記事を掲載したところ、超速でmattnさん、ujihisaさんからpull requestが!!! mergeできるまで就業時間中もワクワクプルプルしていたわけですが、ソーシャルコーディングが流行する理由を実感したのでした。