Home

Vim-users.jp

Vim Advent Calendar 2012 ujihisa 8

Vim Advent Calendar 2012 の120日目の記事です。 昨日はmanga_osyoさんによるtextobj-multiblock つくったでした。この記事にもあるように、Vim Advent Calendar 2012はまだまだ執筆者を募集中です。

ところで、二日ほど前にLALR(1)の言語の構文解析をVim scriptで行うという記事があったのを覚えておいででしょうか。

vim scriptで字句解析!と組み合わせて使っていただければいろいろできるかもしれません。

というわけで、実際にやってみましょう。今年のVim Advent Calendarの2つの記事をまとめた集大成です。

ゴール

s:calc('1 + 2 * (3 + 4)')
#=> 15

となるような関数s:calcを持つファイルcalc.vimを作ります。足し算より掛け算の方が演算子結合順序が強く、また括弧もあるというものです。

一旦トークン列に分解し、その後パースしつつ各ノードを評価してひとつの値に畳み込む、という一般的かつ簡単な方法でやっていくことにしましょう。

Lexer

まずは字句解析です。ひとかとまりの文字列を、トークンのListに変換します。

http://qiita.com/items/a5ead41d4a1d4cbaeb74

rbtnnさんが作成したVital.Lexerを用います。vitalを用いるので、まずは開発用に&rtpに入っているvitalをそのままvital#of('vital')を通して利用しましょう。

lexer.vim

let s:L = vital#of('vital').import('Text.Lexer')
let s:rule = [
      \ ['id','\d\+'], ['whitespace','\s\+'],
      \ ['pls', '+'], ['ast', '*'],
      \ ['l_pare', '('], ['r_pare', ')']]
function! s:lex(str)
  return s:L.lexer(s:rule).parse(a:str)
endfunction

かなり短くかつ宣言的に記述することができました。

echo s:lex('1 + 2 * (3 + 4)')

を行うと

[{'label': 'id', 'col': 0, 'matched_text': '1'},
 {'label': 'whitespace', 'col': 1, 'matched_text': ' '},
 {'label': 'pls', 'col': 2, 'matched_text': '+'},
 ... ]

といった辞書のリストが得られます。無事字句解析ができているようです。

さて、読者皆様はparse()関数の突然の登場に面食らったのではないでしょうか。この関数は構文解析器とは何の関係もありません。この名前が非常にまぎらわしいとのことで、vitalのissueにチケットを作成しておきました。 https://github.com/vim-jp/vital.vim/issues/48

Parser

続いて構文解析です。

http://uwanosora.hatenablog.jp/entry/2013/03/28/000633

uwanosoraさんが作成したkp19ppはC++で記述されており、g++makeがあればビルドできます。実際に必要なのは生成されるkp19ppコマンドです。

自分でインストールしてPATHを通すのが面倒に感じた読者の方もいらっしゃることでしょう。そんなこともあろうかと、Gentoo用にパッケージ化しておきました。ぜひご利用ください。

https://github.com/ujihisa/overlay

このoverlayを追加して

$ sudo emerge kp19pp

すると/usr/bin/kp19ppが利用可能になります。

kp19ppは独自の言語です。kp19pp用の簡単なsyntax / indent / ftdetect / ftpluginをセットにしたプラギンを作っておきました。これを用いることでパーサを簡単に記述できるようになります。

https://github.com/ujihisa/ft-kp19pp.vim

さあ早速パーサを記述しましょう。

parser.vim.kpg

<token_desc> token{
    <left>{
        ast;
        pls;
    }
    l_pare, r_pare;
    id<type_expr>;
}

<grammar> grammar{
    E<type_expr>
        : [make_pls] E(0) pls E(1)
        | [make_mlt] E(0) ast E(1)
        | [make_exp] l_pare E(0) r_pare
        | [make_id]  id(0)
        ;
}

Advent Calendarの該当記事からそのままもってきました。さあこれからVim scriptを生成しましょう。

$ kp19pp -vimscript parser.vim.kpg parser.vim

これでVim scriptのparser.vimファイルが生成されました。つづいて各アクションmake_plsなどを記述しましょう。

let s:semantic_action = {}
function! s:semantic_action.make_mlt(arg_0, arg_1)
    return a:arg_0 * a:arg_1
