vital モジュールのロードを爆速にする & ロード方法を考える #415

Merged
merged 83 commits into from Apr 29, 2016

Projects

None yet

8 participants

@haya14busa
Member

概要

使い方

  1. :Vitalize . でアップデートしたり新たに :Vitalize
  2. vital#of({plugin-name}) の変わりに vital#{plugin-name}#of() を使う

これだけ!
ただ,vital#of({plugin-name})でも速くなるようにしています. except vital#of('vital')

現時点で既に対応しているプラグイン

ベンチマーク

TODO

注意点

  • vital#of('vital')#137 の外部モジュールを同梱する機能 (個人的にself moduleとよんでいる) は速くなりません.

vital#of をどうするか?

  1. vital#of({plugin-name}) はそのままで,速くしたい場合は vital#{plugin-name}#of()を導入
  2. vital#of({plugin-name}) のインターフェースはそのままで内部で早くする.vital#{plugin-name}#of()は導入しない
  3. vital#of({plugin-name}) のインターフェースはそのままで内部で早くする.vital#{plugin-name}#of()も導入する
  4. vital#of({plugin-name}) は組み込まず vital#{plugin-name}#of()に完全移行
    • 厳密にはvital#of('vital')相当は残す or 別の対応する機構を提供
  5. そもそもvitalのローダ作る必要なくね? vital#{plugin-name}#import({module-name}) とかに移行する.

などなどがあります

あと少なくとも新しいvitalオブジェクトでは s:V.search(), s:V.load(), s:V.exists() とか別にいらないんじゃないかと思うみたいな思いもあります

疲れたのであとは随時追記するかコメントします

@tyru
Member
tyru commented Mar 24, 2016

関連 #40 #41

@rhysd
Member
rhysd commented Mar 24, 2016

関連記事:

http://haya14busa.com/revital-vim-makes-vital-vim-a-lot-faster/

速くなるのは間違いないと思うので入れる方向で行きたいです.

@haya14busa
Member

冒頭コメントちょっとアップデートした.

@haya14busa
Member

このへんに記事に対しての thinca さんのコメント http://lingr.com/room/vim/archives/2016/03/23#message-23153686

@haya14busa
Member

revital で落ちてなかったのに落ちてるのはナンデや(古いvim)...まぁまた対応します

@thinca
Member
thinca commented Mar 24, 2016

インストールされる各モジュールを書き換えることは、モジュールの製作者が予期しない副作用が発生する可能性があるので消極的です。(絶対ダメとは言っていない)

@haya14busa
Member

はい,まぁそれがわかってるから最初は別リポジトリにしたんですが流れ的に行けるかなと(流れ力)

@haya14busa
Member

s:___vital_function___ 以外はスクリプト変数も関数も汚してないですが,まぁ逆に言うとひとつは汚してはいる

@haya14busa
Member

thincaさんが前に言っていたようなsidのみ返す関数にしても同様にスクリプト変数1つ,またはスクリプト関数1つ定義しなきゃだめですね

@thinca
Member
thinca commented Mar 24, 2016

あーあと使用するローダーを :Vitalize のオプションで指定できるようにして、新版は明示的に指定した時のみ使うようにすると良いかも。移行期間的な。gcc の -std=c++14 的な感じで(ちょっと違うけど)。
ただめっちゃ面倒そうなので、どうしても面倒ならそれもやむなし。

@haya14busa
Member

選択はたしかに有りな気はしますね

@haya14busa
Member

s:___vital_function___ 以外はスクリプト変数も関数も汚してないですが,まぁ逆に言うとひとつは汚してはいる

これ 7.3.1170 以降は消せるので,:Vitalize 時にプラグインが7.3.1170以前に対応するかどうか決めれるみたいなのはやるといいかも

@haya14busa
Member

これ 7.3.1170 以降は消せるので,:Vitalize 時にプラグインが7.3.1170以前に対応するかどうか決めれるみたいなのはやるといいかも

冷静に考えると :Vitalizer で指定とかなしで対応できるな

@haya14busa
Member

execute 使うけどスクリプト変数もスクリプト関数も残さないようにした.便利.
テストの落ち方が謎でつらい

@ujihisa
Member
ujihisa commented Mar 25, 2016

APIについて (実装は無視):

これまでvital#of("aaa")みたいにof()という関数を提供してたのはconstructor fuctoryとしてほとんど無名にしたかったための命名でした。今回vital#aaa#of()みたいにユーザプラギン名が文字列でない形ででてくるなら、実装が可能ならofすらとってしまってvital#aaa()みたいにするとより便利さ。(実装上うまく安全に混ぜることができないならスルー力で)

@rhysd
Member
rhysd commented Mar 26, 2016

vital#aaa だとファイルをプラギンごとに分けられないと思います.ただ,確かに vital#plugin#of は微妙ですね…

@haya14busa
Member

vital#pluginname() は無理ですね.

ただ,確かに vital#plugin#of は微妙ですね…

vital#pluginname() は無理となったら結局 vital#pluginname#{無名にちかいconstruct関数名} にしなきゃだめで vital#of() の議論と同じになるのではないでしょうか?

インターフェース追加して vital#pluginname#import() とかはありかなとかは考えてますが, vital#of()相当は残したほうが移行もスムーズにできるし便利そう.

haya14busa added some commits Mar 24, 2016
@haya14busa haya14busa Data.String.Interpolation: String interpolation in Vim script df332e0
@haya14busa haya14busa vitalizer: introduce revitalize! 1eac88d
@haya14busa haya14busa vital#of: use revitalized modules except self module and vital#of('vi…
…tal')
f9fdf43
@haya14busa haya14busa vital: add test for :Vitalize and vital-object 328dd3c
@haya14busa haya14busa Data.String.Interpolation: support old vim ee6a37d
@haya14busa haya14busa vital: avoid variable conflicts a50c063
@haya14busa haya14busa Data.String.Interpolation: fix test 7cc42ae
@haya14busa haya14busa vitalizer: fix path 881d965
@haya14busa haya14busa vitalizer: do not leave any script local variables nor functions f2c30a6
@haya14busa haya14busa vitalizer: support old Vim
Cannot use writefile({list}, {fname} , 'a')
f7c0e39
@haya14busa haya14busa vitalizer: add test to make sure all vitalized module is autoloadable dc4773c
@haya14busa haya14busa Fix unneeded s:FP.join 81d81e1
@haya14busa haya14busa vitalizer: new loader supports to load all modules
New plugin-embeded loader supports to load self module
vital.vim loader supports to load all available modules in runtime path

