Vim テクニックバイブル

Emacs テクニックバイブルが発売されて「いいな、いいな〜」って羨ましがっていたら Vim でも出ましたね。

本書はとにかく内容が濃いこと、濃いこと。知らないテクニックばかりで、自分の Vim 力ではついていくのが精一杯。Vim の能力を全然引き出せていないな。自分の Vim 力の低さを思い知らされました。自覚してましたが。

Vim プラグインの情報がまとまった記事ってなかなか無いから、それだけでも本書は買う価値あります。neocomplcache や unite.vim の情報なんて貴重かも。オススメ設定だけでなく、拡張の作成方法まで紹介されているし。この2つのプラグインVim でプログラミングするのに必須。あと Vundle も。

私の Vim 力が低いために、本書に載ってるテクニックをすぐに生かせないのが歯がゆいです。逆引き辞典なので、Vim 使っていて面倒な場面に遭遇したときに解決方法を探す、という方法が使えるのが救い。手元に置いて何度も読み返すことにします。

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vim のプラグイン管理を pathogen から Vundle に移行した

Vim プラグインを pathogen で管理してきたけど…

今では後発の Vundle の方が主流ぽいので、pathogen から Vundle に移行することにしました。Vundle は Ruby の Bundle をインスパイアしていて、GitHub や vimscripts からプラグインファイルをダウンロードしてインストールできるという。なにそのステキ機能。スバラシイ。

私のマシンは Windows なので、Windows で Vundle を導入した手順を書いていきます。

まずは下準備

Vundle が GitHub や vimscripts からプラグインをダウンロードするには、git と curl コマンドが必要。まず git を msysgit でインストール。

そして、下記の内容を記述した curl.cmd ファイルを、C:\Program Files\Git\cmd ディレクトリに作成。

@rem Do not use "echo off" to not affect any child calls.
@setlocal

@rem Get the abolute path to the parent directory, which is assumed to be the
@rem Git installation root.
@for /F "delims=" %%I in ("%~dp0..") do @set git_install_root=%%~fI
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%PATH%

@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

@curl.exe %*

下記のコマンドが通れば OK。

git --version
curl --version

Vundle をインストール

Vundle のインストールは git で行う。ユーザーのホームディレクトリで次のコマンドを実行。

git submodule add http://github.com/gmarik/vundle.git %USERPROFILE%/dotfiles/.vim/bundle/vundle

dotfiles ディレクトリは .vimrc や .zshrc を管理しているディレクトリ。pathogen を導入してから、.vimrc や Vim プラグインは Git でバージョン管理しています。

Vundle を有効化

Vundle を有効にするために .vimrc を編集。ついでに利用するプラグインも記述しておきます。

set nocompatible               " be iMproved
filetype off                   " required!

if has('win32') || has('win64')
    let $DOTVIM = expand('~/vimfiles')
else
    let $DOTVIM = expand('~/.vim')
endif
set rtp+=$DOTVIM/bundle/vundle/
call vundle#rc('$DOTVIM/bundle')

" let Vundle manage Vundle
" required! 
Bundle 'gmarik/vundle'

" My Bundles here:
"
" original repos on github
Bundle 'Shougo/neocomplcache'
" vim-scripts repos
Bundle 'project.tar.gz'

filetype plugin indent on " required!
syntax on

set autoindent
set expandtab
set number
set nobackup

set backspace=indent,eol,start
set tabstop=4
set softtabstop=4
set shiftwidth=4

Linux でも使えるように、.vim のパスを切り替えています。このやり方は下の記事を参考にしました。

Ubuntu で動くことは確認済みです。

dotfiles ディレクトリ内に .vimrc や .vim をまとめているけど、これらはユーザーのホームディレクトリに置く必要があるので、シンボリックリンクを作成します。Windows だと名前を変更する必要あるので、リンクの名前は .vim ではなく vimfiles、.vimrc ではなく _vimrc で作成しておきます。

mklink _vimrc dotfiles\.vimrc
mklink /D vimfiles dotfiles\.vim

あとは

Vim を起動して、BundleInstall コマンドを実行すれば、プラグインがインストールされます。不要になったプラグインは .vimrc から消して BundleClean で 削除すれば OK。

