2011/11/25


禅全国1億8千万人のzen-codingファンの皆様、如何お過ごしでしょうか。
先日の記事zen-codingをpure vimscriptに移植した「zencoding.vim」をご紹介させて頂きました。
あの時は略語の展開(Expand Abbreviation)しか機能がなく物足りなかったかもしれません。まぁ殆どの移植品はExpand Abbreviationしか無いのですが。

zen-codingには他どんな機能があるかというと、実はまだ便利な機能があったりします。 オフィシャルのサイトによると
  • Expand Abbreviation
  • Wrap with Abbreviation
  • Balance Tag Inward/Outward
  • Go to Next/Previous Edit Point
  • Update Image Size
  • Merge Lines
  • Remove Tag
  • Split/Join Tag
  • Toggle Comment
とあります。日本とだと以下のサイトが分かりやすいです。
Zen-Codingのショートカットをまとめてみました - EC studio デザインブログ

前回の記事ではZen-Codingの導入方法について解説しました。今回はZen-Codingの機能とそれを実行するためのショートカットの解説をします。

http://designblog.ecstudio.jp/htmlcss/zen-coding-shortcut-key.html
以前までのzencoding.vimが対応していたのは一番上のExpand Abbreviationだけです。
ここ数日、zencoding.vimのコードを弄りまくって、残りのあと少しで100移植出来る所まで来ました。

以下チュートリアル的なものを書いておきます。

Expand Abbreviation

まずは略語展開。もう皆さん知ってると思いますが
div>p#foo$*3>a{こんにちわ}
と書いて<c-y>,(コントロールとyを押してカンマ)をタイプすると <div>
    <p id="foo1">
        <a href="">こんにちわ</a>
    </p>
    <p id="foo2">
        <a href="">こんにちわ</a>
    </p>
    <p id="foo3">
        <a href="">こんにちわ</a>
    </p>
</div>
と展開してくれる機能です。括弧によるグルーピングもサポートしています。

Wrap with Abbreviation

ラップを作成する略語展開です。
おはよう
こんにちわ
こんばんわ
とあるテキストをビジュアル選択して<c-y>,をタイプすると「Tag:」とタグを聞かれます。ここにラップするタグを記述します。 Tag: bq とすると <blockquote>
おはよう
こんにちわ
こんばんわ
</blockquote>
といった感じにラップしてくれます。また Tag: ul>li*>a>span とすると <ul>
    <li>
        <a href=""><span>おはよう</span></a>
    </li>
    <li>
        <a href=""><span>こんにちわ</span></a>
    </li>
    <li>
        <a href=""><span>こんばんわ</span></a>
    </li>
</ul>
こんな感じになります。便利す。

Balance Tag Inward/Outward

タグの外側、内側を選択します。
<ul>
    <li>
        <a href=""><span>おはよう</span></a>
    </li>
    <li>
    _   <a href=""><span>こんにちわ</span></a>
    </li>
    <li>
        <a href=""><span>こんばんわ</span></a>
    </li>
</ul>
上記"_"の位置にカーソルがある状態で<c-y>dをタイプすると <ul>
    <li>
        <a href=""><span>おはよう</span></a>
    </li>
    <li>
        <a href=""><span>こんにちわ</span></a>
    </li>

    <li>
        <a href=""><span>こんばんわ</span></a>
    </li>
</ul>
こんな感じに選択してくれます。もちろん<li>の前で実行すると<ul>全体が選択されます。なお、タグの内側で実行するとタグ自身が選択されます。
これとは逆にタグを含まないで中身のみを選択する場合には<c-y>Dをタイプします。

Go to Next/Previous Edit Point

編集位置へカーソルを移動します。<c-y>nで空の属性値や中身が空のタグ内側へジャンプします。逆向きは<c-y>Nです。

Update Image Size

IMGタグの画像サイズを更新します。
<img src="http://mattn.kaoriya.net/images/logo.png"/>
この様なIMGタグの上で<c-y>iをタイプするとwidth/heigth属性を埋めてくれます。ローカルのファイルだと絶対パスもしくは編集中のファイルからの相対パスが扱え、URLも対応しています。
<img src="http://mattn.kaoriya.net/images/logo.png" width="96" height="96" />
こんな感じです。ちなみにvimが不得意とする
<img id="foo" src="logo.png"/> <img src="github-logo.png" class="bar" />
<img src="http://mattn.kaoriya.net/images/logo.png"/>
この様な1行複数個のIMGタグでも正しく動作します。
この画像ファイルを扱う部分だけperl拡張を使いました。モジュールとしてはImage::Infoが入っていれば動くはずです。ちなみにこの機能さえ使わなければ、別にperl拡張が入っていなくても良いです。

Merge Lines

これはvimだけの機能で出来るので実装していません。ビジュアル選択してJですね。

Remove Tag

以下の様なHTMLで「cursor is here」の部分にカーソルがあった場合 <div class="foo">
    <a>cursor is here</a>
</div>
<c-y>kをタイプすると <div class="foo">
    
</div>
となり、さらに<c-y>kをタイプすると
となる機能です。

Split/Join Tag

先ほどと同様のカーソル位置で <div class="foo">
    <a>cursor is here</a>
</div>
<c-y>jをタイプすると <div class="foo"/>
となります。なお、このdivタグの上で再度タイプすると今度は <div class="foo">
</div>
と分割されます。