Fix cyclic dependencies problem as well.
b42f1e4
@haya14busa haya14busa vitalizer: fix old vim handlings a2a7f48
@haya14busa haya14busa _latest__: see filereadable() before :source fe5aec2
@haya14busa haya14busa vitalizer: Be smart! remove g:vital_debug var 78efa23
@haya14busa haya14busa _latest__: silent warning for intended unused variables 2c1e5d4
@haya14busa haya14busa _latest__: unify module path a096ef1
@haya14busa haya14busa vitalizer: use globpath() instead of glob()
for windows...?????
2856f46
@haya14busa
Member

TODO: #413 マッジされたらいらんコミットrebaseする

@haya14busa
Member

リファクタ & windows で落ちてたバグ直せてテスト通ったっ.カンキワッ 🎉

@haya14busa
Member

いままでは vital#of('vital') やセルフモジュールでは __latest__.vim にあるローダーを使ってたんですが,__latest__.vimのコードは消して _latest__.vimの新しいローダーが何でもロードできるようにしました

@haya14busa haya14busa vitalizer: remove debug echom
6485a02
@haya14busa haya14busa added a commit to haya14busa/incsearch.vim that referenced this pull request Mar 26, 2016
@haya14busa haya14busa revital vim-jp/vital.vim#415 0010c03
@haya14busa haya14busa referenced this pull request in haya14busa/incsearch.vim Mar 26, 2016
Merged

Try https://github.com/vim-jp/vital.vim/pull/415 #113

@haya14busa
Member

新しくなった vital のベンチマーク

https://gist.github.com/bf1e12b4ac9112e633e4

100回呼んだ結果

vital#of({plugin-name}) vital#of{plugin-name}#()
0.156313 0.040110

PR以前との比較ではなく,このPRのコードで改善されたvital#of({pluigin-name})vital#{plugin-name}of() の比較です.

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
    4   0.117675   0.117447  neocomplete#helper#clean()
  100   0.117161   0.115500  vital#of()

雑に :profile した結果 vital#of()自体が遅いので vital#of({plugin-name})よりvital#{plugin-name}#of() が速いことがわかるかとおもいます.

まぁそこまで変わんないですが

@haya14busa
Member

PR前と比較したベンチマーク

https://gist.github.com/00feb41e5e43e8ce7745

PR前を計測してるプラグインは https://gist.github.com/haya14busa/bf1e12b4ac9112e633e4 と同じ https://github.com/haya14busa/incsearch.vim で vital.vim をmasterにして:Vitalize .したもの.

先ほどの結果と合わせるとこんな感じ

PR前 vital#of({plugin-name}) PR vital#of({plugin-name}) PR vital#{plugin-name}#of()
1.585097 0.156313 0.040110
@haya14busa
Member

一応,revital.vimの記事のコードよりほんの僅かに遅くなった件調べてみた.

両者ともvital#{plugin-name}#of()

revital.vim PR
0.028437 0.040110

100回まわしてだいたい0.01秒差

function() 毎回よぶところのベンチマーク

TimerStart
for _ in range(s:times)
  call vital#_incsearch#Data#List#import()
endfor
TimerEnd
" => 0.010965

" http://haya14busa.com/revital-vim-makes-vital-vim-a-lot-faster/
" の実装と同じ
let s:module = vital#_incsearch#Data#List#import()
function! s:before_import() abort
  return s:module
endfunction

TimerStart
for _ in range(s:times)
  call s:before_import()
endfor
TimerEnd
" => 0.000481

" script 関数とautoload関数の差が大きいわけではない
" vital#_incsearch#Data#List#import_before() は s:before_import() とほぼ同義の
" ものをファイルに一時的に書いた
TimerStart
for _ in range(s:times)
  call vital#_incsearch#Data#List#import_before()
endfor
TimerEnd
" => 0.000378

ちょうど 0.01 秒くらいかかってるのでやっぱりimport()よぶごとに function() 読んでたのが原因.
:finishに対応することとスクリプトローカル変数・スクリプト関数を残さないようにするためには仕方ないし,どうせ全然遅くない.
あと実際にvital#{plugin-name}#of()から呼ばれるときはロードしたモジュールはキャッシュしてるので,どうせ基本的に1回しか呼ばれない.

haya14busa added some commits Mar 26, 2016
@haya14busa haya14busa _latest__: remove sid cache in s:Vital.unload() 480527c
@haya14busa haya14busa _latest__: do not call matchlist() as much as possible
matchlist() is slow.

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
  100   1.021537   0.920374  <SNR>540__scriptnames()
  200   0.369318   0.355189  <SNR>540__redir()
  100   1.370837   0.345175  <SNR>540__sid()
...

FUNCTION  <SNR>540__scriptnames()
Called 100 times
Total time:   1.021537
 Self time:   0.920374

count  total (s)   self (s)
  100              0.000168   let sdict = {}
54900   0.163763   0.062600   for line in split(s:_redir(':scriptnames'), "\n")
54800              0.708604     let [_, sid, path; __] = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$')
54800              0.106586     let sdict[path] = sid
54800              0.028613   endfor
  100              0.000214   return sdict
024411b
@haya14busa
Member

vital#of('vital') もはやくなった

function! s:_vital_of_vital() abort
  let V = vital#of('vital')
  call V.load('Data.List')
  call V.unload()
endfunction

let s:times = 100

TimerStart
for _ in range(s:times)
  call s:_vital_of_vital()
endfor
TimerEnd
" => PR前 vital#of('vital'): 2.652876
" => PR   vital#of('vital'): 1.182695
PR前 vital#of('vital') PR vital#of('vital')
2.652876 1.182695

revital.vimでやった改善とは別ですが,vital.vimに導入する際にリファクタ改善した結果, vital#of('vital') も速くなった.
これはself module をロードする際も同様の効果が得られるハズ.
ちなみに vital#of('vital') や self module は autoload 関数足せないので,普通に以前のvitalを速くしたという感じ.

@haya14busa
Member

キャッシュありだと変わらない. (.unload()をコメントアウト)

" => PR前 vital#of('vita'): 0.129393
" => PR   vital#of('vita'): 0.124082
@haya14busa
Member