最終的にこんな感じ

C:.
│  .gitignore
│  .gitmodules
│  .gvimrc
│  .vimrc
│
└─.vim
    └─bundle
        ├─neocomplcache
        │  │  .gitignore
        │  │  README
        │  │
        │  ├─autoload
        │  │  │  neocomplcache.vim
        │  │  │  vital.vim
        │  │  │
        │  │  ├─neocomplcache
        │  │  │  │  async_cache.vim
        │  │  │  │  cache.vim
        │  │  │  │  util.vim
        │  │  │  │
        │  │  │  └─sources
        │  │  │      │  abbrev_complete.vim
        │  │  │      │  buffer_complete.vim
        │  │  │      │  completefunc_complete.vim
        │  │  │      │  dictionary_complete.vim
        │  │  │      │  filename_complete.vim
        │  │  │      │  include_complete.vim
        │  │  │      │  keyword_complete.vim
        │  │  │      │  omni_complete.vim
        │  │  │      │  snippets_complete.vim
        │  │  │      │  syntax_complete.vim
        │  │  │      │  tags_complete.vim
        │  │  │      │  vim_complete.vim
        │  │  │      │
        │  │  │      ├─snippets_complete
        │  │  │      │      actionscript.snip
        │  │  │      │      apache.snip
        │  │  │      │      applescript.snip
        │  │  │      │      c.snip
        │  │  │      │      coffee.snip
        │  │  │      │      cpp.snip
        │  │  │      │      css.snip
        │  │  │      │      d.snip
        │  │  │      │      eruby.snip
        │  │  │      │      java.snip
        │  │  │      │      javascript.snip
        │  │  │      │      markdown.snip
        │  │  │      │      objc.snip
        │  │  │      │      perl.snip
        │  │  │      │      php.snip
        │  │  │      │      python.snip
        │  │  │      │      rails.snip
        │  │  │      │      ruby.snip
        │  │  │      │      sh.snip
        │  │  │      │      snippet.snip
        │  │  │      │      tex.snip
        │  │  │      │      vim.snip
        │  │  │      │      vimshell.snip
        │  │  │      │      xhtml.snip
        │  │  │      │      _.snip
        │  │  │      │
        │  │  │      └─vim_complete
        │  │  │              autocmds.dict
        │  │  │              commands.dict
        │  │  │              command_args.dict
        │  │  │              command_completions.dict
        │  │  │              command_prototypes.dict
        │  │  │              command_replaces.dict
        │  │  │              features.dict
        │  │  │              functions.dict
        │  │  │              helper.vim
        │  │  │              mappings.dict
        │  │  │              options.dict
        │  │  │              variables.dict
        │  │  │
        │  │  ├─unite
        │  │  │  └─sources
        │  │  │          file_include.vim
        │  │  │          neocomplcache.vim
        │  │  │          snippet.vim
        │  │  │
        │  │  └─vital
        │  │      │  neocomplcache.vital
        │  │      │  _bc73c2.vim
        │  │      │
        │  │      └─_bc73c2
        │  │          │  functor.vim
        │  │          │  prelude.vim
        │  │          │
        │  │          ├─data
        │  │          │      list.vim
        │  │          │      ordered_set.vim
        │  │          │      string.vim
        │  │          │
        │  │          └─system
        │  │                  file.vim
        │  │                  filepath.vim
        │  │
        │  ├─doc
        │  │      neocomplcache.jax
        │  │      neocomplcache.txt
        │  │
        │  ├─ftplugin
        │  │      snippet.vim
        │  │
        │  ├─indent
        │  │      snippet.vim
        │  │
        │  ├─plugin
        │  │      neocomplcache.vim
        │  │
        │  └─syntax
        │          snippet.vim
        │
        ├─project.tar.gz
        │  │  README
        │  │
        │  ├─doc
        │  │      project.txt
        │  │
        │  └─plugin
        │          project.vim
        │
        └─vundle
            │  README.md
            │
            ├─autoload
            │  │  vundle.vim
            │  │
            │  └─vundle
            │          config.vim
            │          installer.vim
            │          scripts.vim
            │
            ├─doc
            │      tags
            │      vundle.txt
            │
            └─test
                    minirc.vim
                    vimrc

