Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

なぜ私がVimを使っているかもう一度よく考えよう

$
0
0

tl;dr

なぜ私がVimを使っているのかその理由を書きます。この記事を書いた目的は以下の通りです。

  • 自分がVimを使用する理由を明確にしたい
    • Vimを使用する理由は人それぞれでひとまとめにできないことを表明したい
  • あわよくば他の人がなぜそのエディタ/IDEを使用しているのかフィードバックを得たい

経緯

半年以上前の話ですが、会社の新人くんの開発環境(あまり拡張されていないAtomだった)を横で見ていた時のことです。
(私は人の開発環境が気になって仕方がない性分なので割と人の画面を見ます)
エディタの持つインテリセンスを有効に使えていなかったり、効率的な編集方法をしていなかったため、
私が「ほらおれのVimを見てくれ...便利そうだろ...」とアピっていたら、
新人くんに「Vimを使うべきなのでしょうか?」と聞かれたということがありました。

私がVimを使うのは私なりの理由があるし、彼にその理由がそのまま当てはまらないと思ったため。
Vimは一般的に言われている通り学習コストが高いエディタなので、
自分の開発スタイルをよく考えてチョイスしてほしい。
そしてAtomのもつ機能をもっとうまく使えば、現状よりもっと効率的な編集ができる可能性があると伝えました。

しかし、この説明ではうまく自分の言いたいことを表現できてないのではと思いました。

今思えば、世の中のエディタ紹介記事などを見てみるとVimの説明として、
『中・上級者向けのエディタ。学習コストが高いが使いこなせば超効率いい』
という非常に曖昧な説明が多く、自分がなるほどと思う説明があまりない印象でした。

ならば自分で書けばいいじゃんという気持ちで書いたのがこの記事になります。

エディタに求めるもの

思えば紆余曲折があって、今の私はVimを使っています。
しかし、それは私の開発スタイルにVimが最もフィットするエディタだからであって、
けしてGeekっぽくてチョークールじゃん(昔はそうだった)とか、
Vimこそが至高とか、宗教上の理由で使っているわけではありません。
Vimを使うにあたって検討した事項がいくつもあり、結果としてVimを使っているに過ぎません。

結果として私がエディタに求めるものは以下の通りです。(優先度は上のほうが高い)

  1. ターミナル内で起動する
  2. Vimキーバインドが使える
  3. 拡張性が高い
  4. 高速に起動する
  5. 豊富なファイルフォーマットに対応
  6. 端末を変えても設定を同期可能

ターミナル内で起動する

私の開発スタイルではこの項目の重要度はかなり高いです。
仕事中は基本的にターミナルとブラウザのみ表示し、あとSlackをちょいちょい見る位にしています。

ウィンドウ切り替えが少なければ少ないほど作業効率は上がります。
なぜなら人間は多くの情報を同時にさばけるほど器用ではないと考えていますからです。
その上でターミナルから離れたほうがはるかに効率が上がる作業(画像編集etc...)があれば離れたほうがいいと思っています。

またターミナルで起動できると他コマンドと連携しやすいという利点があります。
具体例はgit commitを打つとVimが起動するアレです。

CLIコマンドからVimなんかのエディタを実行して、
エディタ閉じた後に編集結果を取得する手法って誰が考えたんでしょうね?リーナス?
この動作を考えた人はもう掛け値なしの天才だと思っています。

なお私がターミナルにこもる理由はココにまとめてるのでご参照ください。

Vimキーバインドが使える

Vimキーバインドが自分にとって、最も効率よく編集ができるからです。
詳しい説明はをしている記事が大量にあるので省きますが、具体的には以下になります。

  • ホームポジションを崩さずに最低限の運指で作業ができる
  • モードの存在によりショートカットを設定可能なキーが大量にある

ちなみに逆にemacsのキーバインドじゃない理由は、Ctrlを常時押さえる左手小指が貧弱だからです。
ただ、インサート/コマンドモードのキーバインドはemacsキーバインドにしています。
これはシェル操作時のキーバインドと統一したいというのがその理由です。
ただし補完のキー(<Ctrl-n>,<Ctrl-p>)はデフォルトを潰したくないのでそのままです。

拡張性が高い