endfunction

function! s:semantic_action.make_pls(arg_0, arg_1)
    return a:arg_0 + a:arg_1
endfunction

function! s:semantic_action.make_id(arg_0)
    return a:arg_0
endfunction

function! s:semantic_action.make_exp(arg_0)
    return a:arg_0
endfunction

function! s:semantic_action.syntax_error()
    echo 'error!'
endfunction

これで構文解析器と評価器は完成です。

結合

Vital.Lexerを用いて作成した字句解析器とkp19ppを用いて作成した構文解析器とそれに適用するよう作成した評価機のすべてを組み合わせましょう。

$ cat lexer.vim parser.vim > calc.vim

つづいてメイン処理です。

let s:p = copy(s:parser)
call s:p.ctor(s:semantic_action)

let xs = s:lex('1 + 2 * (3 + 4)')
call filter(xs, 'v:val.label !=# "whitespace"')
for x in xs
  call s:p.post(s:token[x.label], x.matched_text)
endfor
call s:p.post(s:token.token_0, 0)

if s:p.accept()
  echo s:p.accepted_value
endif

(逐次パーサにトークン列をひとつずつ渡すより前にfilter()で空白文字を削除しています。これは別にforの中で条件分岐しても良いです。)

あとは実行すると正しい計算結果が得られるはずです。:source calc.vimで実行できます。

で、gif動画作ってみました。それなりの長さですので、気を引き締めてお楽しみください。

ujihisa

Vim Advent Calendar 2012 ujihisa 7

Vim Advent Calendar 2012 の116日目の記事です。 昨日はtyruさんによるvim-jpがつないだVimプラグイン開発者とVimパッチ職人&運用者、もしくはなぜ最近Vimコミュニティが活発になったのかでした。この流れをまさに体感しているVim世代としては、とても胸が熱くなり、感極まってきました。

さて、前回以下のような出来事があったのを覚えていらっしゃるでしょうか。

SimCityを無事入手し、それをGentoo Linux上のWineで動作させるため数日間悪戦苦闘し、結局諦めてWindowsを購入しました。しかしオンボードのIntel HD 3000では動作速度が遅く、いまはグラフィックボードの購入を真剣に検討しています。Gentoo Linuxとデュアルブートする予定なので、LinuxからちゃんとGPGPUに使えるようなものにしたいですね。

というわけで購入しました。Radeon HD 7850 (2GB RAM) というやつです。ビデオカード業界には全く詳しくなく、調査するのにとても時間がかかりました。Video CardのVはVimのVです。我々はもっとこの分野にも精通する必要があるのではないか、と感じました。

なお、SimCityのマルチプレイの協力者を募集しています。詳しくはLingrのVim部屋にて。

VimでSQLする

Vim Advent Calendar 2011にはQuickRunからSQLを実行するための設定(MySQL用)という記事がありました。今回のVim Advent Calendar 2012にはまだSQL系の記事はないようなので、最新版の情報をまとめていきたいと思います。

上記記事ではMySQLを用いていましたが、今回はPostgreSQLでいきましょう。Herokuなどで使えます。

quickrunとの連携

上記記事の時点ではquickrunは公式にはSQLをサポートしておりませんでしたが、つい先日公式にサポートされました。このpullreqを送った人はgoodjobです。(なお、個人的にvimrcでquickrunの設定をしている方、内容に汎用性があるなら本家にpullreqを送りましょう。みんなにとって便利になります。)

デフォルトの設定ですと、quickrunを発動すると

$ psql -f 編集中ファイルのファイル名

を実行したのと同じような感じになります。これですとリモートのPostgreSQLに接続できませんし、ユーザ名も指定できません。

接続先の指定やユーザ名の指定をそれぞれ個別に管理してもよいのですが、QuickRunはより薄いラッパであるべきです。ここは単にcmdoptを指定しましょう。(詳しくは:h quickrun-option-cmdopt参照のこと。)

:QuickRun -cmdopt '-u postgres -h example.com'

一回しか実行しないならばこれがわかりやすいですね。が、同じバッファで何度も実行するかもしれません。そのときはb:quickrun_configの出番です。

:let b:quickrun_config = {'cmdopt': '-u postgres -h example.com'}

これで繰り返し使えます。一方、ほとんど常に上記オプションを有効にしたいときは、思い切ってデフォルトにしてしまうのも一つの手です。~/.vimrc

let g:quickrun_config = {} " もしまだよそでg:quickrun_configを設定していないならば。
let g:quickrun_config.sql = {'cmdopt': '-u postgres -h example.com'}

これでよさそうです。

例えば著者はこのような設定をしています

let g:quickrun_config['sql/postgresql'] = {
      \ 'cmdopt': '-h 0.0.0.0 mydb postgres'
      \ }

neosnippetとの連携

quickrunで使うなら、とりあえず仮のテーブルを作って、ごにょごにょし、その後すぐ削除する、といった一連の動作を書きたくなるシーンが多いのではないでしょうか。定型句を何度も書くのは苦痛です。ただでさえSQLは大文字の連続で小指が痛くなるわけで、折角quickrunを使っていてもquickとはかけ離れたものになってしまいます。

定型句、という言葉が来たら、即座に「それneosnippetでできるよ」と答えるのがモダンVim使いと呼ばれて久しいです。neosnippetはSQLも公式にサポートしています。 このコミットをした人はgoodjobです。

cとまで入力すると補完候補に”CREATE_TABLE”とでてくるようになります。それを選択すると

CREATE TABLE <{1:cities}> (
  <`0:name varchar(80), country_name text`>
);
DROP TABLE <|1|>;

ここまで展開されます。あとはジャンプしてプレースホルダを埋めるだけです。

罠とその回避法

quickrunのcmdoptに@という文字を使う場合エスケープが必要です。また、エスケープにもエスケープが必要です。「@を見たらバックスラッシュを3つつける」と覚えておけばだいたい大丈夫でしょう。

よくない例

:let b:quickrun_config = {'cmdopt': 'postgres://user:pass@host/db'}

よい例

:let b:quickrun_config = {'cmdopt': 'postgres://user:pass\\\@host/db'}

まとめ

sql用の無名バッファを開いてその場でサーバへの接続情報を設定し、neosnippetを駆使してコードを即座に書きあげ、quickrunで実行するまでをまとめたgif動画がこちらになります。

おまけ

LingrのVim部屋にPostgreSQLを使うためのLingr Botを配置しました。quickrunのかわりに、Vimからlingr.vimやJ6uil.vimを経由して任意のSQL式を記述し実行でき、便利です。

今後の課題

neosnippetのsql用のスニペットはまだまだ不十分です。皆様からの貴重なpull requestを楽しみにしています!

ujihisa

Vim Advent Calendar 2012は執筆者を募集しています

Vim Advent Calendar 2012 http://atnd.org/events/33746 の執筆予定のキューが尽きかけています。このままでは無事にこの年末をむかえることができません。

* http://www.flickr.com/photos/nlireland/6981593445/

Vim Advent Calendar 2012への参加は、公式ページから投稿するか、LingrのVim部屋で宣言するか、Twitterでhttps://twitter.com/manga_osyoさんに宣言するか、あるいはTwitter上でそれとなく執筆したいむねをほのめかすなどで行えます。

Vim Advent Calendar 2012 ujihisa 6

Vim Advent Calendar 2012 の 108 日目の記事です。 昨日はrcmdnkさんによるVim以外でVimする: Windows編でした。SimCityを無事入手し、それをGentoo Linux上のWineで動作させるため数日間悪戦苦闘し、結局諦めてWindowsを購入しました。しかしオンボードのIntel HD 3000では動作速度が遅く、いまはグラフィックボードの購入を真剣に検討しています。Gentoo Linuxとデュアルブートする予定なので、LinuxからちゃんとGPGPUに使えるようなものにしたいですね。

vitalのData.List.take_while

つい本日、vitalData.List.take_whileという、あるべきはずがなぜかこれまでなかった関数が追加されました。

L.take_while('v:val < 5', [1, 3, 5, 2, 1, 7])
" => [1, 3]

