Create a gist now

Instantly share code, notes, and snippets.

Vim

この記事はFablic Advent Calendar 2016の2日目のエントリです。

Slack

というわけでVimについて書きます。なお余談ながら、Vim Advent Calendar 2016にも一つ記事Vim + Rubyというのを投稿しましたので、そちらも興味のあるかたは参照ください。

Vimを用いたワークフロー

去年のFablic Advent Calendar 2015を見たところVimの記事はないようなので、せっかくなので特定用途のVimの技巧などではなく、著者ujihisaが普段どのようにVimを用いて仕事を進めていたかをざっとまとめてみたいと思います。

大前提として著者はいわゆる中の下くらいのレベルのvimmerです。過去にVimの勉強会やujihisa.vimやVimConfなどの主催をしてきましたが、最近のVimConfで基調講演などをなさっているVim最前線で活躍されている方々にははるか及びません。恐らく著者は最もマジョリティな層に分類されるユーザだと思います。

Agenda

  • vimshell
  • quickrun
  • 1 tab = 1 project
  • 余談: 最近の活動

本エントリでは、後述するVimShellや他のVimプラギンのインストール方法や使用方法までは説明しません。かわりに著者がどのような用途で用いているかを述べていきます。

vimshell

https://github.com/Shougo/vimshell.vim

これがないと話にならないレベルの最重要Vimプラギンです。著者のvimの起動時は、空のバッファではなくホームディレクトリ上でのVimShellのセッションです。

vimshell

著者はターミナルとgvimをそれぞれ起動しますが、ソフトウェア開発に必要なほとんどはgvimのvimshell側で行います。

一般に、GNU Screenやtmuxなどを用いてターミナルのVimとシェルを切り替えたり、ターミナルのVimを<C-z>でサスペンドしてシェルであれこれしてfgでvimに戻ったり、あるいはより単純にgvimとターミナルを<Cmd-Tab>なり<Alt-Tab>なりでウインドウ切り替えで対応するなどの方法があります。著者は過去にすべて試した結果、もっとも直感的でかつVimと最も強く結合しているgvim + vimshellのスタイルに落ち着きました。

他の手法に対するvimshellのメリットは以下です

  • <C-z>/fgと違い、シェルで何かを実行している最中であってもvim側の他のバッファで編集・閲覧を継続することができる
  • ウインドウ切り替えと違い、
  • key mappingの追加や変更などがvimrcからVim scriptででき、かなり自明
  • PATHの設定やaliasの設定にもVim scriptの式が使え、かなり自明
  • :VimShellSendStringなどの便利コマンドで、編集用バッファとvimshellバッファが容易にやりとりできる
  • neocompleteとの統合
  • neosnippetとの統合 (例: 覚えにくいfindコマンドの引数などはスニペットにしてしまう)
  • uniteとの統合
  • その他既存のVimの資源がすべてほとんどそのまま使える

一方、デメリットは以下です

  • 対話的すぎるプロセスの取り扱いが自明でない (例: ssh, htopなど)
    • 著者は単にこれらのみを別ウインドウのターミナルで行っています。実際のところこれが開発の妨げになることは意外なことにあまりありません

neovimには:terminalがありますが、あれはneovim上のウインドウでターミナルが動作するというもので、vim上でシェル (ターミナルではない) が走るこのプラギンとは独立したレイヤです。作者のShougo (暗黒美夢王)さんはneovim使いですが、恐らく両方を使い分けていることでしょう。

quickrun

vimshellとほぼ同程度に、これがないと話にならないレベルの最重要Vimプラギンです。quickrunがIRBなどの対話的な実行環境を陳腐化しました。

quickrun

ちょっとした数値計算、日数計算(例: 今日から90日後って何月何日かな?)などの書き捨てのスクリプトが必要なシーンは、平均して一日に20から30回発生するものですが、そういったときに真価を発揮するVimプラギンです。作者のthincaさんは恐らくもっと使っているでしょう。

quickrun

ScalaやClojureなど、プロセスを新規に起動するのはつらいプログラミング言語処理系を触るときもquickrunならバッチリです。runnerにConcurrentProcessを指定することで、既存のsbt/leinプロセスを再利用することができ、quickrunが一瞬で完了します。詳しくは著者のvimrcの設定などをご覧ください。clojureの場合はneoclojureをインストールしますとそのあたりの設定が容易になります。

1 tab = 1 project

tabpagecdtabpagecolorschemeを用い、タブごとに違うカレントディレクトリ・カラースキームを持つようにしています。このことが複数のプロジェクトを1つのgvimで取り扱うことを容易にしています。

なお、Vimのタブ間の移動はMacでは<Cmd-j>/<Cmd-k>, Gentoo Linuxでは<Alt-j>/<Alt-k>に設定しています。著者の環境ではChromeなどほとんどすべてのアプリケーションが一貫性をもって同じキーでタブ間を移動できるようにしています。

余談: 最近の活動

実は先月日本にやってきたばかりで、それまではCanadaのVancouverに住んで主にパンやピザや肉を焼いたり、肉を低温料理したりしていました。

Porked yesterday pic.twitter.com/MZoeF9WnDA

— ujm (@ujm) October 12, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Grilling beef steaks is always fun. This time I made them spicy with lots of cayenne pepper. Maybe I put too much pic.twitter.com/HORKPc8TOv

— ujm (@ujm) September 17, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

First time making borscht pic.twitter.com/URpVKF4yOG

— ujm (@ujm) September 11, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

For breakfast tomorrow pic.twitter.com/QtOd27FlT0

— ujm (@ujm) August 16, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

(2/2) it tasted very sour pic.twitter.com/KvOfvEoGe9

— ujm (@ujm) July 29, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

日本に来てからは、郷に入りては郷に従えという諺があるように、なるべく日本料理や簡単な中華料理を作るようにしています。先月から今日までにかけて学んだことをざっと羅列すると以下のようになります。

  • 土鍋炊飯 (これまでは電気の炊飯器でしか炊飯経験なし)

How to cook rice: pic.twitter.com/MkX4JX6K8M

— ujm (@ujm) November 26, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

土鍋炊飯初挑戦から3回。吹きこぼれ率ただいま2/3。土鍋とお米の選択は@muranamsa さんと@sachi_volta さんの影響!かなり楽しかったー。データ取って今後とも精進して行きたい。 pic.twitter.com/MOwRNAjLYC

— ujm (@ujm) November 2, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

After introducing a thermometer to see the temperature inside donabe, I got more stable results from my rice cooking attempts. pic.twitter.com/yETOHPUP2U

— ujm (@ujm) November 21, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
  • 魚焼きグリル

Dinner couple days ago pic.twitter.com/3D91CukBss

— ujm (@ujm) November 30, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Grilled Samma last night. I forgot to make some cuts at the skin pic.twitter.com/xf73kWTl6m

— ujm (@ujm) November 21, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
  • 料理中華鍋 (広東鍋)

Still learning pic.twitter.com/KC5N4YBzBd

— ujm (@ujm) November 29, 2016
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Vancouverに住んでいたときは長い棒状の取っ手のある片手中華鍋 (北京鍋) を用いていました。広東鍋は難しくやりがいがあるガジェットです。まだまだ学習中です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment