2012/10/22


私も結構長くvimを使ってきましたが、実はsnippet系やsorround系のプラグインは殆ど使っていません。理由は入力の規則が多様すぎて覚えられないのと、それくらい手で入力出来るんじゃないか...と思っていたのが理由でもあります。
sorround.vimなんかは何度か常用をチャレンジしてみましたが、結局諦めました。
先日、zen-codingを見つけ、「へー便利そうだなぁ」と思ったと同時にこのくらいならvimscript(pure vimscript)だけで書けるな...と思ったので書いてみました。
と言ってもEmacsへの移植なんかと同様に「Expand Abbreviation」だけです。
正直言うとzen-codingのプロジェクトページにvimがラインナップされていなかったのがキッカケだったりもしますが...。ただ、後から知ったのですがsnipMateという物でzen-codingらしき事が出来るらしく、またsparkupというプラグイン(python拡張使用)でzen-codingと同等の事が出来るらしいのです。
しまった...とも思ったのですが残念ながらそれを知ったのが完成間近だったので、思いっきり後出しジャンケンになってしまいました。
でももったいなかったので紹介しておきます。

zen-codingとはHTML/CSSを入力するのに便利な機能で、どんな物かはこの辺を見てもらえると分かるかと思います。
以下、vim版の動作として紹介します。
キーバインドはzen-codingの移植先エディタによって異なります。

例えば、「よーしパパ、今日はHTML5書くぞ!」って時には html:5_ "_"はカーソル位置(挿入モード)です。
までタイプして<c-y>,とタイプすると <!DOCTYPE HTML>
<html lang="en">
<head>
    <title></title>
    <meta charset="UTF-8">
</head>
<body>
    _
</body>
</html>
こんな感じに展開されてママもご機嫌です。これだけだと単なるsnippet機能でしかありませんが、例えば「じゃぁ今度はid属性が"foo"のDIVにclass属性が連番でbar1,bar2,bar3ってなる様なアンカー作るぞ!」って時には div#foo > a.bar$*3
とタイプして、おもむろに<c-y>,をタイプします。すると
<div id="foo">
    <a href="" class="bar1">_</a>
    <a href="" class="bar2"></a>
    <a href="" class="bar3"></a>
</div>
と展開されママもニコニコ、もう夫婦円満間違いなしです。
zen-codingとしてはほぼ完成してます。ただ上記で言った様にsparkupを見つけて悔しかったのでsparkupが採用している拡張記法もサポートしてみました。
たとえば a[href=index.html]{Home}
こんなのが <a href="index.html">Home</a>
この様に展開されたり #header > ul > li < p{Footer}
こんなのが <div id="header">
    <ul>
        <li>_</li>
    </ul>
    <p>Footer</p>
</div>
こんな風に展開されたりします。一応、現状sparkupと同様にzen-codingの上位互換でありながら、sparkupの拡張記法も使える様にしました。
更に変数 g:user_zen_settings を設定する事で自前の snippet や展開式を書く事が出来ます。
例えばperlであれば
let g:user_zen_settings = {
\  'perl' : {
\    'indentation' : '  ',
\    'aliases' : {
\      'req' : "require '|'"
\    },
\    'snippets' : {
\      'use' : "use strict\nuse warnings\n\n",
\      'w' : "warn \"|\";",
\    }
\  }
\}
こんな風にしておき
(perl専用のindentationの位置はperlの下です。)
w<c-y>, と挿入モードでタイプすると warn "_";
と展開されてメシウマウマです。


使っているvimでpython拡張が動かなかったり、夫婦仲がピンチって方、お一つどうでしょうか。
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



2012/10/19


Jekyllを使っていていつも思うのが、githubの様な ```perl
use strict;
use warnings;

warn "foo";
```
という Triple Backtick が使えない事なんだけど、まぁこれは Markdown の仕様に準拠していない拡張なのでしょうがないと思いつつも、最近 github に慣れすぎていてイライラしてきた。Jekyll Plugin では Markdown の変換をプラグインとして書くことは出来ないので、Jekyll::MarkdownConverter の convert メソッドを上書きしてやるプラグイン(と呼べるかどうかはあるが)を書いた。
module Jekyll
  class MarkdownConverter
    alias :old_convert :convert
  
    def convert(content)
      content.gsub!(/(?:^|\n)```(\w*)\n(.*?\n)```\n/mdo |text|
        cls = $1.empty? ? "prettyprint" : "prettyprint lang-#{$1}"
        "\n<pre class=\"#{cls}\"><code>#{CGI.escapeHTML($2)}</code></pre>"
      end
      old_convert(content)
    end
  end
end
これを _plugins/triple-backtick.rb として入れておけば、Google Code Prettify が検知できるクラス名を付けてコード出力してくれ、みんな大好き ``` が使える様になって幸せになれる。
ちなみにこの方式を使って、maruku や redcloth で出力させたい場合はLiquidのコンバータまでさかのぼって上書きしないといけなくなるので諦めた。
Posted at by




pythonの補完は、vimが標準で配布している物で事足りるかなーとか思ってたけど浅墓すぎた。
今日見つけた jedi-vim は良い。
davidhalter/jedi-vim - GitHub

Using the jedi autocompletion library for VIM.

https://github.com/davidhalter/jedi-vim
何が良いって精度が良い。そして標準配布の pythoncomplete がモジュールとそのモジュール内関数しか補完出来ないのに比べ、jedi は評価値を補完出来る。
そしてスゴイのが構文を仮実行しているのではなく、パースしている点。jedi というモジュールを使って、構文解析している。

davidhalter/jedi - GitHub

Awesome autocompletion library for python. It works.

https://github.com/davidhalter/jedi
なので例えば import time

class Foo():
  global time
  asdf = time
  
def asdfy():
  with open("foo.log""w"as f:
    f.write("fooooo")
  return Foo

xorz = getattr(asdfy()(), 'asdf')
xorz.
こんなコードを補完してもゴミファイルが出来たりしない。そして vim script で頑張る pythoncomplete に比べて速い!
上のコードから
さらに関数のヒントまで表示される。
ただ1点だけハマりポイントがあって、この ftplugin はオフィシャルの pythoncomplete とバッティングし得る。先に jedi.vim が読まれる場合、後の pythoncomplete.vim を読ませない為に autocmd FileType python let b:did_ftplugin = 1
この様に b:did_ftplugin を設定してやる必要があった(これは後でpull-req送るかも)。また quickrun のキーアサイン <c-r> ともバッティングするので最終的には jedi の為に以下の設定をした。
let g:jedi#auto_initialization = 1
let g:jedi#rename_command = "<leader>R"
let g:jedi#popup_on_dot = 1
autocmd FileType python let b:did_ftplugin = 1
このキーアサインは、関数名やクラス名をリネームする物で、名前変更後にインサートモードを抜けるとファイル内のシンボルが置き換えられる。調べてないが、構文解析しているので単なる置換ではなく正しいリネーム結果になるはず。試しに上記のコードで文字列内に xorz を埋め込み、xorz をリネームしてみたが文字列内の xorz が置き換わる事は無かった。すばらしい。
その他、pydoc が見れる機能やジャンプ機能もある。しばらく使ってみようと思う。

みんなのPython 第3版 みんなのPython 第3版
柴田 淳
SBクリエイティブ 単行本 / ¥1 (2012年08月25日)
 
発送可能時間:

Posted at by