HaskellやClojureなどVim script以外の言語一般に登場する関数で、これは特に無限長のシーケンスをデータ構造としてサポートしている言語で便利です。 上記の例の場合、1 < 5が評価され、3 < 5が評価され、5 < 5が評価され、1と3を集めたものを返すわけですが、ここで大事なのは、2 < 5以降はそもそも計算されないという点です。ですので、安心して重い処理を任せることができます。

Vim scriptでもぜひ活用しましょう。具体的なユースケースとしては、「前半に欲しい情報があって後半に不要な情報があるような出力をする外部プロセスの結果をパースする」ようなときに強さを発揮します。

vital開発方法

今回のData.List.take_whileはいま僕が開発中のプラギンがまさにこの機能を必要としているから実装しました。vitalコミッタに限らず、vimプラギンやvimrcを記述している際に汎用的な処理を見つけた場合、なるべくvitalに委ねるようにしましょう。vital開発チームはpull requestを常に受け付けています。みんなで汎用的な処理を共有し、Vim業界全体に幸福と平穏をもたらしましょう。

vitalの関数はテストコードを記述することがドキュメントを書くことと同程度に推奨されています。テストコードを含む、vital用の関数の追加方法について簡単に説明しましょう。ちょうど先ほど追加したばかりのData.List.take_whileが例になりますね。

まず最初にテストを書きます。このテストは簡単なドキュメントにもなります。

spec/data/list.vim

Context data.list.take_while()
  It creates a list from another one, it inspects the original list and takes from its elements to the moment when the condition fails, then it stops processing
    Should [1, 3] == g:L.take_while('v:val < 5', [1, 3, 5, 2])
    Should [] == g:L.take_while('v:val > 3', [1, 2, 3, 4, 5])
    Should [1, 2] == g:L.take_while('v:val < 3', [1, 2, 3, 4, 5])
  End

  It of course handles list of list.
    should [[1], [2, 3]] ==
          \ g:L.take_while('len(v:val) > 0', [[1], [2, 3], [], [4]])
  End
End

テストを実行し、失敗することを確認します。テストの実行方法についてはvitalのspec/README.mdを参照してください。

つづいて本体を実装します。とりあえず最も単純で、とにかく動作すればよかろうで書きます。

autoload/vital/__latest__/data/list.vim

function! s:take_while(f, xs)
  return s:span(a:f, a:xs)[0]
endfunction

テストが通ることを確認します。

そして

さて、上記実装は大事な要素である「条件を満たさなくなったときは処理を継続せず即座に中断する」という大事な処理が抜けていることに気づかれることと思います。これだと重い処理を安心して任せることができません。

  • 「条件を満たさなくなったときは処理を継続せず即座に中断する」のテストを書く
  • その実装を書く

のpull requestを送ることは、読者への課題とします。

ujihisa

Vim Advent Calendar 2012 ujihisa 5

Vim Advent Calendar 2012 の 103 日目の記事です。 昨日はdetonさんによる日本語のカーソル移動の改善: 文節単位のWORD移動(W,E,B)プラグインと、句読点に移動するmapでした。この記事が投稿されるのは3月13日の予定です。2月上旬、まだ外が寒い時期、SimCity (2013) を予約購入しました。Amazonのダウンロード版です。そして来るSimCity発売日3月5日、特に何も起こらず、Amazonからきたメールを再びチェック、そこにはダウンロード版のパッケージが到着するのは13日、送料は$2くらい、みたいに書かれていました。つらく、長い日々でした。途中、風邪を二回ひきました。

unite-build

unite-buildはuniteのsourceのうちあまり有名でないものの一つです。

https://github.com/shougo/unite-build

この記事の読者の皆様はquickrunについてはおそらく既にご存知でしょう。unite-buildはquickrunのoutputter/quickfixに似て非なるものです。

  • quickrunとunite-buildに共通する性質
    • 別の窓がひらいてそこに求めている出力が届く
    • 非同期実行。結果がじわじわくる
    • エラーがあったときに指定したエラー行にジャンプできる
  • quickrun固有の性質
    • ファイルを保存しなくても実行できる
    • ファイルの保存を前提とした実行は推奨されない (例: プロジェクト全体のビルド & 実行)
  • unite-build固有の性質
    • ファイルの保存が必須
    • そもそも編集中ファイルにあまり関係なくプロジェクト全体のビルドが推奨される

