Skip to content
Shougo edited this page Sep 13, 2010 · 4 revisions
  1. vimshell

zshをも超える究極のShell
Shougo

  1. vimshellとは?

Vim scriptによって実装された究極のシェルです。
略してvshell。ただし、eshellとは違ってまだまだ未完成です。
一番の特徴としては、Vimのプラグインと連携ができること。
特にWindowsはシェルが貧弱なので、使用していてイライラしますが、vimshellはWindowsでも動作するので安心です。
ただしWindows上では一部の機能が制限されるので注意。
加えて、他のシェルの便利な機能を多数取り込んでいます。
設定して当たり前の機能は標準的に使えるため、zshと比べて設定の手間もありません。

ただし非同期実行を行わない場合、vimshellはVimのシェル設定を用いてプログラムを起動します。
よって、シェルは適切に設定しておく必要があります。

ちなみに、使いやすいシェルを目指しているため、変数の規則などが普通のシェルと異なります。

  1. 似た感じのスクリプト
  1. vimsh.vim
  2. Shell.vim
  3. Vim-Shellプロジェクト
  4. Screen.vim
  5. eshell.el
  6. ansi-term.el
  7. zsh
  8. Conque
  1. vimsh.vimの良いところ
    1. インタラクティブなシェルが起動できる(Windows以外)
    2. Vimから独立している
  1. vimsh.vimの悪いところ
    1. Pythonインタフェースが必要
    2. バグが多い
    3. 必要なくても勝手に起動する
  1. Shell.vimの良いところ
    1. 動作が単純
    2. 完全にVim script上で動作する
    3. 一部が内部コマンドで実現されている
  1. Shell.vimの悪いところ
    1. もう長い間更新されてない
    2. インタラクティブなプログラムを起動するとフリーズしてしまう
  1. Vim-Shellプロジェクトの良いところ
    1. 内部で完全なシェルを動作させることができる
    2. エスケープシーケンスを解釈するので、色分けもできる
    3. 比較的有名
  1. Vim-Shellプロジェクトの悪いところ
    1. あまりに巨大なパッチなので、本家に取り込まれることはない
    2. Vimのバージョンごとの互換性がない
    3. 使用するシェルに依存する
    4. しかも更新頻度が遅い(Vim7.2には未対応)
    5. Windowsでは動作しない

これはどちらかというと、ansi-termに近いです。
Vimに外部プロセスを実行させる機能を付け加えようというものです。

  1. Screen.vimの良いところ
    1. GNU screenの機能をVimから使用できる
    2. 比較的に汎用性はある
  1. Screen.vimの悪いところ
    1. 端末が必要なので、WindowsやGVimでは使えない
    2. 当然GNU screenが必要
    3. Vimからコマンドを送るだけなので、結果がVimのバッファに取り込めない

screenと連携するという上ではよいのですが、これをシェルとして使用するのはかなり厳しいです。

  1. eshell.elの良いところ
    1. 完全なシェルを動作させることができる
    2. Emacsのシェル設定に依存しない
    3. Windowsでも動作する
    4. 完全にEmacs内で動作する
    5. cursesも動作する(ansi-term.elを使った方がよい)
    6. 色分けやエスケープシーケンスに対応
    7. Emacs Lispも動作する
    8. Emacsに標準添付
  1. eshell.elの悪いところ
    1. Emacsen専用
    2. 起動が遅い
    3. Windows上では対話プログラムの動作が不安定
    4. 他のシェルと比べると情報が少ない
    5. 入力のリダイレクションが未実装

これはかなり理想的なシェルです。ただしEmacs専用。
auto-complete.elと連携させることで真価を発揮します。

  1. ansi-term.elの良いところ
    1. 完全なターミナルを動作させることができる
    2. cursesも動作する
    3. エスケープシーケンス完全対応
    4. Emacsに標準添付
  1. ansi-term.elの悪いところ
    1. Emacsen専用
    2. Windowsでは使用できない
    3. 外部のシェルに依存する
    4. 入力がansi-termに取られてしまうので、キーバインドが破壊される