vital#{plugin-name}#import()みたいなインターフェースを足す可能性はありますが,ベースのコードはできてwindows含めてテスト通ったので試していただいたり,レビューしていただけると嬉しいです.

@haya14busa haya14busa _latest__: vital#of('vital') should not try calling autoload function
82fab49
@Shougo
Member
Shougo commented Mar 26, 2016

このローダを使うと、System.Cache.Deprecated がロードできないようです。
ファイル自体はコピーされています。この挙動は意図的でしょうか。

Vim 再起動してやりなおすと直ったので取り消します。
手元のプラグインを変換してますが、今のところ問題ないです。

@haya14busa
Member

ありがとうございます.基本的に後方互換性は維持してるつもりなので,またなにか動かなくなったらそれは意図していないので報告していただけると嬉しいです

@Shougo
Member
Shougo commented Mar 26, 2016

他のプラグインもアップデートしたいんですけど、thinca さんがローダを直しているのでちょっとタイミングが難しいです。

@haya14busa
Member

セルフモジュール(外部モジュールをそのプラグインで使う場合) 以外にはこのPRだと#418 の問題は起こらないはずなので (s:V.search()s:V.exists()では起こるけど....import().load()なら大丈夫) ,一応もしこのPRで :Vitalize してもそこまで今後の手間は変わらないかな...?ただまぁ仮にも まだプルリク状態なのでムズカシイのは確かですね

@haya14busa haya14busa commented on an outdated diff Mar 26, 2016
autoload/vitalizer.vim
+ let self.path2sid = s:Dict.swap(s:ScriptLocal.scriptnames())
+endfunction
+
+function! s:Revitalizer.source_modules() abort
+ for f in self.vital_files
+ call s:_source(f)
+ endfor
+endfunction
+
+function! s:Revitalizer.revitalize() abort
+ let module_data = {}
+ for f in self.vital_files
+ call extend(module_data, self.autoloadablize(f), 'error')
+ endfor
+ " TODO: embed module_data
+ " TODO: gather self module data
@haya14busa
haya14busa Mar 26, 2016 Member

この辺で self module の情報を集めてロード時に使うことによって,self module でも,もう1段階速くできる可能性がある.

@haya14busa
haya14busa Mar 29, 2016 Member

#415 (comment)

速くするという目的だけではなく,autoload関数をtry-catchで試しに呼ぶのはstatusline用の関数内では問題があるので,ここでモジュールが self module かどうかのデータをとっておいて,それをつかって autoload関数を呼ぶかどうか分岐する

@haya14busa haya14busa Revert "_latest__: vital#of('vital') should not try calling autoload …
…function"

This reverts commit 82fab49.

Test fails on windows... Why...???
fc4e23e
@haya14busa haya14busa referenced this pull request in vim-jp/vim-jp.github.io Mar 26, 2016
Merged

宣伝乙 #194

@Shougo
Member
Shougo commented Mar 27, 2016

#418 が入ったので conflict してます。

@Shougo
Member
Shougo commented Mar 27, 2016

バグ報告:

最新版で :Vitalize すると以下のエラーとなります。

Error detected while processing function <SNR>37_import[11]..<SNR>37__import:
line   18:
E605: Exception not caught: vital: fail to call ._vital_loaded(): Vim(return):E700: Unknown function: s:set_dictionary_helper

s:set_dictionary_helper が Prelude にないにもかかわらず、import の関数一覧に入ってしまっているのが原因と思われます。
昨日のバージョンでは起こってませんでした。

@haya14busa haya14busa Merge remote-tracking branch 'origin' into revital
Fix Conflicts:
	autoload/vital/__latest__.vim
	autoload/vitalizer.vim

Merge __latest__.vim changes in _latest__.vim
1a385f5
@haya14busa
Member

conflict 解消しました.

バグについては再現方法がわかりません.もしかしたらちゃんと :Vitalize . できてないんじゃないでしょうか.

あーそれか他のプラグインのPrelude を探しに行ってる? そんなことはないと思いますがとりあえずアップデートして試してみていただけないでしょうか.あと出来れば再現方法

@haya14busa
Member

というか,バグのエラーみると s:_vital_loaded() が失敗したと書いてあるので,そこにプラグインのバグがある可能性があります.昔のvitalはs:_vital_loaded() のエラーを握りつぶしていたので気づかなかっただけで,新しくアップデートして気づいたということではないでしょうか? たぶん master でも再現すると思います

@Shougo
Member
Shougo commented Mar 27, 2016

リセットしてもう一度やりなおしたら再現しませんでした……。
うーん。不思議。

haya14busa added some commits Mar 27, 2016
@haya14busa haya14busa Fix support of self-module 2c6b1c1
@haya14busa haya14busa Add test for self module
3f9003e
@lambdalisue
Member
@haya14busa
Member

...! まさかの Mac ですか..!

@lambdalisue
Member

実機がいま手元にない... お家帰らないと無いけど帰る予定が無い

@haya14busa
Member

Mac はちょっとツライですね...影響が self module だけなのは不幸中の幸い感. なんで落ちるんだろう...

@lambdalisue
Member

考えられるのはMacのtempディレクトリはシムリンクな事かVimのバージョンですかね‥‥

haya14busa added some commits Mar 27, 2016
@haya14busa haya14busa Ensure path is readable before calling s:_unify_path()
s:_unify_path() fails with empty path.
c7df99f
@haya14busa haya14busa Move test plugins under /test/_testdata/vital/ 5d036aa
@haya14busa haya14busa Test symlinked plugin
81939c1
@rhysd rhysd and 1 other commented on an outdated diff Mar 27, 2016
autoload/vital/_latest__.vim
+let s:Vital._get_module = s:_function('s:_get_module')
+
+function! s:_get_builtin_module(name) abort
+ return s:sid2sfuncs(s:_module_sid(a:name))
+endfunction
+
+let s:vital_builtin_dir = printf('autoload/vital/__%s__/', s:is_vital_vim ? '*' : s:plugin_name)
+
+function! s:_module_sid(name) abort
+ let module_path = substitute(a:name, '\.', '/', 'g') . '.vim'
+ let module_rel_path = s:vital_builtin_dir . module_path
+ let path = get(split(globpath(s:_module_sid_base_dir(), module_rel_path, 1), "\n"), 0, '')
+ if !filereadable(path)
+ throw 'vital: module not found: ' . a:name
+ endif
+ let module_full_path = s:_unify_path(path)
@rhysd
rhysd Mar 27, 2016 Member