unite-buildはmakeコマンドによるCのコンパイルに対応しています。

vim本体やvimprocの開発などでCを書いている皆様は、ぜひ利用を検討してみてはいかがでしょうか。

repoman

Gentoo LinuxのPortageのために使うebuildファイルを編集するとき、repomanコマンドで

  • 構文エラーなどの基本的にミスを検知
  • そのebuildが利用する予定の外部リソースを取得し、ハッシュ値を計算、Manifestファイルに記述
  • 構文エラーとまではいかないが何か抜け落ちていたりよくない記述をしていたりを検出

が行えます。repomanはカレントディレクトリにあるすべてのebuildファイルを対象とするようです。

これはいかにもunite-buildを使ってくださいといわんばかりのものです。

unite-buildのrepoman対応

というわけで先日unite-buildにpull requestを送り、採用されました。最新版unite-buildを用いてrepomanを用いることができます。ebuildの開発がはかどること間違いなしです。

参考までに著者のunite-buildのrepoman用の設定を記述しておきます。これは<Space>mで編集中ebuildファイルを保存し、repomanで外部リソース取得・ハッシュ値の計算、そしてebuildファイルの検査を行います。

augroup vimrc-ebuild
  autocmd!
  autocmd FileType ebuild nnoremap <buffer> <space>m :<C-u>write<Cr>:Unite -buffer-name=build build:repoman:manifest build:repoman:full -horizontal<Cr>
augroup END

今後の課題

unite-buildのrepoman機能はrepomanの出力する警告メッセージなどを厳密にはパースしておらず、エラー行へのジャンプなどが実現できていません。読者の皆様のパッチをとても楽しみにしています。Gentoo使いでない方もぜひ毎日unite-build経由でrepomanしてみてはいかがでしょうか。

repomanに限らず、いろいろ対応されると便利そうです。ScalaのSBTや、ClojureのLeiningenや、HaskellのGHCなど、未対応のおいしそうな対象がたくさんあります。

ujihisa

Vim Advent Calendar 2012 ujihisa 4

Vim Advent Calendar 2012 の 90 日目の記事です。 昨日はthincaさんによる魔改造でした。ちなみにcleverは大人が子供に「デキる子だねえ」というときや、大人同士が皮肉でずるがしこいなにかを褒めるときに使える便利な単語らしいです。

Scalaとsbt

RubyにおけるRake, HaskellにおけるCabal, ClojureにおけるLeiningen, CにおけるMakeがScalaにおけるSBT (Simple Build Tool)で、これは挙動が他のほとんどのビルドツールよりも複雑なことで有名なデキる子です。毎日愛用しています。

sbt (SBTのコマンド) を起動するには果てしない時間がかかるため、一般にはsbtコマンドを対話モードで起動して、そのプロセスを使い続けるというスタイルが一般的です。つまり、sbtとvimは本質的に同じです。

sbt

:VimShellSendString

VimShellのiexeならびに:VimShellInteractiveで立ち上げた外部プロセスにメッセージを投げる便利な方法として:VimShellSendStringコマンドがあります。これは引数として与えられた文字列または選択範囲を”background buffer”に投げます。

たとえばfiletypeがscalaであるファイルを編集中は、

  1. ファイルを保存する
  2. sbtにcompileメッセージを送って適切にコンパイルできるかどうか確認する

を順にまとめて行う必要がかなり頻繁にあります。

nnoremap <Space>m :<C-u>update<Cr>:VimShellSendString compile<Cr>

などと設定することでワンキーで保存・コンパイルを行うことができ、便利です。quickrunやsyntasticやwatchdogsなどのプラギンと違い、すでにライブラリの読み込みなどが完了して起動しているプロセスを再利用するので、10~30倍くらい高速で動作します。

しかしながら、シェルとしてのVimShellと対話環境としてのiexe窓の両方を開いていると、どちらが”background buffer”なのかが曖昧になるという問題があります。

1 2

失敗している様子:

3

成功している様子:

4

解決

t:スコープの変数、vimshell#interactive#set_send_buffer(), vimshell#interactive#send()の合わせ技で対処します。