これはシェルというより、Emacs上に実装された高機能ターミナルです。

  1. zshの良いところ
    1. 有名
    2. 他のソフトから独立している
    3. カスタマイズ性が高い
    4. 比較的情報が多い
    5. 補完機能が強力
    6. 最近本が出版された
  1. zshの悪いところ
    1. sh系の文法にはやはり問題が多い
    2. 起動が遅い
    3. Windowsでは動作しない
    4. キーバインドの設定など、Vimにはカスタマイズ性が劣る
    5. 凝ったことをしようとすると大変

とても有名なシェルです。vimshellはこれに追いつき追い越せとがんばっているところです。
シェルとして見ると機能は最強ですが、Vimとの連携を考えると使いづらい面があります。

  1. Conqueの良いところ
    1. 完全にVim内で動作する
    2. シェルがほぼ完全に動作する
    3. Emacsでさえ起動が一応可能
  1. Conqueの悪いところ
    1. Windows上では動作しない
    2. pythonインタフェースが必要
    3. 日本語が入力できない
    4. 一部のアプリケーションは動作が不安定
    5. 無理矢理非同期処理を実装しているため、処理が重め
    6. 編集機能が貧弱

zshを動作できるなど、かなりターミナルとの互換性が高いプラグインです。
最新版ではかなり動作が改善されました。
ansi-termと同じ利点と欠点を持ちます。
Emacsすら起動できますが、重すぎて実用には耐えません。
ちなみに、もともとはvimshellの非同期実行機能をforkしたものです。

  1. vimshell.vimの良いところ
    1. 完全にVim内で動作する
    2. シェルへの依存性は低い(非同期実行の場合)
    3. コマンドが色分けされるので見やすい
    4. 開発が早い
    5. Vimのプラグインと連携ができる
    6. ワンライナー対応
    7. 非同期実行をサポート
    8. 自動ディレクトリスタックやauto\_cdなど、zshの機能を一部取り込んでいる
    9. 内部コマンドを簡単に追加可能
    10. WindowsやGVimでもほとんどの機能を使用できる
    11. Vim scriptの文法を一部取り込んだ新たなシェルである
    12. エスケープシーケンスによる色づけに対応
  1. vimshell.vimの悪いところ
    1. 制御構造がないので、スクリプト機能が貧弱
    2. 情報が少ない
    3. まともなマニュアルがない
    4. 仕様が頻繁に変わる
    5. 普通のシェルとの互換性は低い

zshに比べるとまだ機能が貧弱なのは否めません。
ですが、Vimの魅力は豊富な拡張性です。
プラグインで強化すれば、zshをも上回る利便性を教授できます。
特殊なことをやろうとしない限り、Vimから出る必要がありません。

  1. vimshellの歴史
Shell.vimの表示が見づらいので色分けを始める       ↓   内部が汚かったので、大幅改造       ↓ もはや別物になったのでvimshellに改名       ↓   githubで公開してみる       ↓     反響大きい       ↓ thincaさんの薦めで、内部をプラグイン化       ↓ ついカッとなり、zshの機能を取り込む       ↓ ついカッとなり、ワンライナー対応してみる       ↓     さらなる暴走       ↓   そして現在に至る……

詳しくはChangeLog:で。

  1. vimshellの代表的機能
  1. 完全にVim内で動作する

Vimの中で動作するので、Vimのキーマッピングを完全に利用することができます。
Vim scriptが書けるならば、オリジナルのキーバインドを用意したり、内部コマンドを追加することも簡単です。
特に最近Vim戦闘力が上昇しすぎてVimから出るのが苦痛となってしまっている、達人Vimmerへの福音となるでしょう。

  1. 色分け

vimshellバッファ上で、ドットファイルやディレクトリ、実行ファイル等を認識し、見やすいように色分けをします。