これは長い歴史が育んだ大量のプラグインもそうなのですが、どちらかというとその前段である
Vimの豊富なインタフェースをVimscriptにより制御できる点が大きいと思っています。

例えばQuickFixなどの特定のウィンドウをトグル(同じキーで表示/非表示を切り替えするような動作)したければ、
以下のような関数定義した後、キーバインドに登録すればトグルする関数とそれを呼び出すキーバインドの完成です。

function! ToggleQuickfix()letl:nr = winnr('$')cwindowletl:nr2 = winnr('$')ifl:nr ==l:nr2
        ccloseendifendfunction
nnoremap <script><silent><Space>f:call ToggleQuickfix()<CR>

え?Vimscriptが読みづらいですって?それはもう慣れるしかありませんね...

一方でUIの拡張性が低いことについては確かにそうだなと思っています。
そういう不満があるからoni(NeoVimのUIをElectronで作ったやつ)とかがでてきているわけですし。

高速に起動する

プログラムの世界において速さとは力です。ことテキスト編集においてもそれは変わりません。
300ms以内に起動してくれないとすぐ編集できないと感じてしまいます。

豊富なファイルフォーマットに対応

使用するファイルフォーマット毎にごとにエディタを変更するのは
エディタの熟練度の向上という観点から見ると良くありません。
可能な限り一つのエディタで多くのファイルフォーマットをカバーできるに越したことはありません。

端末を変えても設定を同期可能

設定ファイルを指定の場所に置いておけば設定を即座に同期できるのは最高です。
設定の同期がファイルベースですべて自動に行われなければ複数端末で設定の乖離が発生し、
あなたのカスタマイズ熱を冷ましてしまう恐れがあります。

私の来歴とVimに至るまでの流れ

さて私のエディタ選定基準となぜVimが適合するかを書いてみましたが、
Vimを使い込んで結果的にこうなったという感は正直否めません。

そこでなぜこのような選定基準が生まれ、Vimに至ったか。
その過程を私のバックボーンを含めて書くことで上記がより理解しやすくなるのでは。と考えました。

ざっくりいうと私はよくいるSIerからWeb系の転職組です。

SIer時代

連結で社員800人くらいのSIerです勤続年数は約6年でした。

  • 仕事
    • OSはWindows
    • 開発はeclipse
    • メモはサクラエディタ
    • ドキュメントはExcel,Word
  • プライベート
    • OSはMac
    • 開発環境はeclipse
    • メモはAtom
    • 気が向いたときにVim

よくあるSIerスタイルです。大半の開発はJavaだったので開発環境はeclipse一択でした。
一方プライベートでは、Macを使用しており、ターミナルやVimを使うと便利だぜという記事の数々に影響され、
Vimとzshをインストールして.vimrcや.zshrcをいじったりしていました。
しかしこのCLI環境をメインに据えるほどの熟練度ではなかったのでGUI+Atomといったりきたりしていました。
一応退職時点でVim歴2年くらいだったと記憶しています。

Web系時代(今ココ)

業務委託もやる系のWeb系です。今は自社サービスの開発チームにいます。勤続年数は約1年半です。

  • 仕事(前半)
    • OSはMac
    • メインの言語はPython
    • 開発環境はいろいろ模索していた
      • Atom
      • PyCharm
      • VScode
      • Vim
    • メモとドキュメント(基本markdownなので)はVim
  • 仕事(後半)
    • OSはArchLinux
    • Vim以外さわってない
    • ターミナルとブラウザ以外さわってない

転職する際、これからのキャリアをサーバサイドエンジニアでやってこうと決めたので、
とりあえず操作は基本的にターミナルにこもることに決めました。
GUI操作を標準にしているとサーバにログイン後の操作に戸惑うことは前職でわかっていたので、
ローカル端末でもCLIを使うことで熟練度を無駄なく上げられると考えたからです。
なお主に使用する開発言語はPythonでした。

開発環境検討

エディタないしIDEは転職してからは特に固定せず、適当に切り替えて色々試していました。
流れとしては以下一覧の上から順番に使って、いまいち満足していなかったのを覚えています。
なお当時Vimキーバインドに多少慣れてはいたので基本的に各エディタ/IDEにVimエミュレータ系プラグインは入れていました。

  • Atom
    • 外観はエディタの中で一番好き
    • 補完やジャンプなどのインテリセンスの設定がうまくいかず動作しなかった
    • 起動が遅い
    • vim-mode-plusのおかげでVimキーバインドはかなり再現されていた
  • VSCode
    • 起動がAtomに比べて早い
    • Vimエミュレータ系プラグインで満足するものが当時なかった
    • デフォルトでいろいろ揃っているのはいいなという感想
  • PyCharm
    • 言語系のインテリセンスは言わずもがな最強
    • Vimエミュレータに不満
    • メモ用途に使うものではないので使い分けが必要だった

当時の不満点

各エディタ/IDEで満足できなかった要因として、
当時既に私がOS操作を大半をCLIで実施していたことが挙げられます。
zshのカスタマイズによりディレクトリやファイル操作はGUIと遜色ない速度で実施できていたのですが、
ファイル編集になると各エディタ/IDEでファイルを開くときにCLIからコールすると、
ウィンドウが切り替えされてコンソールから移動させられます。
それにファイルを開いたとき、既に起動しているプロセスで開いたりするため、
編集中のプログラムと一緒のウィンドウにただのメモが開いたりするのがどうにも我慢できませんでした。

またVimエミュレータ系のプラグインの挙動がどんなに優れていても、
Vimのキーバインドの完全再現ひいてはVimscriptによるカスタム性はどうしても得られませんでした。
コロン(:)から始めるコマンドモードについては再現していたらラッキーぐらいの勢いでした。

またプライベートで育てた環境をdotfilesリポジトリを同期(git pull)すれば
Vimとzshのセットアップが即時完了という状態に慣れていたのですが。
AtomやVSCodeはプラグインの同期処理のために都度プラグインを入れていくつかの操作をする必要があったため、その点についても不満でした。

VimにスイッチついでにOSも

上記の不満の解決方法を考えたとき、割り切って全部Vimでやればいいかなと思いました。
ものは試しとVimで3ヶ月間位過ごすしてみたら、上記の問題は全部キレイに解消されました。
正直インテリセンスが足りないと思う部分もありましたが、
QuickFixを始めとしたVim標準の機能群や<C-o>,<C-i>,<C-^>などのジャンプに慣れれば、定義を見つけたりするのも苦労はないですし
補完も当時deoplete.nvimが安定稼働してきていたのもあって、苦労すればなんとかなるレベルでした。
それにVimでのファイル編集速度も当時の時点で早くなっていたのもあって、
まあインテリセンスがなくともIDEとトントンくらいの作業効率になっていたと思います。
しかしそこに至るまでそれなりの訓練とスタマイズが必要ではありましたが。

なお現在はArchLinuxにVimをインスコしたものを使用しています。
なぜMacからLinuxを切り替えしたのかというと、iTermの文字描画が遅いのが問題です。
Vimコミュニティに参加して気がついたのですがMacのターミナルって描画遅いんですよ本当に。
あとVimとzshの起動時間も早くなります。実測で30%位は早くなります。体感だと2倍くらい速いです。
原因は私もよく解ってないです。
LinuxのディストリにArchをチョイスしたのはなんとなくカッコイイからです。

まとめと補足(エディタスタイル)

Vimを使うといっても人によってその使い方、エディタスタイルが違います。
Vimと一口にいっても以下のように種類がありますし、それはOSや端末などによって変わります。

  • Vim
  • GVim
  • SpaceVim
  • NeoVim
  • Oni

どなたもその人の環境と、環境に合わせて編み出したスタイルがあるはずなのです。
メモ帳の変わりなのか、軽量IDEなのか、他のエディタと併用しているのか。

Vimを使っている人だけでもエディタスタイルに違いがあるのですから、
他のエディタも含めればこのようなスタイルはもっとたくさんあるはずです。

大事なのは何を使うかではなくどう使うかではないでしょうか?
自分のスタイルを見極め、スタイルに最適なエディタを使っていくことこそが我々の考えるべきことです。
そのエディタに対して愛があればなおよしですね。

なおエディタスタイルとは暗黒美夢王さんが言ってた造語です。どっかで聞いた。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>