function! s:ujihisa_start_sbt()
  execute 'VimShellInteractive sbt'
  stopinsert
  let t:sbt_bufname = bufname('%')
  if !has_key(t:, 'sbt_cmds')
    let t:sbt_cmds = [input('t:sbt_cmds[0] = ')]
  endif
  wincmd p
endfunction

command! -nargs=0 StartSBT call <SID>ujihisa_start_sbt()

function! s:sbt_run()
  let cmds = get(t:, 'sbt_cmds', 'run')

  let sbt_bufname = get(t:, 'sbt_bufname')
  if sbt_bufname !=# ''
    call vimshell#interactive#set_send_buffer(sbt_bufname)
    call vimshell#interactive#send(cmds)
  else
    echoerr 'try StartSBT'
  endif
endfunction

function! s:vimrc_scala()
  nnoremap <buffer> <Space>m :<C-u>write<Cr>:call <SID>sbt_run()<Cr>
endfunction

augroup vimrc_scala
  autocmd!
  autocmd FileType scala call s:vimrc_scala()
  autocmd FileType scala nnoremap <buffer> <Space>st :<C-u>StartSBT
augroup END

上記のように~/.vimrcに記述し、scalaのファイルを編集するときにiexe sbt:VimShellInteractive sbtのかわりに:StartSBTコマンドを使います。以後、コンパイルなど行いたいときには<Space>mを打鍵します。なおcompile以外のコマンドにも対応するため、t:sbt_cmdsという変数を用意しています。ここに実行させたいコマンド列を指定します。なお初回起動などでそのタブにこの変数がセットされていないときは、入力を求められます。

これで<Space>mを打鍵するだけでファイルの保存・コンパイルができ、しかも30倍高速化しました。Scalaにおける開発がはかどります。

余談

HootSuiteという会社はHootSuiteの実装に一部Scalaを用いています。Scala開発チームの約50%の人が上記テクニックを用いて|<Space>m|だけで保存・コンパイルなどの定形操作を自動化かつ高速化しています。

ujihisa

Vim Advent Calendar 2012 ujihisa 3

Vim Advent Calendar の 82 日目の記事です。 昨日はthincaさんによるLive Coding で painter.vim(仮) 作ったで、業界に衝撃が走りました。僕も勤務先の会社で「友達が作ったんだぜ、すごいだろ」とどや顔で披露しました。

本記事はpainter.vimとはまるで違う、地味なトピックです。

unite-file_rec

unite.vim標準のsourceであるfile_recは以下の正規表現にマッチする候補を無視します。

 \%(^\|/\)\.$\|\~$\|\.\%(o\|exe\|dll\|bak\|sw[po]\|class\)$\|\%(^\|/\)\%(\.hg\|\.git\|\.bzr\|\.svn\|tags\%(-.*\)\?\)\%($\|/\)

たとえば.gitというディレクトリを見つけると、それ以下のファイル/ディレクトリを探索しないようになります。このおかげで探索、つまりキャッシュ作成がとても速くなります。

無視するパターンの変更

上記無視リストを別のパターンで上書きしたいときは、unite#custom_source()を使います。 たとえば”target”という名前に完全一致するディレクトリがあるときはそれ以下のファイルをすべて無視したいときは、~/.vimrcに以下のように記述します。

call unite#custom_source('file_rec', 'ignore_pattern', '\<target\>')

この場合、前述のデフォルトの無視リスト(.gitなど)は上書きされるため、:Unite file_recは.git以下の膨大量のファイルも探索します。

無視するパターンの追加

デフォルトのパターンを用いつつ、無視するパターンを新たに追加したい場合、以下のように一つの大きな別の正規表現を作ることで対処できます。

call unite#custom_source('file_rec', 'ignore_pattern', '\%(^\|/\)\.$\|\~$\|\.\%(o\|exe\|dll\|bak\|sw[po]\|class\)$\|\%(^\|/\)\%(\.hg\|\.git\|\.bzr\|\.svn\|tags\%(-.*\)\?\)\%($\|/\)\|\<target\>')

しかし

  • 可読性に問題あり
  • unite本家のデフォルトのfile_recignore_patternが変更されたときにいちいち手動で追従しないといけないのが大変

などの問題点があります

解決

デフォルトのignore_patternを取得して、その後文字列として結合します。以下のように~/.vimrcに記述します。