ちなみに、vimshのToDoにも色分けのことは書いてあったので、vimshellのほうが先に実装したことになります。
最近ではエスケープシーケンス機能を強化、256色を含めた多数のエスケープシーケンスを認識します。
特にWindows環境やGVimでも動作するのが魅力。ただし、ハイライトを大量に使うので重いです。

  1. ヒストリ

私はものぐさなので、ヒストリ機能には力を注いでいます。
ヒストリ一覧はhistoryコマンドで参照できます。
入力時にオムニ補完を起動すると、ヒストリ補完になります。
部分マッチで検索され、非常に便利なので是非お使いください。
今まで入力したコマンドラインの上で``してもヒストリ実行できます。
当然のように、ヒストリはvimshell内で共有しているので、別のvimshellからも同じヒストリが参照できます。

ヒストリに記録したくないときは、コマンドの先頭に空白文字を入れます。
zshのように、連続したコマンドはヒストリに記録しません。
それだけではなく、重複したコマンド履歴は削除されるので、履歴がすっきりします。

`h ヒストリ番号` や、 `h コマンド名`でヒストリから検索して実行できます。

  1. 他のプラグインとの連携

vimshellはほぼ100% Vimの機能を使って実装されているので、他のプラグインと連携させることができます。
というより、これがなかったら私もvimshellは使ってないと思います。
編集はVimの機能をそのまま使えますし、キーマッピングも自由自在です。

例えばneocomplcacheと連携させることで、ヒストリからの引数補完や、自動ディレクトリ補完が実現できます。
バージョンが上がるごとにneocomplcacheのファイル名補完も強力になっているので、vimshellから使用すると幸せになれます。

Ver.6.02ではついにオムニ補完を自動で呼び出すようになりました。
自動で補完を呼べるシェルはvimshellくらいでしょう。

  1. 独自のカレントディレクトリ

vimshellはVimのカレントディレクトリとは別に独自のカレントディレクトリを持っていて、
カレントディレクトリの保存や復元を自動で行います。
vimshellからVim側のカレントディレクトリを変更したいときは、gcdコマンドを使用してください。

  1. コマンドラインスタック

コマンド入力中に``を押すと、一度コマンドラインがクリアされ、次に``を押したときに復元されます。
スタックになっているので、連続して行うこともできます。
この機能はzshからインスパイアされました。

  1. ファイルの関連づけ

`g:vimshell_execute_file_list`にプログラムが登録されていたら、実行時にプログラムの引数として呼び出すようにしました。
Windowsでいうファイルの関連づけになります。
zshにも「サフィックスエイリアス」という似たような機能があります。

例えば `let g:vimshell_execute_file_list[‘rb’] = ‘ruby’ `としておくと、

vimshell% ./hoge.rb

でrubyプログラムを実行できます。

  1. プロンプト移動

Normal modeで``, ``を押すと、プロンプト間を移動できます。
Emacsのシェルモードにある同様の機能を参考に実装しました。
コマンドの履歴を参照するときに便利です。

  1. 出力の削除

Normal modeで``を押すと、前のプロンプトまでの出力を削除できます。
Emacsのシェルモードにある同様の機能を参考に実装しました。
あまりに出力が長くなってしまったときに活用してください。

  1. シェルコマンド補完

Insert modeで``を押すと、シェルコマンドを補完できます。
自前で補完処理を実装したので、内部コマンドやエイリアスも補完できます。
Ver.6.00より、ユーザーが補完処理を定義できるようになりました。
ヘルパ関数も多数定義されているので、実装も楽です。

  1. プログラム名展開

`% echo =ls`
のように、`=`に続けてパスが通っているプログラム名を記述すると、
プログラムのフルパスに置き換わります。
デバッガの引数にするときや、ページャを使ってソースを読みたい場合に便利です。

  1. キーバインド等のカスタマイズ

vimshellのキーバインドは`vimshell#mappings#define_default_mappings()`にて定義されています。
標準的キーバインドを設定してから、
`setfiletype vimshell`
を実行するので、ftplugin/vimshell.vimを作成すれば、簡単にカスタマイズできます。

  1. encodingの変換