余談だけど、プラグインのバージョン管理をする必要ないので、bundle 以下は .gitignore で除外しておきました。おかげで Git リポジトリがスッキリ。

Vim でクラスやメソッドの一覧を表示したい人のための taglist.vim

AppEngine アプリ開発したりすると、モデルやビューのソースコードが結構な行数になってきます。かといって複数のファイルに分割するほどでもない。そんなときにソースコードを修正するとなると、目的のクラスやメソッドにたどりつくまでが大変です。名前を覚えていれば検索できますが、どんなメソッドがあるか忘れてたら探しようがありません。


Eclipse のような IDE だと、ファイルに定義されてるクラスやメソッドの一覧を表示できます。同じことを Vim でもやりたいですよね。やれるんですよ、これが。taglist.vim というプラグインを使えばね。


まず ctags をインストールします。ctags は下のリンク先からダウンロードして、適当なディレクトリに放り込むがよろし。

taglist.vim はこの ctags を利用するので、インストールディレクトリにパスを通しておきましょう。


そして taglist.vim をインストールします。Vim の公式サイトからプラグインをダウンロード。

Vim プラグインを pathogen で管理していれば、解凍して bundles に放り込むだけです。まだ pathogen 使ってない人は、これを機に導入するといいよ!


クラスやメソッドのアウトラインを表示したいファイルを Vim で開いて、下記のコマンドを実行します。

:Tlist

すると、こんな感じで画面が分割されてアウトラインが表示されます。
f:id:griefworker:20110128191646p:image
ちなみに上図は kay のソースコードで実行した結果です。クラスやメソッドがズラーっと表示されていて、見通しやすいです。これでまた一歩 IDE に近づきましたね。

Vimmer のための Zen-Coding 入門

はじめに

AppEngine アプリを作るようになって、HTML を記述する頻度がかなり上がりました。DreamWeaver みたいな高級アプリは持っていないので、Vim でゴリゴリ。メンドクセ〜。そろそろなんとかしたい。そこで Zen-Coding の出番です。

Zen-Coding とは

簡単に説明すると、

ul>li*3

みたいな専用の記法で記述された HTML の構造を

<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>

という風に、普通の HTML タグに変換するシロモノ。多くのエディタや IDE のプラグインとして提供されています。

Vim で Zen-Coding を使う準備

Vim には zencoding.vim というプラグインがあるので、Zen-Coding を導入することができます。

Vim プラグインは pathogen で管理しているので、vimfiles/bundle 下に放り込めばインストール終了。

Zen-Coding はデフォルトだとインデントにタブを使ってしまうので、半角スペースを使うように _vimrc で設定した方がいいです。

" インデントは半角スペース4個
let g:user_zen_settings = {
            \'indentation' : '    ',
            \}

さっそく Vim で試してみます

略語とその変換結果をざっとまとめてみました。

略語を変換してみる

Vim で次の略語を入力し、

div

インサートモードで、div のすぐ後ろにカーソルがある状態で , を押すと

<div></div>

という風に HTML タグに変換されます。これが基本。

タグを階層化してみる

略語を > で連結すると階層化されます。

変換前
div>h1
変換後
<div>
    <h1></h1>
</div>
IDを指定してみる

# でタグの ID を指定できます。CSS セレクタに似ていますね。

変換前
div#foo
変換後
<div id="foo"></div>
クラスを指定してみる

. (ピリオド) でクラスを指定できます。これも CSS セレクタ風。

変換前
div.foo
変換後
<div class="foo"></div>

また、複数のクラスを指定できます。

変換前
div.foo.bar
変換後
<div class="foo bar"></div>
属性を指定してしてみる

[属性名=属性値] という書式で指定します。他の書式と比べると、ほとんど短くなってないです。

変換前
input[type=text][name=foo][value=bar]
変換後
<input name="foo" type="text" value="bar" />
繰返してみる
変換前
div*5
変換後
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>

リストやテーブルを作成するときに大活躍。まぁ、Vim なら

