読者です 読者をやめる 読者になる 読者になる

vim-external作った

Vim

以前はvimrcに書いていた設定を、一つのプラグインにしました。
itchyny - vim-external
vim-externalは現在、3つのマッピングを提供します。

  • <Plug>(external-editor): 現在のファイルを外部エディターで開く
  • <Plug>(external-explorer): 現在のファイルを開くディレクトリを外部エクスプローラーで開く
  • <Plug>(external-browser): カーソルの下の単語やURLを外部ブラウザーで開く

全てのマッピングが、Vimからフォーカスが外れて外部の(external)アプリケーションを開くので、vim-externalという名前にしました。

(external-editor)

現在編集中のファイルを外部のエディターで開くマッピングです。


五億年前くらいに私が競技プログラミングをやっていた頃に使っていたものです。
昔は私の手元のVimクリップボードにコピーできず、submitするときは外部のテキストエディターで開いてコピーしていました。
今となってはあまり使っていませんが、一億年に一回くらい使うので残してあります。

(external-explorer)

現在のファイルを含むフォルダーを、外部のエクスプローラーで開くマッピングです。


このマッピングも、三億年くらい前から使っています。
機能的にはvimfilerの<Plug>(vimfiler_execute_external_filer)と同じです。
ただし、vimfilerのバッファーではなく、普通のファイルを見ている状態からエクスプローラーを開けるのが便利です。
100万年に一回くらい使います。
vimfilerのgeをよく使う人におすすめです。これと少し違うのは、開いたエクスプローラーの中で、現在編集中のファイルを選択してくれるところです。

(external-browser)

現在のカーソル位置のURLや単語を、外部のブラウザーで検索するマッピングです。


機能としてはopen-browserの<Plug>(openbrowser-smart-search)とほぼ同じです。
しかし、open-browserに対して以下のような不満がありました。

  • Opening (done)というメッセージを消せない。

      → 修正されました new variable: g:openbrowser_message by itchyny - Pull Request #47 - tyru/open-browser.vim - GitHub merge two variables to g:openbrowser_format_message (#47) - f5e5e8a - tyru/open-browser.vim - GitHub

  • ビジュアルモードの時、行末までで開くと(v$とした時)、最後の改行も検索ワードに入ってしまう。

      → 修正されました visualモードの時に末尾の改行を取り除く - Issue #48 - tyru/open-browser.vim - GitHub strip new line characters (fix #48) by itchyny - Pull Request #50 - tyru/open-browser.vim - GitHub

      → 修正されました カーソルの下にurlがあるのに左の方のurlが開かれる事がある - Issue #49 - tyru/open-browser.vim - GitHub negate col in openbrowser#get_url_on_cursor() (fix #49) by itchyny - Pull Request #52 - tyru/open-browser.vim - GitHub

  • 「# http://www.google.com」 というテキストの#にカーソルがあるときに使うと、httpで検索してしまう。 (httpはurlの頭なのだから、httpで検索するならurlを開いて欲しい) 他にも、「'http://www.google.com' 」のように、urlをシングルクオートで囲っている時に、カーソルがクオートの上にあるとurlを開けない。

      → 仕様という事です smart-searchで「http」が検索される - Issue #51 - tyru/open-browser.vim - GitHub

最初あった不満点の半分くらいは、既に修正されました。ありがとうございます。
しかし、仕様と言われてしまうとどうにもできなくなってしまうのが辛いです。
人のプロダクトにちょっかい出しているうちに、終いには自作してしまうっていうのは、
やっぱり考え方(コードの美学や使いやすさについて)のズレが原因なんですよね。


URLを正確に取り出すタスクは、意外と難しいです。
上の最後の丸カッコくらいなら正規表現で対応できますが、
シングルクオートとかは非常に難儀な問題で、externalも対応できていません。
例えば、
http://en.wikipedia.org/wiki/Euler's_formula
本当にValidかどうかは知らないけれど、URLとしては機能しているんですよね。
さらにシングルクオートでURLを囲んでいるケースも多くて、

var url = 'http://www.google.com';

両方のケースもあるんですよね。

var url = 'http://en.wikipedia.org/wiki/Euler\'s_formula';

そう簡単に対応できるものでは無いと思います。
まぁレアなケースですし、エスケープにも対応し始めるとそれこそ泥沼なので、やらないのが正解でしょうね。



Vimに引きこもるようになると、他のアプリケーションに移動すると言えばブラウザーぐらいしか無くなってしまうんですよね。
external-browserはよく使うけれども、external-editorやexternal-explorerはほとんど使わないというのは、そういうことだと思います。


open-browserは悪くありません。私がちょっと気に入らなかっただけです。
私のexternal-browserはGoogleしか対応していません。
open-browserは他の検索サイトに変更できますし、他にも色々設定できて素晴らしいと思います。
気に入らない挙動を仕様と言われてしまっては、使い勝手に対する価値観が違うのかなぁと思ってしまうのです。
コードを読んでいるうちに、自分で書いたものを使いたいなぁとか思ってしまうわけです。
そう言えば、私が作ってきたlightlineもcalendarも、それ以前の物が気に入らない所が発端なんですよね。
価値観は十人十色なので、こればかりは仕方がないです。押し付けるものでもありませんし。


ブラウザーだけではなく、外部エディターや外部エクスプローラーも開きたくなることがありそうだと思った方は、是非試してみてください。
   → itchyny - vim-external


まとめ

  1. 以前はvimrcに書いていた、エディターを開く設定とエクスプローラーを開く設定を、vim-externalとしてプラグイン化した。
  2. open-browserの挙動や実装が気に入らなくなった。
  3. vim-externalに、新しくexternal-browserを実装した。
  4. open-browserの明らかなバグは、Pull Requestして直してもらった。
  5. やはりexternal-browserを使っている。