call unite#custom_source('file_rec', 'ignore_pattern', (unite#sources#file_rec#define()[0]['ignore_pattern']) . '\|\<target\>')

まず前提として、Vimが~/.vimrcを読み込んで実行しているときには、まだuniteそのものも、file_rec sourceも初期化されていません。なのでまずunite#sources#file_rec#define()を用いて強制的に初期化させ、デフォルトのignore_patternを生成させます。次にその返り値をそのまま使います。

ujihisa

Vim Advent Calendar 2012 ujihisa 2

本記事はujihisaさん担当のVim Advent Calendar 2012の48日目です。 先日の記事は @toyamarinyonさんによる http://toyamarinyon.hatenablog.jp/entry/2013/01/16/231651 でした。

if_lua

Vim scriptプログラマの皆様が普段もっとも頻繁に利用しているプログラミング言語はVim scriptだと思います。Vim script以外には、Vinariseなどでも使われているPythonが比較的よく利用されているのではないでしょうか。一方、プログラミング言語Luaをお使いになったことのあるVim scriptプログラマはどのくらいいらっしゃるのでしょうか。

Luaはこのような言語です。 http://ujihisa.blogspot.ca/2012/09/quicksort-in-lua.html

Lua

Vimが標準でサポートする外部プログラミング言語インタフェースとして、if_python, if_ruby, if_mzscheme, if_perlなどがあります。標準以外ではif_gaucheなども人気ですね。実はif_luaというものもあるのですが、僕の知る限りでは、まだあまり普及していないようです。Luaという言語は他の環境に組み込まれることを強く意識されたものであるという背景から考えるに、この状況はあまり好ましくないのではないかと危惧しています。

if_luaがあまり普及していない原因の一つとして、たいていのVimパッケージがif_luaを搭載していないからというのが挙げられます。パッケージとそのオプションの選択肢の豊富さに定評ある、Vim使いに人気のLinuxディストリビューションであるGentoo Linuxですら、if_luaることができません。

Gentoo

解決

昨年10月、有志によりGentoo LinuxのVimでif_luaるためのパッチを本家にて提出なされたようです。

https://bugs.gentoo.org/show_bug.cgi?id=436744

これが採択されれば、誰でも簡単にif_lua入りのVimをインストールできるようになります。

採択されるまでの間でも、上記パッチを適用することで、すぐにでもif_lua入りのVimを導入することができます。

次回

明日は@tyruさんです。

ujihisa

Vim Advent Calendar 2012 ujihisa 1

本記事はujihisaさん担当のVim Advent Calendar 2012の11日目です。 先日の記事は @dice_zuさんによる http://daisuzu.hatenablog.com/entry/2012/12/10/001228でした。

この記事は豪華二本立てでお送りします。

vimshellの紹介

vimshellを紹介する日本語記事はたくさんありますが、英語の記事があまりなかったので、書きました。

http://code.hootsuite.com/2012/12/11/vimshell/

弊社HootSuiteが技術ブログをはじめようという案が出たので、我先にと一番最初に投稿したのがこの記事です。現在HootSuite技術ブログの記事のうち100%がVimShellの話題です。

ujihisa.vim#3の紹介

vim-users.jp上でも紹介していた東京で行われたVimのカンファレンスであるujihisa.vim#3が無事開催されました。

ujihisa.vim#3

http://www.flickr.com/photos/sora_h/8264224416/in/photostream

高まるVim熱

ujihisa.vim#3

http://www.flickr.com/photos/sora_h/8264226102/in/photostream

マクロ漁船

ujihisa.vim#3

http://www.flickr.com/photos/sora_h/8264223278/in/photostream

会場は株式会社mixi様に貸していただきました。ありがとうございました!

(写真提供: sora_h)

次回

次回は@wiredoolさんです。

ujihisa

neco-rubyがneocomplcacheに統合されました

neco-rubyはRubyのためのneocomplcacheプラギンで、実質Rubyのrequire_relative専用補完機構でした。この機能がneocomplcache本家に統合されました。

filename_completeとして実装されています。特別な設定なしにいきなり利用可能なはずです。

neco-rubyをインストールしている人は、削除してください。

ujihisa

Home

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top