if endif などが % で対応できる matchit.vim のハイライト plugin hl_matchit.vim 書いた

はじめに
どうもこんにちは。 ソノダバンド大好き君です。
この記事は Vim Advent Calendar 2012 の 26 日目の記事です。
今日は会社の同僚に matchit.vim でハイライトできないもんかね? と言われたので vim plugin を作ってみました。

背景
このプラグインをなぜ書いたか、それは
- ググった結果 結構それっぽい質問をしている人が多かった
- 出てきた solution っぽいサイトの snippet がコピペでは動かない
- 2012 なら (Neo)bundle したい
などがあげられます。

matchit.vimとは
if と endif などの対応を % で移動できるようになる plugin です。
参考 : http://nanasi.jp/articles/vim/matchit_vim.html

僕の認識では vim をインストールすると一緒についてきていて、
/usr/share/vim/vim73/macros/matchit.vim
とかに入っているイメージです。
vimrc に

source $VIMRUNTIME/macros/matchit.vim
or
runtime macros/matchit.vim

こんな感じでかけばオッケーって matchit.txt さんが言ってました。

hl_matchit.vim のインストール

NeoBundle 'vimtaku/hl_matchit.vim.git'

とりあえず試してみたいって方は install したあとに :HiMatchOn をして html を表示してみたりするといいかもです。
その他は doc もでっちあg書いたのでそちらを参照してください。

以下に適当な設定例を書いておきます。

"" for hl_matchit
let g:hl_matchit_enable_on_vim_startup = 1
let g:hl_matchit_hl_groupname = 'Title'
let g:hl_matchit_allow_ft_regexp = 'html\|vim\|ruby\|sh'

SS


解説

嬉しい点
htmlとか書いている時に構造的にマッチしてない(/閉じてない)やつとかが
ハイライトされないので気づくのが容易になるかもしれないです!