Toggle Comment

タグの上で<c-y>/をタイプするとそのタグ全体をコメントアウトしてくれます。
<blockquote>
    <a href="">aaa</a>  
</blockquote>
このHTMLのaの上でタイプすると <blockquote>
    <!-- <a href="">aaa</a> -->  
</blockquote>
となり、aの前あたりでタイプすると <!-- <blockquote>
    <a href="">aaa</a>  
</blockquote> -->
となります。

おまけ1

URLの上で<c-y>aをタイプするとHTMLを取得してきてアンカータグを作ってくれます。
http://www.google.com/
これが <a href="http://www.google.com/">Google</a>
こうなります。

おまけ2

おまけ1とさほど変わりませんが... URLの上で<c-y>Aをタイプすると本文抽出して引用文を作ってくれます。
http://www.google.com/
これが <blockquote class="quote">
    <a href="http://www.google.com/">Google</a><br />
    <p>広告掲載 - ビジネス ソリューション - Google について - Google.com in English&copy;2010 - プライバシー ...</p>
    <cite>http://www.google.com/</cite>
</blockquote>
こうなります。ほぼ俺様用!

100% zen-coding 互換まであと少しです。
mattn's zencoding-vim at master - GitHub

zen-coding for vim: http://code.google.com/p/zen-coding/

http://github.com/mattn/zencoding-vim

Posted at by



2011/11/24


今まで僕はvimのstatuslineに値を設定した事は無かったんだけど、githubに置いてある色んな人のvimrcを見てると結構多くの人がstatuslineを設定してて、これってもしかして便利なんじゃ...と思って設定してみた。ただ、なんか味気ないなーという気がしたので、ステータスラインで「ハァハァ」出来るプラグインを書いた。

mattn/hahhah-vim - GitHub

ハァハァ statusline for vim

https://github.com/mattn/hahhah-vim

タイピングしたりカーソルを移動すると、ハァハァしてる顔がクルクル回ります。

ハァハァ

これはすごい!

さらに何かvim内でエラーが発生すると、しばらくの間「工エェ」なステータスラインになります。

エェェ!

斬新!

ぜひお役立て下さい。

Posted at by




日本語を扱っていて困るのがgrep。正規表現パターンにマルチバイト文字を混ぜられなかったり、windowsで動かすと"表"の様に2バイト目にbackslashが混じる文字で動作しなくなったりします。
さらに複数のエンコーディングで書かれたファイルが散らばっていると一度のgrepで検索出来なかったりもします。
vimに限っては、内蔵のvimgrepを使う事で解決出来ますが、見つかったファイルをバッファに開いてしまうという挙動がある為、grepオリジナルの動作を求めている人にとっては都合の悪い物だったりもします。

vimgrepの様に複数のエンコーディングに対応していて、検索パターンにマルチバイト文字を含んだ正規表現が使えて、windowsでもちゃんと動いて、ついでといっちゃあなんだが、"**/*.txt"で再帰検索してくれる様なgrep無いかなぁと思ってたんですが、やっぱり無いので作りました。
こういう処理、実はGo言語が得意でして、意外と短いコードで書けてしまったりします。
もちろんバイナリが吐けるので配布も簡単。
mattn/jvgrep - GitHub

grep for japanese vimmer

https://github.com/mattn/jvgrep
内部ではgo-iconvという、元々別の方が作ったiconvモジュールをwindowsでダイナミックローディング対応させ使っています。もちろんスタティックリンクなので別途調達する必要もありませんが。なお、windows上での動作にはiconv.dllかlibiconv.dllが必要です。
Go言語の開発環境を持っていらっしゃる方ならば、最新までバージョンを上げて頂いた後 # goinstall github.com/mattn/jvgrep
として頂いたらインストールしてくれます。go-iconvが依存物としてインストールされますが、linux等ではiconvのヘッダおよびライブラリが必要になりますので注意です。windowsはダイナミックローディングしているので必要ありません。
ちなみに、win32版のみ最新版のjvgrepをダウンロード出来る様にしてあります。上記リンクから"Downloads"をクリックして"jvgrep-win32.tar.gz"を落とし、解凍して下さい。iconv.dllを同梱しています。ウィルスチェック済み。

使い方は普通のgrepです。 # jvgrep 表[現示] *.txt
この様に日本語で、しかもwindowsだと誤動作するダメ文字にも対応しています。
まぁGo言語は内部では全てutf-8なので、当たり前ですが。
尚、Goのregexpパッケージがまだ発達途上なので":alpha:"の様な文字クラスは使えません。使いたい人は今すぐGo Developer Teamに参加してpatchを書いて下さい。(使える様になりました)

vimmer向けに # jvgrep 表[現示] **/*.txt
という使い方も出来ます。 オプションは現状ありません。出力結果はgrepで"-n"オプションを付けた時の出力内容に合わせてあります。
サポートしているエンコーディングは
  • iso-2022-jp-3
  • iso-2022-jp
  • euc-jisx0213
  • euc-jp
  • utf-8
  • ucs-bom
  • euc-jp
  • eucjp-ms
  • cp932
と、ほぼ全ての日本人向けエンコーディングに対応出来ています。
仕組みはvimと同じです。 vimからは set grepprg=jvgrep
とvimrcに書けば使えます。
:grep 表[現示] **/*.txt
といった感じにお使い下さい。
Posted at by