s:_unify_path() でホームディレクトリ以下のパスは ~/... に変換していますが,filereadable('~/path/to/existing-file')0 になってしまうので L205 の if 文でエラーが投げられてしまうようです.

@haya14busa
haya14busa Mar 27, 2016 Member

アッ... それが原因か...なんでwindowsだと通ってたのだろうか.
s:unify_path()readable()前に呼ばないようにしました

@rhysd rhysd and 2 others commented on an outdated diff Mar 27, 2016
autoload/vital/_latest__.vim
+ redir END
+ let [&verbose, &verbosefile] = [save_verbose, save_verbosefile]
+ return res
+endfunction
+
+if filereadable(expand('<sfile>:r') . '.VIM')
+ let s:_unify_path_cache = {}
+ " resolve() is slow, so we cache results.
+ " Note: On windows, vim can't expand path names from 8.3 formats.
+ " So if getting full path via <sfile> and $HOME was set as 8.3 format,
+ " vital load duplicated scripts. Below's :~ avoid this issue.
+ function! s:_unify_path(path) abort
+ if has_key(s:_unify_path_cache, a:path)
+ return s:_unify_path_cache[a:path]
+ endif
+ let value = tolower(fnamemodify(resolve(fnamemodify(
@rhysd
rhysd Mar 27, 2016 Member

ここってどうして tolower 使っているんでしょう?ファイルシステムによっては大文字小文字区別するのでまずいような…

@tyru
tyru Mar 27, 2016 Member

@haya14busa もしよければ System.Filepath.is_case_tolerant() を使ってチェックしてください。
これはファイルシステムが大文字小文字を考慮するなら0、逆に考慮しないなら1を返します。

@haya14busa
haya14busa Mar 27, 2016 Member

ちょっと上に if filereadable(expand('<sfile>:r') . '.VIM') と書いてあって,case insensitive なシステムでのみtolower()されます.
これは前からあった関数ですが,case insensitive ならキーとして一意にするためにtolowerしてるのでしょう.

System.Filepath.is_case_tolerant() といったvitalモジュールはこのファイルでは使えません.(関数コピペとかは可能ですが.)
まぁ同じ条件式が書かれてるのであるいみ既につかってますね

@rhysd
rhysd Mar 27, 2016 Member

あーなるほど,そこのチェックって case sensitive かどうかのチェックだったんですね.ありがとうございます.

@haya14busa
haya14busa Mar 27, 2016 Member

コメントくらいは書いてもいい気がしますね.書いておきます

@haya14busa
haya14busa Mar 27, 2016 Member

雑ですが足しときましたー

haya14busa added some commits Mar 27, 2016
@haya14busa haya14busa Do not see filereadable() for unified path especially for OS X 0d8ca69
@haya14busa haya14busa Do not use unified path for :source especially on OSX e33a2bf
@haya14busa haya14busa Remove unneeded `/` e2618a2
@haya14busa haya14busa .themisrc: No need to add symlink plugin to runtimepath 90b4551
@haya14busa haya14busa vital: do not use System.File.copy_dir()
The behavior might be different depends on platform
adf85df
@haya14busa haya14busa Merge branch 'travis-test-on-mac-osx' into test-osx
ea2bb45
@haya14busa haya14busa vital: Fix test
It was introduced by rebase conflict
4ae77f4
@haya14busa
Member

このPR では #420 をマージしていて OSX でのテストも行っています

@haya14busa
Member

Mac でだけ落ちました https://travis-ci.org/lambdalisue/vim-gita/jobs/118770605

直しました & テスト追加しましたっ! cc @lambdalisue

@rhysd
Member
rhysd commented Mar 27, 2016

#415 (comment)

この修正で手元ではテストが通ることを確認しました.(with OS X 10.11.4)

@lambdalisue
Member

👍

@haya14busa
Member

あーテストのコードがwindowsで対応してないな.直します.

@haya14busa haya14busa vital: test for symlink plugin doesn't not run in windows
fdf7e76
@rhysd
Member
rhysd commented Mar 27, 2016

vital#pluginname() は無理となったら結局 vital#pluginname#{無名にちかいconstruct関数名} にしなきゃだめで vital#of() の議論と同じになるのではないでしょうか?

確かにそうですね.(個人的にはもう全部 autoload にやらせて vital#pluginname#import(module_name) とかで良い気もしてきましたが,この PR については @haya14busa さんのおっしゃるとおりだと思います.

@haya14busa
Member

vital#pluginname#import(module_name) とかで良い気もしてきましたが

これは割と同意見ですが,追加のシンタックスとして提供するという条件が入ります.

@haya14busa
Member

あーテストのコードがwindowsで対応してないな.直します.

直したっ

@rhysd
Member
rhysd commented Mar 27, 2016

@haya14busa 投稿直後にまずさに気づいてしまったので消しました.すみませぬ…

@haya14busa
Member

@rhysd 🙆

@haya14busa haya14busa added a commit to haya14busa/incsearch.vim that referenced this pull request Mar 27, 2016
@haya14busa haya14busa Update vital in vim-jp/vital.vim#415 529975a
@rhysd
Member
rhysd commented Mar 27, 2016

激 LGTM 🔥

@haya14busa haya14busa added a commit to easymotion/vim-easymotion that referenced this pull request Mar 27, 2016
@haya14busa haya14busa Try vim-jp/vital.vim#415 a9cbf16
@lambdalisue
Member

なるほど。 try/catch で握りつぶすと statusline 非表示わけわかめ問題あるので「あえて」キャッチしないほうが良いかもしれません(コメント書いておけば)

@lambdalisue
Member

というかこの機会に機械的に s:save_cpo 系全部削除して書いてあることを不適にしてしまうのもひとつかも

@tyru
Member
tyru commented Mar 30, 2016

やるとしたら別PRでしょうね。

haya14busa added some commits Mar 30, 2016
@haya14busa haya14busa vital: do not throw builtin error even if in the try-catch
Use :runtime and exists() instead of trying calling autoload function to
see the autoload function exists or not.

Cannot test &statusline in themis.vim, so Skip the test

ref: vim-jp/issues#893
5be3f47
@haya14busa haya14busa vital: fix exists()
6547840
@haya14busa
Member

もともと vital 内の :source では s:save_cpo が undefined になるケースに対応したコードはなかったので,vital module のロード時にこの問題は発生しないのかもしれないです.

そもそもどちらかといえば Vim のよくわからないバグみたいなところありますし,不適にするまでしなくてもいいかも. s:save_cpo だからエラーという保証もなく,再現方法が確立していなかった気もしますし

@haya14busa haya14busa vital: improve performance for vital#of('vital')
5f841ab
@haya14busa
Member

@lambdalisue statusline 内で呼ぶとだめだったというバグ直しましたっ

haya14busa added some commits Mar 31, 2016
@haya14busa haya14busa vital: add document for new loader syntax 15a07d2
@haya14busa haya14busa vital: test: add test for &wildignore handling 754eb24
@haya14busa haya14busa vital: test: improve test for vital#of() cc453fa
@haya14busa haya14busa vital: test: improve test for returned value of Vital.load() 5e7b964
@haya14busa haya14busa vital: test: add test for &wildignore handling of vital#of but skip it
Because it's known bug, but we cannot modify autoload/vital.vim for all
plugins using vital.vim. ref: #259
2dac99c
@haya14busa haya14busa vital: fix :Vitalizer cannot get all available modules
with minor fixes
c6b49a6
@haya14busa haya14busa vitalizer: copy new loader with old loader e900528
@thinca
Member
thinca commented Apr 1, 2016

_latest__.vimvital.vim にするのまだかな。

@haya14busa
Member

あれそれこのPRで、まとめてやるんでしたっけ?わけでもいいと思ってたからやってなかった

@thinca
Member
thinca commented Apr 2, 2016

あー vital#import() を入れようとしていたので、それに対応する vital#vital#import() は入れるもんだと思ってました(これがいらないならそもそも vital#import() も別 PR のはずだと思ったので)。
後付けならそれでも大丈夫です。vital#of('vital') は引き続き動作するんですよね。

@lambdalisue
Member

@lambdalisue statusline 内で呼ぶとだめだったというバグ直しましたっ

あざます! System.Process が佳境なのでどちらかが master に入った段階で試します ;-)

@haya14busa
Member

後付けならそれでも大丈夫です。vital#of('vital') は引き続き動作するんですよね。

はい,既存の vital#of('vital') は引き続き動作するのと,一応根本的には違う変更で別にPR可能なのでvital化はやってませんでした.diffも増えてレビューしずらくなるかと思いましたし.
ただまぁ,そこまで増えるわけではないし,変更するなら一気にとかレビューするにしても一気にやっちゃいたい場合はvital化もやります

@haya14busa haya14busa vitalizer: refactoring re-:Vitalizer
- use Vital loader for DRY
- remove unneeded comments
581c6de
@haya14busa
Member

現在一応 __latest____vital__ 化するというタスク候補以外は全てこのPRでは終わりました.
__vital__化は手元でもまだしてないんですが,もう一緒にやっちゃいたいっという場合はそれもやります

@haya14busa haya14busa vitalizer: fix?
c3a973e
@lambdalisue
Member

質問 or 希望(RFC)

_vital_loaded() 関数で渡される V インスタンスから対象のプラグイン名を取得することは可能でしょうか?加えてその取得方法がプライベート変数へのアクセスではなくパブリック変数・関数へのアクセスで取れるととても良いです(インターフェースの変更が行われない保証)。

今回の修正とは関係ないですが、コア部分の変更になるので可能であればついでに行って頂けると助かります。

用途としては

  • プラグイン固有の augroup を Vital モジュールで定義したい
  • プラグイン固有のバッファ変数を Vital モジュールで定義したい

などです。プラグイン名が取得・利用できれば上記のような Prohibited features に抵触するタイプのモジュール作成が可能になるので助かります(例: git レポジトリの状態変更を感知して自動的に開いている仮想バッファの更新コマンドを呼び出すモジュール など)

もちろん作成時に開発者が任意の文字列を指定するようにすれば良いのですが、プラグイン名が取れればそれで良いはずです(プラグイン名のバッティングがあった場合は Vital 自体がうまく動作しないはず)

@haya14busa
Member

#370s:plugin_name() 足されてますが,このPRでいつのまにかスクリプトローカル変数にしてた.これ #370 の説明とかには足された意図書かれてないけど(ドキュメントもない), @thinca さんもこれパブリックメソッドにする予定でしたかね?

@thinca
Member
thinca commented Apr 3, 2016

あればそのうち使えるかもな程度のやつでした。欲しい要望あるなら public 化に対して反対はありません。

@haya14busa
Member
  • __vital__ 化した
  • .plugin_name() つくった.(というか消してたのを戻した)
  • ドキュメントとかテストちょっと足した.

As far as I know, there are no 残タスク, so please review this PR.

@haya14busa haya14busa Merge branch 'master' into revital
375bc3c
@haya14busa
Member

さすがに既存のhelpのvital#of('vital')修正して回る作業をここでするとdiffが死ぬので別で

@haya14busa haya14busa vital: test: fix __vital__'ize
4abc976
@haya14busa haya14busa added a commit to haya14busa/incsearch.vim that referenced this pull request Apr 3, 2016
@haya14busa haya14busa Update vital a839745
@haya14busa haya14busa added the vitalizer label Apr 4, 2016
@lambdalisue lambdalisue and 1 other commented on an outdated diff Apr 7, 2016
autoload/vital/__vital__/Vim/ScriptLocal.vim
@@ -203,7 +203,7 @@ function! s:sid2svars(sid) abort
endfunction
-" This is copied from autoload/vital/__latest__.vim
+" This is copied from autoload/vital/_vital.vim
" FIXME: Avoid duplication.
@lambdalisue
lambdalisue Apr 7, 2016 Member

vital/_vital.vim からのコピーではなくなったのではないでしょうか?

@haya14busa
haya14busa Apr 7, 2016 Member

確かに.というかavoid duplication 自体autoload/vital.vim では無理な感じだしコメント自体消そうかな

@thinca thinca and 1 other commented on an outdated diff Apr 7, 2016
autoload/vitalizer.vim
@@ -406,6 +414,8 @@ function! vitalizer#vitalize(name, to, modules, hash) abort
let content = [vital_data.name, hash, ''] + installing_modules
call writefile(content, vital_data.vital_file)
+ call s:revitalize(a:to)
@thinca
thinca Apr 7, 2016 Member

本体に組み込む以上 revitalize という名前は違和感があるような?

@haya14busa
haya14busa Apr 7, 2016 Member

それは確かに薄々感じながらもいい名前を思いつかずそのままにしてましたね...

@haya14busa
haya14busa Apr 8, 2016 Member

というか横着して,revital.vimの処理をそのまま移してきた感じで無駄も多かったので修正しましたっ

haya14busa added some commits Apr 7, 2016
@haya14busa haya14busa Vim.ScriptLocal: remove an unneeded comment
5968962
@haya14busa haya14busa Merge remote-tracking branch 'origin' into revital 3dd64f6
@haya14busa haya14busa vital: re-__vital__'ize for merged commit
c614c80
@haya14busa haya14busa vitalizer: refactoring "revital" feature
- Remove "revital" term completely
- Import module once and do not re-import module for revitalizing.
067d2c5
@haya14busa haya14busa vital: do not see autoload function in V.exists()
The target module could be uninstalled but autoload function remains
7716413
@haya14busa haya14busa vitalizer: test: add more vitalizer tests
20b179c
@haya14busa haya14busa vital: fix a:module_name is missing
75de1bd
@haya14busa
Member

いい感じに修正したのに Vim 7.3 on Windows でだけ謎のエラーを吐いて死んでしまいツライ

@lambdalisue
Member

Command exited with code -1073740791

Stack buffer overflow / overrun. Error can indicate a bug in the executed software that causes stack overflow, leading to abnormal termination of the software.

http://www.febooti.com/products/automation-workshop/online-help/events/run-dos-cmd-command/exit-codes/

https://ci.appveyor.com/project/vim-jp/vital-vim/build/620/job/owtymdlc572are3n を見る限り .themisrc すら実行されていないので AppVeyor の何かがアップデートされたことによって露呈した Vim / vim-themis のバグ?


Linking: link /RELEASE /nologo /subsystem:console /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib /machine:AMD64 /nodefaultlib msvcrt.lib user32.lib /nodefaultlib:python27.lib /nodefaultlib:python32.lib /PDB:vim.pdb -debug
%TEMP%\vim-themis\bin\themis.bat --runtimepath %TEMP%\vimproc --exclude ConcurrentProcess --reporter dot
Command exited with code -1073740791

haya14busa added some commits Apr 8, 2016
@haya14busa haya14busa vital: remove unused g:tmpdir 7c9319d
@haya14busa haya14busa vitalizer: remove unused import 7473a17
@haya14busa haya14busa vitalizer: use vital#vital#of() instead of vital#of('vital')
87fd39c
@haya14busa haya14busa vitalizer: test: Skip re-vitalizer#vitalize() test in Vim 7.3 on Windows
4a0bad5
@haya14busa haya14busa --exclude System.Process
30c5f1f
@haya14busa
Member

コミット足してるのに PR上にあらわれない....

@crazymaster
Member

コミット足してるのに PR上にあらわれない....

haya14busa/revital じゃなくて vim-jp/revital の方にpushしちゃってますね

@haya14busa
Member

haya14busa/revital じゃなくて vim-jp/revital の方にpushしちゃってますね

あっほんとですねありがとうございます 🙇 🙇

@haya14busa
Member

とりあえず vitalizer#vitalize() 2回以上(update)かつ,System.Processが両方あるときのみ謎エラーが発生してることはわかった 4a0bad5 + 30c5f1f でテストがとおった

haya14busa added some commits Apr 9, 2016
@haya14busa haya14busa Revert "vitalizer: test: Skip re-vitalizer#vitalize() test in Vim 7.3…
… on Windows"

This reverts commit 4a0bad5.
0aedab1
@haya14busa haya14busa vitalizer: test: exclude only System.Process.Vimproc instead of Syste…
…m.Process
28472cd
@haya14busa
Member

とりあえず vitalizer#vitalize() 2回以上(update)かつ,System.Processが両方あるときのみ謎エラーが発生してることはわかった 4a0bad5 + 30c5f1f でテストがとおった

訂正: vitalizer#vitalize() 2回 は関係ないかもしれず,System.Process.Vimprocのテスト と vital.vimspec のテストが両方絡むと落ちるっぽい.

@haya14busa
Member

このPRのキモ(?)のautoload関数をimportする部分をコメントアウトしてもテスト落ちたのでこのPRのコードは関係ない可能性もあります.単に :Vitalize(でファイルシステムいじる) と System.Process.Vimproc のテストによって何かしらが起こってるのかも

@haya14busa
Member

haya14busa#1

master に vital.vimspec のテストを(適当に)移植したら同じエラーが起こったので,問題があるのは少なくともこのPRのコードではなく,テストコードが悪いか System.Process.Vimproc との兼ね合いが悪いか,そもそものvitalのコードに悪いところがあるかとかが考えられます

何が言いたいかというとまぁ調査とかはまだやろうとは思いますが,コードは変わらんのでレビューとかこのブランチ試すのはしていただきたいなぁという感じです.
100%とは言いませんが,問題が起こるとしても vim7.3 on windows ,かつ :Vitalize 時のエラーでユーザは関係ないと思う.(vitalizerのテスト追加 + System.Process.Vimproc が関係してるので)

@haya14busa
Member

なかったテストを追加していくととむしろ問題を掘り起こしてしまいこのPRなんかダメって感じになってしまうとっらぃ... (問題見つけてるという意味ではいいんですが)

@lambdalisue
Member

Vitalizer のテストのせいでこの PR が許可されないのとっても無駄なので Vim 7.3 on Windows では :Vitalize コマンドをサポートしないことにしてテストをスキップで良いと思うのですがどうでしょう? > 各位

@josefson josefson pushed a commit to josefson/dotfiles that referenced this pull request Apr 21, 2016
Josefson Fraga Squashed 'vim/bundle/vim-easymotion/' changes from 0806257..a6b3c10
a6b3c10 Merge pull request #285 from easymotion/rerevitalize
02884f8 Try vim-jp/vital.vim#415
2dad1b1 Merge pull request #282 from easymotion/revitalizer
07e3665 Update vital
cdc77ad introduce revitalizer for speed!!!
649120e Merge pull request #276 from YggdrasiI/master
33f141c Cursor highlight doesn't exist for some environment
fccf990 Remove local prefix 'l:' from let assignments.
d9c33fd Remove option g:EasyMotion_maximal_jumpmarks.
e790e95 Remove comments with previous regexes.
c7a7f04 Merge branch 'master' into change_keyword_motions
8a4f00b -Update regex in EasyMotion#WBW  ('W' and 'B' movement) -Update regex in EasyMotion#EW ('E' and 'gE' movement) - Add global option EasyMotion_maximal_jumpmarks.  It limits the number of jump targets for the motion. If the search  goes in both directions, they will be handled separately.  The option was just added to speed up the automated tests in t/compare_movements_spec.vim.
d8b4a60 Update vital and fix inappropriate syntax reset
37042d3 - Change EasyMotion#WBK regex. Should now matches the default Vim motions b/w. - Add test to compare different motion algorithm. (WIP. Test trigger   undetectable vim-vspec error)
b1acf67 Init with overwin motions
799491e Fix #237
d005409 Merge pull request #266 from modal/master
f209d82 Correct minor mispelling ovrewin should be overwin
e777916 Make sure canceling easymotion with <C-c> fix #237
fc056f3 fix empty input
fc7d1d9 Make sure the autocmd event exists before doautocmd
65ee835 Merge branch 'experiment-preserve-syntax'
74fc979 IndentLine handlings
f5ecb99 From patch 7.4.792, we can conceal item with matchadd()
f80929a overwin motions now see EasyMotion_do_shade option
d157c4d Avoid side-effect of calling s:findMotion() in EasyMotion#OverwinF()
87e7b88 Preserve syntax and support g:EasyMotion_do_shade for overwin motions
aaa9a4a Preserve syntax
6bad3f4 Manage WinLeave/WinEnter events
65cde0b Update minimal configuration example to use overwin motions
f6e67b3 Fix typo
fb1f658 Update README 📝
c97e03d Bump up version to 3.0
291d92b Merge branch 'overwin' #130
c3d7bae Add document for overwin motions
7578ffe Support jump to first target feature for overwin motions
6975339 Add document for overwin motions
019fc00 Fix jump back to original view fix #210
c646db0 Merge branch 'fix-over-remapping'
d4c14f7 Fix remapping over commandline keymappings
c9cc9ec Merge pull request #241 from somini/master
0ed4621 Merge branch 'fix-vcol'
f306da3 Fix <Tab> character handling for JK motions
656f342 Update vital-hit-hint-motion
00fc328 Now, you can move cursor even over/across window
39abbf3 Happy New Year!
2d2dfa7 Initial tests
a258f4b Keep undocumented ignore_exception option
dd27cd6 Add Documentation
8b0bec6 Better Throw behaviour
e3ee8c9 Extend verbose option to the command-line
5934791 Introduce verbose option
a21d447 Merge pull request #251 from lhassan18/master
2073db0 Proofread

git-subtree-dir: vim/bundle/vim-easymotion
git-subtree-split: a6b3c10b417d90d6751352b53826f94062ff466d
c2d44a2
@thinca
Member
thinca commented Apr 24, 2016

長らく放置してしまってて申し訳ない感じなんですが、これって今ステータスはどんな感じなんでしょう?

@tyru
Member
tyru commented Apr 25, 2016

@haya14busa 現状の問題点として Windows でテストが落ちる、って問題だけで合ってますか?

https://twitter.com/haya14busa/status/719882727361675265

vital速くするPR, windowsテストのエラー意味わからんすぎるし,他にやる修正ないし取り組みモチベの危機みたいなとこあるからさっさと直して取り込んでもらいたい

これ自分も同意なので、とりあえずテストスキップでどうでしょう。
というか現在このPR見る限り AppVeyor 上でテスト成功してるように見えるのですが、もうすでにスキップしている?

@haya14busa haya14busa vitalizer: test: skip test on Vim 7.3 in Windows
And run test System.Process.Vimproc
7c3273c
@haya14busa
Member

はい.あってます.appveyor の vim7.3 build でヨクワカラナイエラーが出ることを本当は修正したい...原因究明したい...という以外は何もやることは残ってないはずです.

ただテスト通っているのは別のテストをスキップしてたので対象の vital.vimspec をスキップするように修正しました.

@haya14busa
Member

厳密にこのPRのheadではなくなってる気もするけど, incsearch.vimやeasymotoinでは前からこのPRをmasterで試していて,今の所おかしくなったというissueはないです.

@Shougo
Member
Shougo commented Apr 25, 2016

unite.vim, neocomplete 等で使用していますが、特に問題はないです。

@ujihisa
Member
ujihisa commented Apr 25, 2016

マージ & ブログ記事たのしみです!

@tyru
Member
tyru commented Apr 26, 2016 edited

Windows on Vim 7.3 で動かない件は Changes に書いておく必要はありそうですね。
ただもう Vim 7.3 を使う人も少なくなってきてるような気はするので、思った程問題ないような気もします。

  • Vim プラグイン開発者に求めること:Windows on Vim 7.3 では現状動かない事を理解した上で vital を使ってもらう
  • このPRで行うこと (Windows on Vim 7.3 で動かない件に対して)
    • known issue としてdocに書く (tyru が別PRでやる)
    • doc の vital#of('vital')vital#{plugin-name}#of('vital') に変更 (tyru が別PRでやる)
    • Issue 作成 🎫 #426
    • マージ 🎉

自分はこの件に関してこれで十分と感じてるんですが、皆さんはどうでしょうか?

@haya14busa
Member
haya14busa commented Apr 26, 2016 edited

Windows on Vim 7.3 で動かない件は Changes に書いておく必要はありそうですね。
ただもう Vim 7.3 を使う人も少なくなってきてるような気はするので、思った程問題ないような気もします。

実はそれよりももっと条件は狭まっていて,

  1. すくなくとも起こるとしても :Vitalize時関連.(またはテスト)
  2. 他のテスト(System.Process.Vimproc)をskipしたりすると通ることから,普通に:Vitalizeする分にはVim 7.3 on Windowsだろうが動く
  3. このPRでバグが入ったわけではなく,そもそもmasterのvitalでもテストのみ移植すると再現する

という感じです.

なので Changes に書くようなことではないかな.
丁寧にやるなら issue 作成プラスknown issue としてdocに書くくらいでしょうか.

@haya14busa
Member

なので

Vim プラグイン開発者に求めること:Windows on Vim 7.3 では現状動かない事を理解した上で vital を使ってもらう

これは言い過ぎで,Windows on Vim 7.3 で:Vitalizeする際に特定の条件で失敗する可能性がある.というだけなはずです.
プラグインを使うユーザに関しては関係ないはず.

@haya14busa haya14busa Merge remote-tracking branch 'origin' into revital
9022a25
@tyru
Member
tyru commented Apr 26, 2016

あー vitalizer の話だったんですね。それじゃ Changes に書かなくても良さそうですね。

@haya14busa haya14busa added a commit to haya14busa/vim-operator-flashy that referenced this pull request Apr 26, 2016
@haya14busa haya14busa Update vital cf572b3
haya14busa added some commits Apr 26, 2016
@haya14busa haya14busa travis: bump up vim-themis version to 1.5.2.1 fbbc268
@haya14busa haya14busa vitalizer: test: do not skip &wildignore handling test
This bug was fixed by #421
079d1cd
@haya14busa haya14busa commented on an outdated diff Apr 27, 2016
autoload/vitalizer.vim
@@ -307,6 +331,79 @@ function! s:build_vital_data(to, name) abort
\ }
endfunction
+" @return {list<[from, to]>}
+function! s:install_module_files(module_files, plugin_name, to) abort
+ " List and check the installing module_files.
+ let install_files = []
+ " for f in files + s:LOADER_FILES
@haya14busa
haya14busa Apr 27, 2016 Member

コメントアウトのこってたので後で消します

@haya14busa haya14busa vitalizer: cosmetic change
447b1e0
@tyru
Member
tyru commented Apr 27, 2016

あとこのタスクもありました (上のタスクリスト更新)。

さすがに既存のhelpのvital#of('vital')修正して回る作業をここでするとdiffが死ぬので別で

上ではドキュメントの修正もタスクとして上げちゃいましたが、こういったドキュメントの修正であれば自分がGWに別PRでやるので、 @haya14busa さんがもう修正の予定がないならマージしても良いと自分は思います。 :shipit:

@thinca
Member
thinca commented Apr 29, 2016

@haya14busa マージしちゃっても良いかな?

@haya14busa
Member

👍👍👍👍👍

@haya14busa
Member
haya14busa commented Apr 29, 2016 edited

vital#of() -> vital#vital#of のドキュメント修正は単にdiff増やしたくなかっただけで grep からの qfreplaceで多分しゅっと直せるけど,やっていただけるなら任せちゃおうかな?

あと,test で呼ばれてる vital#of() も vital#vital#of() にかえれそう

@thinca thinca merged commit 30b51b8 into vim-jp:master Apr 29, 2016

2 checks passed

continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
@haya14busa
Member

マッジありがとうございますっ

@haya14busa haya14busa deleted the haya14busa:revital branch Apr 29, 2016
@tyru tyru added a commit to tyru/open-browser.vim that referenced this pull request May 1, 2016
@tyru tyru Upgrade to new vital (vim-jp/vital.vim#415) 5f8d5e7
@tungel tungel added a commit to tungel/.vim that referenced this pull request May 12, 2016
@tungel tungel Squashed 'bundle/vim-easymotion/' changes from 649120e..5c6f3cd
5c6f3cd update vital
a6b3c10 Merge pull request #285 from easymotion/rerevitalize
02884f8 Try vim-jp/vital.vim#415
2dad1b1 Merge pull request #282 from easymotion/revitalizer
07e3665 Update vital
cdc77ad introduce revitalizer for speed!!!

git-subtree-dir: bundle/vim-easymotion
git-subtree-split: 5c6f3cd9a713491e6b32752a05c45198aa91540a
6076de1
@NonWonderDog NonWonderDog added a commit to NonWonderDog/.vim that referenced this pull request May 19, 2016
@NonWonderDog NonWonderDog Squashed 'bundle/open-browser/' changes from 37a8310..e2bfabf
e2bfabf Merge pull request #87 from tyru/upgrade-vital
5f8d5e7 Upgrade to new vital (vim-jp/vital.vim#415)
5170a17 Merge pull request #85 from tyru/fix/cant-open-filepath
ab2a06a Fix: can't open filepath
6cb4bd3 Update *openbrowser-thanks*
9aefebf Merge pull request #83 from tyru/vim-jp-redirects
85338d9 [AppVeyor] Use vim-jp.org/redirects
505e21c Use suite.after_each(), don't :catch
64f4cad Doc: Update g:openbrowser_no_default_menus description
2db88f0 Add menu on GUIEnter
3fa43a6 Use <Nop> for menu-separator
8a11108 Don't map Select-mode
62c3d27 Cosmetic fix
db04dcc Use :menutrans
41f64e0 g:restart_no_default_menus: Respect &guioptions =~# 'M'
8b342c9 ':OpenBrowser' won't open 'http://203.0.113.11' (Fix #82)
6a8eb25 Add appveyor.yml
c056913 Update README.md
910cd8b Fix test for AppVeyor
cfc0743 Create README.md
881195a Update .travis.yml
e2e57f4 Add tests for MS Windows
b05377d oops s/themis#suite/themis#helper/
c28b2da Add tests with some refactorings
2456f74 Write basic test (only for Linux)
4deae48 Update help
fde2c45 (Fix #81) ':OpenBrowserSmartSearch tyru/open-browser.vim' fails
15e9b3f Make open-browser.vim testable (#1)
fcbdcc9 Merge pull request #80 from anekos/fix/allow-the-url-without-dots
8123820 Allow the url without dots
a1894bc Add .travis.yml
0476982 Fix: infinite loop bug
122f365 Fix: ':OpenBrowserSmartSearch foo bar' throws an error
e4d528a Fix warnings/errors found by vimlint
2ec2875 Improve URL detection
b0326dc Fix <Plug> keymappings tags
61169d9 Small refactoring
f2c50a3 Update vital
616949c Refactoring
39b0190 Fix s:Web.URI._eat_em(): empty string is not 'no match' (#72)
658993b More tolerant URI parsing (#72, #73, #74)
6072647 Fix comments
5dc8916 Merge pull request #74 from rhysd/patch-1
d9983a1 :OpenBrowser should open file with browser by default
e175358 Fix: #71 change broke #70
ce1a1dc More torrelant behavior when there are no words on cursor (#71)
10ee02c Fix deprecation warnings (#70)
f8ca30b Open multiple URLs when selecting in visual-mode (#70)

git-subtree-dir: bundle/open-browser
git-subtree-split: e2bfabfc758351ee3087d4c697d1953660d943ee
60aa10e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment