Teratermのアノ挙動をvimに!

この記事はVim Advent Calendar 2012の61日目の記事です。
60日目は@KSuzukiiiさんの「はじめての unite source(unite-tig)」でした。

最近仕事で使うWindowsでもgvim(kaoriyaさん版)を使用しだしたのですが、コピペまわりで四苦八苦したのでそのあたりの事を書きます。

Windows gvimでのコピペ事情

Windowsのgvimですが、Windows標準の<C-c><C-v>でのコピペが初期設定ではできません。

これを実現するにはsource $VIMRUNTIME/mswin.vimを書いてvimrcで有効にすればできるようになります!が、行選択ビジュアルモード<S-v>時に<C-f><C-b>で画面移動すると選択が外れるバグがあります。

これが結構使う動作のため、泣く泣く無効化させてクリップボードの貼り付けは右クリックから行なっていました。

ある日気づいた!

gvimで右クリックするといくつかのメニューが出てきますが、クリップボードからの貼り付けにしか使用していない事に気づきました。唐突ですが皆さんはsshクライアントは何を使用していますか?私はMacではTerminal.appでWindowsではTeratermを使っています。

このTeratermのデフォルト設定に以下の2つの機能があります。

  • 選択した文字列を自動でクリップボードに保存
  • 右クリックするとクリップボードの文字列を挿入

この2つの機能をなかなか気に入っていまして、右クリックを貼り付けにしか使用していないならTeratermのこの挙動をVimにも設定したところなかなか便利!

vimrcに追加!

まずは「選択すると自動でクリップボードに文字列を保存する」設定から。下記の設定でビジュアルモードで選択すると自動でクリップボードに保存されます。(+clipboardでコンパイルされたvimである必要があります)

" GUI
set guioptions+=a
" CUI
"set clipboard+=autoselect

次に「右クリックでクリップボードの文字列を挿入」ですが、ノーマルモードとインサートモードの両方でできるようにしました。こちらも*レジスタを利用するのでclipboardが有効なvimが必要です。

nnoremap <RightMouse> "*p
inoremap <RightMouse> <C-r><C-o>*

完成ッ!

上記の設定でTeraterm風のキーバインドのVimを得られました。エクセルやらでコピーして右クリックでVimに貼り付けッ!今のところこの設定で快適に作業できています。このカスタマイズ性の高さがVimの醍醐味ですね。

明日の62日目は2回目の@thincaさんです。楽しみです。

自動retainされないNSMutableSet

addObjectしてもretainされないNSMutableSetを作る。使い所はグローバル変数のstatic NSMutableSet *でこれを使って特定クラスのオブジェクトを詰め込んでいって、あるタイミングで全インスタンスに対して何か処理をする為。retainさせないのはreleaseタイミングはデフォルトのままにするため。まぁaddObjectしたらすぐにreleaseするのと大差ないんだけどね(その場合もSEGVには注意しないといけない)。

CFSetCallBacks assignCallbacks = kCFTypeSetCallBacks;
assignCallbacks.retain = NULL;
assignCallbacks.release = NULL;
NSMutableSet *assignSet = (NSMutableSet *)CFSetCreateMutable(kCFAllocatorDefault, 0, &assignCallbacks);

これで[assignSet addObject:obj];してもobjのretainCountは増えない。解放されたオブジェクトを触るとSEGVになるので、以下のようにaddするオブジェクトのクラスにおけるdeallocの中で外す。

- (void)dealloc
{
        if ([assignSet containsObject:self])
                [assignSet removeObject:self];
        [super dealloc];  // %orig;
}
上記のようにdeallocいじらないといけないので、単一のクラスのオブジェクトを詰め込む場合以外ぐらいに留めておくのがよさそう。

参考 http://decafish.blog.so-net.ne.jp/2010-10-27-1