Ver.6.05より、exe, bg, iexe等のコマンドに対し、encodingを指定できるようになりました。
`—encoding=エンコーディング名`というオプションを使います。
省略すると、これまで通り`&termencoding`が仮定されます。
goshなど、Windows環境であってもencodingがUTF-8なコマンドが増えてきたので、
そのようなコマンドにはaliasで`—encoding`を自動的に付加するようにすると良いでしょう。

使用例:
`iexe —encoding=utf8 gosh`

  1. fakecygptyへの対応

fakecygptyを使用すれば、Windows環境であっても、Cygwinのptyを使用できます。
zshさえも起動することが可能です。

使用例:
`iexe fakecygpty c:/cygwin/bin/zsh`

参考URL
<http://www.ysnb.net/meadow/meadow-develop/x/6582>
<http://d.hatena.ne.jp/yohei-a/20091203/1259815133>

  1. 情報

あのtaku\_oさんに紹介されました!!
<http://d.hatena.ne.jp/taku-o/20090126>

pcmasterさんによる紹介
<http://d.hatena.ne.jp/pcmaster/20090505/p1>
はてなブックマーク数がものすごいことになってます。
やはり皆さん、今までのシェルには不満を持っているようですね。

しかしneocomplcacheと比較すると、まだまだ知名度は低いです。
皆さんも使ってみたら感想をお寄せください。

Nico Raffatoさんが、vimshellの非同期実行機能を進化させ、Conqueという独立したプラグインとして配布しています。
vimshellが役に立ったようで嬉しいです。一部の機能はvimshellにも取り込んでいます。

  1. 今後の予定

vimshellの歴史は以外と古く、neocomplcacheより前から作り始めていました。
現在neocomplcacheが安定し、私もvimshellを日常的に使用するようになったので、今後は貧弱なスクリプト機能を改善する予定です。

  1. まとめ

機能追加の要望やバグ、質問等があれば、githubのIssuesに書いてください。
<http://github.com/Shougo/vimshell/issues>
まめにチェックをしているので、皆さんのブログに書いていただいてもかまいません。

Twitterやブログもやってます。
<http://vinarian.blogspot.com/>
<http://twitter.com/ShougoMatsu>
更新情報は主にブログに、重要な情報はTwitterでもアナウンスする予定です。

夢はシェルに戻らなくても、ほとんどの作業をvimshell内で完結できるようにすることです。
私はプログラムのコンパイル・実行環境として、日常的にvimshellを使用しています。
おかげで最近は通常のシェルをあまり使わなくなりました。
vimshellは今後ますます進化します。皆さんの手で、最強のシェルを手に入れましょう。

  1. 更新履歴

===

  • 2010/09/08 vimshellから分離。
  • 2010/07/21 微妙に更新。
  • 2010/05/30 久しぶりに更新。古い記述を整理。
  • 2010/04/20 一部の記述を日本語ヘルプファイルに分離。
  • 2010/02/11 Ver.6.05に対応。
  • 2009/12/28 MarkDown化。
  • 2009/12/25 Ver.6.00に対応。
  • 2009/09/12 Ver.5.34に対応。
  • 2009/09/03 Ver.5.32に対応。
  • 2009/08/29 全体的に見直し。
  • 2009/07/24 Ver.5.27に対応。
  • 2009/07/12 Ver.5.24に対応。
  • 2009/07/03 Ver.5.21に対応。
  • 2009/06/30 Ver.5.18に対応。
  • 2009/06/21 Ver.5.16に対応。
  • 2009/06/18 Ver.5.15に対応。
  • 2009/06/13 Ver.5.14に対応。
  • 2009/06/05 Ver.5.13に対応。
  • 2009/05/30 Ver.5.12に対応。
  • 2009/05/23 Ver.5.11に対応。
  • 2009/05/7 Ver.5.8に対応。
  • 2009/03/7 やっつけで作成。
Clone this wiki locally