実装
http://objectmix.com/editors/377087-matchit-plugin-highlighting.html#post1403424
の snippet を plugin にしただけです(キリッ
だけど実際ちょっと使ってみたら, 使用上結構問題点があったので
ちょっとだけ工夫してみました。
plugin を書く上では
@manga_osyo さんの Vim Advent Calendar 2012 記念すべき1日目の記事
http://d.hatena.ne.jp/osyo-manga/20121201/1354288903
が参考になりまくりました!

工夫した点
指定した filetype のみ highlight するようにできるようにしました。
あと、どうも matchit の % に時間がかかって全ッ然使えない場合が結構あったので、
対応する文字を制限したり、括弧類を含むlineだと % が重くなるようだったので
その場合は設定によってスキップしたりするようにしました。
(matchit を追ったわけでないので場当たり的な対応です。今後に期待。)
まぁ実際に使っていただくとわかりやすいかと思います。


所感
この plugin の highlight は主に html を読む場合に非常に有効だと思います。
僕はカーソル移動に関して、速度クライマックス派パワープレイ型なので
読むのを妨げるような重さのカーソルとかになるのを避ける事はかなり重要だと思います。
このプラグイン作ってまだ全然使ってないですけど、良い感じに改良していきたいです!!!

なんていうか微妙な感じになってしまった感は否めないですが、
今年のクリスマスイブも vim plugin を書いて
vim とイチャラブすることができたので満足しています---ッ!!!

明日は vim派 xcoder の 救世主 @jugglershu さんです!!

俺達の vim advent calendar はまだ始まったばかりだ!!!!!

知らないと損するvim知識30選

知らないと損するvim知識30選
はじめに
毎日プロテイン&筋トレを忘れない漢、vimtakuです。
何を目指しているの?っていわれます。何を目指しているんでしょうか。


社内向けに勉強会をやるべってなったので
社外にブログを公開してそれを題材に社内向けに勉強会するために
久しぶりにブログを書いているわけです。
ちなみに、タイトルはホットエントリーメーカーを参考に作った。
どうでもいいですね。では早速。


想定読者
- おそらくvim弱を脱しているくらいの人
-- http://ppworks.hatenablog.jp/entry/sendagayarb25
- vim 中級者(中級者の定義がわからないけどたぶん中級者位までに通じる内容だと思う)
- neobundle, unite.vim とかは知ってる
- これらを知っておくと少しドヤ顔出来るかもしれない


生きる上でかなり便利系

neobundle.vim

言わずもがな。省略。

NeoBundle 'Shougo/neobundle.vim.git'


unite.vim

やっぱないとどう仕様も無いレベルだし言わずもがななので特に説明はしないです。

NeoBundle 'Shougo/unite.vim.git'


qfixhowm.vim

dropbox との連携で神がかり化する。
Vimmer ならもちろんちょっとしたメモを取るのに
もちろん vim を使うと思うんだけどこれを使うと本当に
他の memo 系統は使いたくなくなる。
でも実は悩みがあって, これの memo を見る iPhone クライアントが
dropbox の公式アプリしかないので, ほぼないと言ってもいいレベル。
evernote とかは まぁそこそこ見やすいんだけど
いちいち開くのがだるかったりするのであんまり好きじゃない。
iPhone アプリクライアント作りたいなぁ。

NeoBundle 'git://github.com/fuenor/qfixhowm'


vim-mlh

おそらく全世界で2人くらいしか利用者がいない plugin。(拙作, 宣伝)
ローマ字で文字を入力したあと / で文字を変換することができる。
富豪的google transliterate API (google に ローマ字を投げると
文節とかを分けた結果がいい感じに帰ってくるAPI) を使っているので
インターネットコネクションが必須だったりして結構大変なんだけど、
これがまた googleAPI がクオリティ高いおかげで結構いい感じに文章を書くことができる。
実はこの文章もこれを使って書いている。
特に ちょっと 日本語で comment とかしたい時に有効かも。
無駄に skk-large-jisyo とかを使って変換候補を増やすこともできる。
実はローマ字の文節を区切る software
は結構あるので(ちょっと試したことがあるんだけど)
それをlocal に立てて通信とかできるようになったらもっと面白いかも。

see also: http://d.hatena.ne.jp/vimtaku/20111224/1324713931

NeoBundle 'vimtaku/vim-mlh.git'


unite-giti

git 使うとき結構便利。
diff とか部分的に見れたり remote branch を削除したりできる。

全然関係ないけど emacs の magit っていうやつはかなり便利らしい。

NeoBundle 'kmnk/vim-unite-giti.git'


perl の会社で働く自分がよく使っているvim plugin

text-obj-wiw

hoge_fuga_piyo みたいな underscore で区切られた部分や
HogeFugaPiyo みたいな camelize された部分を text obj としてあつかうことができる。
hoge_id とかを fuga_id とかにしたい時とか結構コピペしながら使うことがあるので
そういう時によく使う。

(
hoge_id => $hoge_id,
fuga_id => $fuga_id,
)

こういうやつ。

" original
NeoBundle 'git://github.com/h1mesuke/textobj-wiw.git'
" 自分でフォークして使っている版
NeoBundle 'vimtaku/textobj-wiw.git'


tcomment_vim

もちろんコメントアウトとかするとおもうんだけど
filetype に応じた comment out を提供してくれるのですごく便利。
visual mode で go とかするとできるように設定している。
なぜ go に設定しているかは謎。

NeoBundle 'tomtom/tcomment_vim.git'


text-obj-sigil

拙作でもうしわけないんですけどこれ。
$hoge とか $hoge->fuga とか $meso{ $hoge->{'fuga'} } とかを
text obj として扱うことができる。

see also: http://d.hatena.ne.jp/vimtaku/20110703

NeoBundle 'vimtaku/vim-textobj-sigil.git'


text-obj-doublecolon

拙作でもうしわけないんですけどこれ part 2。
use Hoge::Fuga::Meso::Piyo;
とか結構書いたりするんだけど :: で繋がっている部分を
text-obj として扱うことができる。
実は :set iskeyword+=: とかすると同じようなことが出来るんだけど
Hoge の部分を yank したりするのが辛くなるので便利。
(textobj-user は神plugin)

NeoBundle 'vimtaku/vim-textobj-doublecolon.git'


text-obj-between

my @list = qw/hoge fuga piyo/;
とか書くときにすごくhoge fuga piyo 一気に消したくなっちゃう時とかあって、
そういう時に dif/ とかすると消せる。オススメ。

NeoBundle 'thinca/vim-textobj-between.git'


vim-surrond.vim + vim-repeat.vim

いわずもがなだとおもうんだけどこれ。
textobj を char で囲むことができる。
siw{ と siw} の違いは意外に知られていない事実の予感なのでいちおうかく。
siw{ だと { hoge }, siw} だと {hoge} となる。
つい癖でsiw{ を押してしまって space を x で消す というのを何度もやってる。

NeoBundle 'tpope/vim-surround.git'


perldoc.vim

:Perldoc -f sprintf
とかしていい感じに見れる。
たまに使う。
mattn さんの記事を見ていれた。
http://mattn.kaoriya.net/software/lang/perl/20100901231137.htm

NeoBundle 'mattn/perldoc-vim.git'


operator-replace.vim

これもあちこち言及されてる気がするけど本当に便利。
yank しているものを text-obj の部分と入れ替えることができる。

NeoBundle 'kana/vim-operator-user.git'
NeoBundle 'kana/vim-operator-replace.git'


alignta.vim

my %hoge = (
    hoge => $hoge,
    fugafuga => $fugafuga,
    piyo => $piyo,
);

とか書くじゃないですか。たくさん。
visual mode とかで選択範囲を => って打つと
いい感じに整列できるようにしているのでこれはオススメだ。

" for alingta
vnoremap <silent> => :Align @1 =><CR>
vnoremap <silent> = :Align @1 =<CR>
vnoremap <silent> == =

こんな感じに設定している。

NeoBundle 'h1mesuke/vim-alignta.git'

基礎コマンド編


g; or g,
最後の編集した箇所に戻ってくる。
上の方とか行って戻ってくるときに使う。ないと死ぬ。



gu or gU
text obj を upper case , lower case に変換できる operator。



ciW
何故か基礎的なコマンドなんだけどなぜか昔全然使えてなかった。
hoge fuga みたいな space
で囲まれている部分とかを消すときに使う。カジュアルに。



gJ
space をいれないで 文字列の連結を行うことができる。
J も gJ も両方使える。



_
normal mode で行頭に行くときは何派が多いのだろうか。
_ はかなり便利だ。
0 は遠いし, 文字の先頭に行ってくれないので。



insert mode で=数式
1298 + 3819 みたいな計算をたまにしたい時があるけど
insert mode で =1298 + 3819= とかで
計算できて嬉しい, みたいな。



"で"レジスタの内容を貼付けることが出来る。
:reg とかでレジスタを確認して
4 とかをおして見ると何かと便利。
", / は特に日頃よく使っているので
これはしっておくとかなりいいと思う。


dit
hoge
tag の text-obj だよっていうだけ。


ぜひ設定しておいてほしい設定

set listchars=tab:>-,trail:-,nbsp:-,extends:>,precedes:<,

末尾のspace とか tab と space の混在とか
そう言うのを可視化して減らすことができる。
経験上 IDE で書いていると結構 space とか入っちゃう気がする。
神経質な人間にはオススメしない。いや逆か?
(僕もはっきり言って曖昧なので細かいオプションは :help 見てください)


こっからは好み, .vimrc 編

nnoremap : q:a
nnoremap / q/a

ujihisa さんが教えてくれたやつ.
これは/ とか押したときに command line window をひらいて
そこで vim を使えるようにできるからおすすめ。

set scrolloff=10

スクロールするときにいちいち画面の一番上とかに行かなくても
スクロールが開始されるので source reading しやすい。

" paste yanked string vertically
vnoremap <C-p> I<C-r>"<ESC><ESC>

の時に とか押すと vertical に paste ができる。
意外にそういう時ってあるとおもうんですよ。

nnoremap <C-h> :noh<CR>

help 派が多い気がするんだけど実際 help 引くより
コード読んだりする時間のほうが僕の中では圧倒的に多いので
かなりおすすめの設定。:noh って打つの大変だし。

" for masui special.
noremap g<CR> g;
nnoremap <CR> :<C-u>w<CR>

増井 俊之さんっていう方が考案したとまことしやかに囁かれている
Enter と semicolon を入れ替える技術があるんだけど、
僕も懐疑的にそれを使ってみて抜け出せなくなったパターンで、
自分が使うマシンは常にそれを設定している。
(mac ならkeyremap4Macbook, win なら 窓使いとかのどかとかで)

上記の設定でnormal mode の Enter を押すだけで保存できるようになっている。
:w は昔は律儀に押していたけど最近は keyboard 的にsemicolon を押すだけで
保存されるという感じになっている。オススメ。


" qでウインドウを閉じて Qでマクロ
nnoremap q :<C-u>q<CR>
nnoremap Q q

code を読むときはtab で展開するんだけど意外に閉じたりすることも多く、
:q が結構面倒くさくなってきていた。
(vimperator を使う方ならわかると思うけど d で tab
を消せるのが意外に便利だったりする。)
なので普段頻度が高いわけでもないマクロのq を Q に置き換えて
q を buffer を閉じるにした。マジ便利。


所感
自分のこだわりな設定をかなり書けた。割とこだわって厳選した。

Neobundle で一応書いている部分は依存関係が書かれていないので
エラーとか言われるかもしれない。

最後に
社内の人にそこまで vim に詳しいなら vim に還元しろって言われたので
vim advent calendar 2012(http://atnd.org/events/33746)
に勢いで登録してしまいました。
ネタ(plugin かなぁ)を勢いで作んなきゃなァ。

「これをみている人たちも参戦すればいいと思うよ!」
こうささやくんだ、俺のゴーストが。

mixi graph api にアクセスする vim-script 書いた

成果物
https://github.com/vimtaku/mixi-graph-api

そこそこ頑張ってドキュメント書いたからこちらも。
https://github.com/vimtaku/mixi-graph-api/blob/master/doc/mixi-graph-api.txt

背景
mixi graph apivim から投げたい時だってあるやん? と思って作った。


概要

基本的にはドキュメントに書いたとおりなんだけどちょっとだけ書くと以下のようになる。

 :MixiGraphApiDoAuthorize 'r_profile'
 " ってしたら browser がひらいて URL の code parameter から code を取得して

 :MixiGraphApiGetAccessToken "5b2af8ce811fd3ff7bb5d93e391fc857f4f8b9b8"
 " って感じで code を指定したのを投げたらこんなんが帰ってくるので
 "  {'header': ['HTTP/1.1 200 OK',
 "      'Date: Tue, 01 May 2012 07:20:15 GMT',
 "      'Server: Apache', 'Cache-Control: no-store',
 "      'X-MIXI-GRAPH-API-SPEC: 131072', 'Va'],
 "   'content':
 "       '{"refresh_token":"some_refresh_token",
 "       "expires_in":900,
 "       "access_token":"2199f67266d20a5d00dcb4fda135570957df205f",
 "       "scope":"r_profile"}'}

 :MixiGraphApiPostPeopleAPI "2199f67266d20a5d00dcb4fda135570957df205f"
 " って感じで access_token を指定して people api に投げられますよ
 " 結果はこんな感じ
 "      {'header': ['HTTP/1.1 200 OK', 'Date: Tue, 01 May 2012 07:23:21 GMT',
 "          'Server: Apache', 'Content-Length: 284',
 "          'X-MIXI-GRAPH-API-SPEC: 131072', 'Vary: '],
 "       'content': '{"entry":{
 "              "thumbnailUrl":"http://profile.img.mixi.jp/hogehoge5.jpg",
 "              "id":"some_hash_id",
 "              "profileUrl":"http://mixi.jp/show_friend.pl?uid=some_hash_id",
 "              "displayName":"your display name"
 "          },"startIndex":0,"itemsPerPage":1,"totalResults":1}'

課題
まだpeopleAPIしかない!笑


API が数多くあるのでそのへんをscript に書くのは骨が折れるので
これから必要になった時に足していきます!
もし協力してくださる方がいたら大歓迎です!


あと、最初に authorization_code 取得するところでリダイレクトされる値ってなんとかなるんかな。
そのままスクリプトで取れれば一気に行けるんだけどなぁ。


所感
ほとんど curl でやってんのと変わんなくない?
(それを言っちゃアおしまいだよ 国民的ネコ型ロボットの声の体で)

ハッシュのkeyとvalueを選択するvim-textobj-keyvalue を書いた

成果物
https://github.com/vimtaku/vim-textobj-keyvalue

背景
たまにだけど key と value を取りたい時があるので作った。
dak,dik, dav,divなどで key と value が取れる。
(dawとかと違って移動しながら範囲を選択できる)

概要

    var map = { 
        'somekey' : 'somevalue',
          ^ here is cursor
    };  
    then
    var map = { 
        'somekey'       : 'somevalue',
        ~~~~~~~~~
         ^ this range is selected.
    };  

所感
多分そこそこ便利、、かなぁ。。まぁ使ってみる。。

今度はこれのoperatorも作ってみたいと思っているのでまた今度作る。

モードレスな日本語入力方法 vim-mlh を作っている

追記(2012-5-1) undo周り強化、再変換機能追加した
文字入力中にundoしたくなる時とかよくあったし、diwとかciwとかbとか使いやすいので
undoの履歴にローマ字を入れるようにした!
これによって再変換とかが容易になった!

追記(2012-4-30)
アップデートした!
skk.vimSKK-JISYO.Lを用意して、
以下を.vimrc に追加してやれば、

let g:skk_control_j_key = ""
let g:skk_large_jisyo = "$HOME/local/dict/SKK-JISYO.L"

skk-jisyoの候補がでるようにした!
便利!これでgoogleTransliterateAPIが厳しめにちょっとしか候補返さなくても
skk辞書から引っ張ってこれるのでいい感じ。
名前とかでも多分大丈夫!まだ全然使ってないけど!
詳しい方法はdocを見てね。
https://github.com/vimtaku/vim-mlh

追記(2012-2-11)
なぜかたまに変換できないという完全に致命的なバグを直した!
unite.vimを使っているときは動作しないようにした!


追記(2011-12-31)
変換方法が変わります。/だけだったらpathとか打つときに色々困るので
/で変換が走るようにします。っていうかもともとmlhはそのようでした。


これは何?
vimで日本語を入力するときに直接入力とかな入力を
意識しないで日本語を入力することのできる
モードレス日本語変換ツールです。

モトネタはこの辺
http://axion.ee.uec.ac.jp/japanese/tools/emacs/mlh.html

具体的には
nihonngowonyuuryokusitaidesu
などとローマ字で入力したあとに
/を入力することによって
「日本語を入力したいです」に
変換することができます。
モードレスとかいっておきながらでmlhをオンにしないといけません。
この辺はもうちょっと考える余地があります。

vimテキストエディタです。
と、半角を含む文字列を打ちたい場合は
vimq/hatekisutoedhitadesu./とすればオッケーです。

動画
firefoxで見れない疑惑
http://dl.dropbox.com/u/45612210/vim_mlh_movie.m4v


背景
コレを作るに当たってemacsにはmlhというメチャクチャマイナーな
インプットメソッドがあると@shmorimoさんに聞いて
vimで作ればいいじゃないと言われたのでつくってみました。

メリット
- コレを使うことで日本語の直接入力とカナ変換をいちいちする必要が無い!

気をつけなければならないこと
- google日本語(webapi)に頼っているのでネット環境がないとうごかない
- vim7.3のパッチをキチンと当てないと補完が何故か二つ目に行ってしまって全く使いものにならない(パッチを当てればオッケー)
- タイピングが正確な人じゃないとおそらく使いこなすのは難しい
- utf8 のことしか考えていません


謝らなければならないこと
- vimscriptのいろはを分かっているわけではないので爆発しろなコードがたぶんたくさん
- mattn_jpさんの書いていたgoogletranslate.vimを盛大にパクっている
- kaoriyaさんの書いていた日本語とアルファベットの対応辞書を盛大にパクッている
- 自分で改変もしている


モードレスについての考え方
vimはmodeが美学でmodelessなのは何がいいのかと言われそうですが僕はそれぞれの良さがあると思っています。
ソースを書く時は 文字列を盛大にコピーしたり行を消したり結構色々なことをやらなければなりません。
そんな時は入力するときは入力するとき用のモードで、移動するときはnormal modeというようになっていたほうが
圧倒的に便利だと思っています。
それに比べて入力、および変換に関しては単純なこと動作しか必要としていないので
日本語入力と直接入力をいちいち切り替えるのは結構手間かなと思います。


ソースコード
https://github.com/vimtaku/vim-mlh
※要web-api.vim

今後のTODO
- 沢山のバグフックス
- google日本語入力を普通にサーバ立ててやる方法を模索する
- ネオコン連携とかできたらいいかも


所感
使ってみてくれたら嬉しいです!
skk は便利と聞きますが僕は入力はよりシンプルのほうがいいと思っています。
頭で入力する文字を考えて打つより高確率で自分の求めるモノを予測してもらえた方が
簡単なのではないかと考える為です。
skk はなれるまで使っていないのでなんとも言えませんが
vim-mlhはきちんと使えば(作れば)ものすごくいい物になるんじゃないかなと思いました。
クオリティ上がればもっと使うのにとか
モットこういう機能がほしい!とかあったら頑張ります!
(いまは最低限のものしかいないし)

Vim Advent Calender2011 で行ったほうがいいか迷ったけど
まぁイイじゃないと思って書いている。後悔はしないぜ
結局vimとイチャラブXmasイブ...

TwiscrollっていうTwitterクライアントWebサービスを作った

成果物
Twiscroll
休止中。

これは何?
ROM専用TwitterクライアントWebサービスです。

すげー適当だけど気にしない

なんていうかスマフォって入力がだるすぎるじゃないですか。
そのだるすぎる感じから、あえて入力しないクライアントを
作ってみようっていうモチベーションから生まれたサービス。

特徴

  • 自動スクロール機能
  • 自動ページ読み込み
  • タップでスクロールが止まる(たまにバグる)
  • その他普通のクライアントが普通にできるあらゆることができない

本当の目的
- jquery-mobileをちょっと触ってみたいとおもって

使用したもの

所感
あきらかにプログラム書く時間より設定とかする時間のほうが時間かかってた
プログラム書いた時間と設定や環境構築の割合が2:8くらい、たぶん。

正直機能的にまだ足したい部分めっちゃあるけどあんまり思い入れもないので
もういいやっていう勢いでとりあえず公開することにした。
機能的に明らかにこれが足りなくて泣きそうってなったらなんか機能たすかもだけど
基本的に完成。
なんかまずかった何かを見つけたら突然終了するかも。

たぶんWebサービスを作る素地(環境)ができたので良かったと思う。


最後に一言
やっぱThinkpad最高だわー安くてもかなりいいわー