5i<div></div><Enter><Esc>

でも同じことができますけど。

繰り返しつつ連番を振ってみる

$ の位置に連番が振られます。

変換前
div.foo$*5
変換後
<div class="menu1"></div>
<div class="menu2"></div>
<div class="menu3"></div>
<div class="menu4"></div>
<div class="menu5"></div>

桁数を指定することもできます。

変換前
div.bar$$$*5
変換後
<div class="bar001"></div>
<div class="bar002"></div>
<div class="bar003"></div>
<div class="bar004"></div>
<div class="bar005"></div>
同じ階層に複数の異なるタグを生成してみる

+で連結すると、タグが同じ階層に展開されます。

変換前
h1+ul+div
変換後
<h1></h1>
<ul></ul>
<div></div>
まとまったブロックを変換してみる

() で挟むと、まとまったブロックとして扱われます。ちょっと複雑な HTML を作成するときに使います。

変換前
(div>h1+ul>li*3)+(div>address)
変換後
<div>
    <h1></h1>
    <ul>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
<div>
    <address></address>
</div>

Zen-Coding の生産性は想像以上

想像以上どころか、遥かに超えていました。

例えば、

(div#header>h1+ul#menu>li.menu_item*5)+(div#contents>div#main+div#sidebar)+(div#footer>address>a)

を変換すると

<div id="header">
    <h1></h1>
    <ul id="menu">
        <li class="menu_item"></li>
        <li class="menu_item"></li>
        <li class="menu_item"></li>
        <li class="menu_item"></li>
        <li class="menu_item"></li>
    </ul>
</div>
<div id="contents">
    <div id="main"></div>
    <div id="sidebar"></div>
</div>
<div id="footer">
    <address>
        <a href=""></a>
    </address>
</div>

という風に、よく使用するレイアウトが簡単に作成できてしまいます。これだけの HTML が一瞬で作成されるさまは爽快。

記法も難しくないので、使いこなせるようになるまで、そう時間はかかりません。劇的に HTML 記述速度が速くなります。もう Zen-Coding 無しではやってられません。特に Web プログラマなら導入しないと損です。ホントに。

git と github を使って Vim の設定ファイルとプラグインをバージョン管理してみた

先日 pathogen を導入して Vim プラグインを整理したのをいい機会に、前から考えていた Vim の設定ファイルとプラグインのバージョン管理に着手しました。使ったツールはもちろん git。あと、バックアップ場所として github も使いました。


今回行った作業はこんな感じです。

  1. github に dotfiles というリポジトリを作成
  2. 作成したリポジトリVim の設定ファイルとプラグインを push
  3. 適当なディレクトリに dotfiles リポジトリを clone
  4. ホームディレクトリに、.vim や .vimrc へのシンボリックリンクを作成


作成したリポジトリはこちら。

github を利用することで、ネットに繋がっている複数のマシンで Vim の環境を同期できます。DropBox や SugarSync みたいに自動ではなく、git push/pull による手動ですけど。

Vim プラグインを pathogen.vim で管理してみる

私が VIM にもつ不満の一つに「プラグインのファイルが autoload や doc などのフォルダに散らばってしまうこと」があります。


この不満を解消するため、ちょっと前に話題になった『 pathogen 』を導入を決意しました。pathogen は Vim プラグインを管理するためのプラグインです。


まず pathogen をダウンロード。

ダウンロードしたら、vimfiles の autoload フォルダに放り込みます。


そして _vimrc を編集し pathogen を使ってプラグインを読み込むようにします。

"pathogenでftdetectなどをロードさせるために一度ファイルタイプ判定をoffにする
filetype off

"pathogen.vimを使ってbundle配下のプラグインをpathに加える
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()
set helpfile=$VIMRUNTIME/doc/help.txt

"ファイルタイプ設定をonにする
filetype on

これで仕込みは完了。あとは vimfiles 内のフォルダを再配置します。


びふぉー。

C:\Users\ユーザー名\vimfiles>tree /F
フォルダ パスの一覧
ボリューム シリアル番号は 001CF6F4 11DE:FD71 です
C:.
│  .gitignore
│  make_cygwin.mak
│  make_gcc.mak
│  make_mac.mak
│  make_mingw.mak
│  make_msvc.mak
│
├─autoload
│  │  fakepoll.h
│  │  neocomplcache.vim
│  │  pathogen.vim
│  │  proc.c
│  │  proc.dll
│  │  proc_w32.c
│  │  vimproc.vim
│  │  vimshell.vim
│  │  vimstack.c
│  │
│  ├─neocomplcache
│  │  │  cache.vim
│  │  │  util.vim
│  │  │
│  │  └─sources
│  │      │  abbrev_complete.vim
│  │      │  buffer_complete.vim
│  │      │  completefunc_complete.vim
│  │      │  dictionary_complete.vim
│  │      │  filename_complete.vim
│  │      │  include_complete.vim
│  │      │  keyword_complete.vim
│  │      │  omni_complete.vim
│  │      │  snippets_complete.vim
│  │      │  syntax_complete.vim
│  │      │  tags_complete.vim
│  │      │  vim_complete.vim
│  │      │
│  │      ├─snippets_complete
│  │      │      actionscript.snip
│  │      │      apache.snip
│  │      │      applescript.snip
│  │      │      c.snip
│  │      │      cpp.snip
│  │      │      css.snip
│  │      │      d.snip
│  │      │      eruby.snip
│  │      │      java.snip
│  │      │      javascript.snip
│  │      │      markdown.snip
│  │      │      objc.snip
│  │      │      perl.snip
│  │      │      php.snip
│  │      │      python.snip
│  │      │      rails.snip
│  │      │      ruby.snip
│  │      │      sh.snip
│  │      │      snippet.snip
│  │      │      tex.snip
│  │      │      vim.snip
│  │      │      vimshell.snip
│  │      │      xhtml.snip
│  │      │      _.snip
│  │      │
│  │      └─vim_complete
│  │              autocmds.dict
│  │              commands.dict
│  │              command_args.dict
│  │              command_completions.dict
│  │              command_prototypes.dict
│  │              command_replaces.dict
│  │              features.dict
│  │              functions.dict
│  │              helper.vim
│  │              mappings.dict
│  │              options.dict
│  │              variables.dict
│  │
│  ├─vimproc
│  │      parser.vim
│  │
│  └─vimshell
│      │  altercmd.vim
│      │  history.vim
│      │  hook.vim
│      │  interactive.vim
│      │  int_mappings.vim
│      │  mappings.vim
│      │  parser.vim
│      │  terminal.vim
│      │  term_mappings.vim
│      │  util.vim
│      │  vcs.vim
│      │
│      ├─commands
│      │      alias.vim
│      │      bcd.vim
│      │      bg.vim
│      │      cd.vim
│      │      clear.vim
│      │      dirs.vim
│      │      echo.vim
│      │      eval.vim
│      │      exe.vim
│      │      exit.vim
│      │      galias.vim
│      │      gcd.vim
│      │      gexe.vim
│      │      h.vim
│      │      histdel.vim
│      │      history.vim
│      │      iexe.vim
│      │      less.vim
│      │      let.vim
│      │      ls.vim
│      │      mkcd.vim
│      │      nop.vim
│      │      open.vim
│      │      popd.vim
│      │      pwd.vim
│      │      repeat.vim
│      │      sexe.vim
│      │      shell.vim
│      │      sudo.vim
│      │      texe.vim
│      │      vexe.vim
│      │      view.vim
│      │      vim.vim
│      │      vimdiff.vim
│      │      vimsh.vim
│      │
│      ├─complete
│      │      args_complete.vim
│      │      auto_complete.vim
│      │      command_complete.vim
│      │      helper.vim
│      │      history_complete.vim
│      │      interactive_history_complete.vim
│      │      vimshell_execute_complete.vim
│      │
│      └─vcs
│              git.vim
│
├─doc
│      neocomplcache.jax
│      neocomplcache.txt
│      project.txt
│      tags
│      tags-ja
│      vimproc.jax
│      vimshell.jax
│      vimshell.txt
│
├─ftplugin
│      ruby.vim
│
├─indent
│      snippet.vim
│
├─plugin
│      ank_cc.vim
│      neocomplcache.vim
│      project.vim
│      vimproc.vim
│      vimshell.vim
│
├─presen
│      vimshell.mkd
│
├─syntax
│      int-termtter.vim
│      snippet.vim
│      vimshell.vim
│      vimshrc.vim
│
└─test
        test1.vim
        test2.vim
        test3.vim
        test4.vim
        test5.vim
        test6.vim


あふたー。

C:\Users\ユーザー名\vimfiles>tree /F
フォルダ パスの一覧
ボリューム シリアル番号は 0013F51C 11DE:FD71 です
C:.
├─autoload
│      pathogen.vim
│
└─bundle
    ├─ank_cc
    │  └─plugin
    │          ank_cc.vim
    │
    ├─neocomplcache
    │  ├─autoload
    │  │  │  neocomplcache.vim
    │  │  │
    │  │  └─neocomplcache
    │  │      │  cache.vim
    │  │      │  util.vim
    │  │      │
    │  │      └─sources
    │  │          │  abbrev_complete.vim
    │  │          │  buffer_complete.vim
    │  │          │  completefunc_complete.vim
    │  │          │  dictionary_complete.vim
    │  │          │  filename_complete.vim
    │  │          │  include_complete.vim
    │  │          │  keyword_complete.vim
    │  │          │  omni_complete.vim
    │  │          │  snippets_complete.vim
    │  │          │  syntax_complete.vim
    │  │          │  tags_complete.vim
    │  │          │  vim_complete.vim
    │  │          │
    │  │          ├─snippets_complete
    │  │          │      actionscript.snip
    │  │          │      apache.snip
    │  │          │      applescript.snip
    │  │          │      c.snip
    │  │          │      cpp.snip
    │  │          │      css.snip
    │  │          │      d.snip
    │  │          │      eruby.snip
    │  │          │      java.snip
    │  │          │      javascript.snip
    │  │          │      markdown.snip
    │  │          │      objc.snip
    │  │          │      perl.snip
    │  │          │      php.snip
    │  │          │      python.snip
    │  │          │      rails.snip
    │  │          │      ruby.snip
    │  │          │      sh.snip
    │  │          │      snippet.snip
    │  │          │      tex.snip
    │  │          │      vim.snip
    │  │          │      vimshell.snip
    │  │          │      xhtml.snip
    │  │          │      _.snip
    │  │          │
    │  │          └─vim_complete
    │  │                  autocmds.dict
    │  │                  commands.dict
    │  │                  command_args.dict
    │  │                  command_completions.dict
    │  │                  command_prototypes.dict
    │  │                  command_replaces.dict
    │  │                  features.dict
    │  │                  functions.dict
    │  │                  helper.vim
    │  │                  mappings.dict
    │  │                  options.dict
    │  │                  variables.dict
    │  │
    │  ├─doc
    │  │      neocomplcache.jax
    │  │      neocomplcache.txt
    │  │      tags
    │  │      tags-ja
    │  │
    │  ├─indent
    │  │      snippet.vim
    │  │
    │  ├─plugin
    │  │      neocomplcache.vim
    │  │
    │  └─syntax
    │          snippet.vim
    │
    ├─project
    │  ├─doc
    │  │      project.txt
    │  │      tags
    │  │
    │  └─plugin
    │          project.vim
    │
    ├─ruby
    │  └─ftplugin
    │          ruby.vim
    │
    ├─vimproc
    │  │  .gitignore
    │  │  make_cygwin.mak
    │  │  make_gcc.mak
    │  │  make_mac.mak
    │  │  make_mingw.mak
    │  │  make_msvc.mak
    │  │
    │  ├─autoload
    │  │  │  fakepoll.h
    │  │  │  proc.c
    │  │  │  proc.dll
    │  │  │  proc_w32.c
    │  │  │  vimproc.vim
    │  │  │  vimstack.c
    │  │  │
    │  │  └─vimproc
    │  │          parser.vim
    │  │
    │  ├─doc
    │  │      tags-ja
    │  │      vimproc.jax
    │  │
    │  ├─plugin
    │  │      vimproc.vim
    │  │
    │  └─test
    │          test1.vim
    │          test2.vim
    │          test3.vim
    │          test4.vim
    │          test5.vim
    │          test6.vim
    │
    └─vimshell
        ├─autoload
        │  │  vimshell.vim
        │  │
        │  └─vimshell
        │      │  altercmd.vim
        │      │  history.vim
        │      │  hook.vim
        │      │  interactive.vim
        │      │  int_mappings.vim
        │      │  mappings.vim
        │      │  parser.vim
        │      │  terminal.vim
        │      │  term_mappings.vim
        │      │  util.vim
        │      │  vcs.vim
        │      │
        │      ├─commands
        │      │      alias.vim
        │      │      bcd.vim
        │      │      bg.vim
        │      │      cd.vim
        │      │      clear.vim
        │      │      dirs.vim
        │      │      echo.vim
        │      │      eval.vim
        │      │      exe.vim
        │      │      exit.vim
        │      │      galias.vim
        │      │      gcd.vim
        │      │      gexe.vim
        │      │      h.vim
        │      │      histdel.vim
        │      │      history.vim
        │      │      iexe.vim
        │      │      less.vim
        │      │      let.vim
        │      │      ls.vim
        │      │      mkcd.vim
        │      │      nop.vim
        │      │      open.vim
        │      │      popd.vim
        │      │      pwd.vim
        │      │      repeat.vim
        │      │      sexe.vim
        │      │      shell.vim
        │      │      sudo.vim
        │      │      texe.vim
        │      │      vexe.vim
        │      │      view.vim
        │      │      vim.vim
        │      │      vimdiff.vim
        │      │      vimsh.vim
        │      │
        │      ├─complete
        │      │      args_complete.vim
        │      │      auto_complete.vim
        │      │      command_complete.vim
        │      │      helper.vim
        │      │      history_complete.vim
        │      │      interactive_history_complete.vim
        │      │      vimshell_execute_complete.vim
        │      │
        │      └─vcs
        │              git.vim
        │
        ├─doc
        │      tags
        │      tags-ja
        │      vimshell.jax
        │      vimshell.txt
        │
        ├─plugin
        │      vimshell.vim
        │
        ├─presen
        │      vimshell.mkd
        │
        └─syntax
                int-termtter.vim
                vimshell.vim
                vimshrc.vim


なんということでしょう!
bundle 配下にプラグイン毎にフォルダが用意され、その中にプラグインのファイル(txtやvim)がまとまっているではありませんか!!


Vim を起動して、プラグインがちゃんと読み込まれたら成功です。これで Vim プラグインの管理が楽になりそうだ。

Windows に VimShell を導入してみた

Web アプリ開発してると、コマンドラインシェルでの操作が多くなります。エディタでソースを修正したり、単体テスト実行したり、Webアプリを起動してデバッグしたり、等々。


例えば、Web アプリをデバッグ中にソースコードを修正して単体テストをしたい場合、Windows では Screen が使えないので、cmd.exe を複数起動することになります。でも、複数起動すると切り替えるのが面倒です。それに cmd.exe はシェルとしても貧弱。


以前 Windows に移植された zshbash を紹介しました。

でも、どれも完成度はいまひとつです。


cygwin をインストールすれば zsh や screen を使えるようになりますが、以前試したら重かったので気が進みません。コードは Vim で書く事が多いから、Vim からコマンドを実行できたらいいですよね。Emacs ユーザーは Emacs 上で何でもやるって聞きますし。


よろしい。ならば VimShell だ。


vimshell は Vim 上で動くシェルです。VimScript で実装されているというからすごい。


vimshell から外部コマンドを非同期で実行してほしいので、vimproc もインストールしておきます。

vimproc は C のソースコードをコンパイルする必要があります。コンパイルが面倒な人は、Shougo さんが公開している DLL をダウンロードして autoload につっこむといいです。


Vim を起動して VimShell コマンドを実行すれば、バッファ内に VimShell が起動します。右下が VimShell。
f:id:griefworker:20101124102939p:image
project.vim と組み合わせれば、IDE っぽくなりそうですね。