クマーなひとときv2

雑多なメモ。twitterで書ききれないもの等。

組込版pythonを使ってvim8のif_pythonを有効化させる

今の職場、PCにインストールするパッケージが管理されているため、
python3のインストーラを使用できない。

PCによっては、管理者権限が無いため、そもそもインストーラ動かせない。

そんな環境でも、vim8のif_pythonを有効化して、denite.nvimを動かしたい。
というわけで、色々試した結果動かせたので、その時のメモ。

環境は以下の通り。

  • Windows10 64bit
  • vim8 Kaoriya版

結果だけ見る時は、最後の「まとめ」を見ればOK。

前準備

python3のパッケージを公式から取得してくる。
インストーラは使えないため、組込版を取得する。

Python Release Python 3.5.2 | Python.org

f:id:tonkuma:20161224040300j:plain

試す前に一応、:echo has('python3'):py3 print(sys.version)の結果を確認しておく。

echoは0を、printは以下を返す。

E370: Could not load library python35.dll
E263: Sorry, this command is disabled, the Python library could not be loaded.

取得したパッケージは展開しておく。また、フォルダ内にあるpython35.zipも展開しておく。

python3>ls python35.zip
python35.zip

試行1: python35.dllとvcruntime140.dllを$VIMに置く

dllだけ入れてみる。

展開したフォルダに移動し、中身を確認。

python-3.5.2-embed-amd64> ls *.dll
python35.dll  python3.dll  sqlite3.dll  vcruntime140.dll

python35.dllを$VIMにコピー。

vim8> cp ../python-3.5.2-embed-amd64/python35.dll .
vim8> ls python35.dll
python35.dll

その結果、変化はなかった。

E370: Could not load library python35.dll
E263: Sorry, this command is disabled, the Python library could not be loaded.

どうやら、以下の3.8. Python 埋め込みのための配布を読む限り、Microsoft C Runtimeが必要っぽい。

3. Windows で Python を使う — Python 3.5.2 ドキュメント

もちろんPCに入ってない。
しかし、pythonのフォルダ内にvcruntime140.dllというファイルがあったため、それを入れてみる。

vim8> cp ../python-3.5.2-embed-amd64/vcruntime140.dll .
vim8> ls vcruntime140.dll
vcruntime140.dll

その結果、:echo has('python3')は1を返した。

しかし、printを実行すると、異常終了した。

f:id:tonkuma:20161224040519j:plain

うーん。

試行2: 全部$VIM直下に突っ込む。

取得したファイルを、そのまま全部放り込んでみた。

vim8>cp -r ../python-3.5.2-embed-amd64/* .

その結果、動いた。異常終了しない…?

3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]

一応目的達成だが、$VIM直下がファイルだらけになるのが嫌なため、他のやり方を探してみる。

試行3: python3のフォルダを$VIMに置く

展開してできたpython3のフォルダをpython3にリネームして$VIMに置き、vimrcにパスを追加してみる。

vim8>ls python3
_bz2.pyd          _hashlib.pyd          _overlapped.pyd  pyexpat.pyd   python35.zip  sqlite3.dll
_ctypes.pyd       _lzma.pyd             _socket.pyd      python.exe    pythonw.exe   unicodedata.pyd
_decimal.pyd      _msi.pyd              _sqlite3.pyd     python3.dll   pyvenv.cfg    vcruntime140.dll
_elementtree.pyd  _multiprocessing.pyd  _ssl.pyd         python35.dll  select.pyd    winsound.pyd

念の為、両方に追加。

set runtimepath+=$VIM/python3/
set path+=$VIM/python3/

その結果、python35.dllが見付からなかった。

OSのPATHじゃないと検索してくれない?

試行4: pythonthreedllを設定する

if_pythonのヘルプを読むと、pythonthreedllというのがあった。

MS-Windows ~

To use the Python interface the Python DLL must be in your search path.  In a
console window type "path" to see what directories are used.  The 'pythondll'
or 'pythonthreedll' option can be also used to specify the Python DLL.

これで使用するDLLを指定できるみたいなので、指定してみる。

set pythonthreedll=$VIM/python3/python35.dll

vcruntime140.dllも見えてないと駄目なのは試行1で判明しているため、
$VIM直下に置いておく。

vim8>ls vcruntime140.dll
vcruntime140.dll

その結果、echoは1を返し、printも動作した。
しかし、denite.nvimは動作しなかった。モジュールが見付からない模様。

[denite]   File "C:/Users/45942/prog..im8/vimfiles/dein/.cache/_vimrc/.dein~
/rplugin/python3/denite/source\file_point.py", line 9, in <module>
[denite]     from socket import gethostbyname
[denite]   File "socket.py", line 49, in <module>
[denite] ImportError: No module named '_socket'
[denite] Please execute :messages command.

もう少しっぽい。

試行5: runtimepath再設定

ヘルプを読むと、runtimepath/pythonxからモジュールを探すという記述があった。

In python vim.VIM_SPECIAL_PATH special directory is used as a replacement for 
the list of paths found in 'runtimepath': with this directory in sys.path and 
vim.path_hooks in sys.path_hooks python will try to load module from 
{rtp}/python2 (or python3) and {rtp}/pythonx (for both python versions) for 
each {rtp} found in 'runtimepath'.

確認してみると、確かにruntimepathに$VIMは含まれていないため、追加してみる。

set runtimepath+=$VIM

その結果、denite.nvim動作した。やったぜ。

f:id:tonkuma:20161224041716j:plain

まとめ

組込版のpython3を使い、
vim8でif_pythonを有効化して、denite.nvimを動作させる事ができた。

まとめると、以下の手順になる。

① python3の組込版を取得。
② 取得したファイルを展開し、python3に名前変更。その中にあるpython35.zipも展開。
③ 展開してできたフォルダを$VIMに置く。
④ 上記からvcruntime140.dllだけ$VIM直下にコピー。

  • 既にOSのPATHにvcruntime140.dllが存在するならこの手順は飛ばして大丈夫。
    (家の環境がそうだった)

⑤ vimrcに以下を追加。

  • set runtimepath+=$VIM
  • set pythonthreedll=$VIM/python3/python35.dll

試してて思ったけど、vim8にもneovimのCheckHealth欲しい…欲しくない?

Vimperator メモ

いいタイトル思い付かなかった。

今までお世話になったVimperatorも、e10sやWebExtensions対応で、先行きが見えない。
使えなくなる可能性高いし、その前に何か書こうと思ってようやく書き始めた。
始めるのが一番エネルギー必要って聞いた事あるけど、ほんとその通りだと思う。

環境は以下の通り。なお、Firefoxはポータブル版を使用。

Vimperator: 3.15.0 (created: 2016/10/05 01:11:26)
Firefox:  Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0

あと、何故か一部のgifが正常に表示されないんだけど、原因さっぱりなので放置。

  • この記事について
  • Vimperatorとは
  • 特徴
  • 良く使ってた機能
    • Smart Completions
    • タブ検索
    • 色んなコマンド
    • ブラウザ設定変更
    • Vimperator設定変更
    • マッピング
      • Normal Mode
      • Insert Mode/Command Mode
      • サイト固有の設定
      • サイト毎に無視するキーの設定
    • 略称名の指定
    • クイックブックマーク
    • 自作コマンド
    • 各種プラグインの設定
      • caret-hint.js
      • mouse_gestures.js
      • multi_requester.js
      • copy.js
      • twittperator.js
      • hint-yank-paste.js
      • toggler.js
  • 最後に

この記事について

個人的なVimperatorのメモ。 今までどんな風にVimperatorを使ってきたかを思い出しつつ、自分のrcを見ながら書く。

続きを読む

win10でLeeyesがエラーになる理由が分かったので、設定を見直した話

2019/07/21 ver1803位から、また落ちるようになってる。他の探したほうがいいかもなぁ。

win10にしてからのちょっとした不満で、普段使っているビューア「Leeyes」が、定期的にエラーで落ちる、というのがあった。

f:id:tonkuma:20161127140629j:plain

原因も分からず、<A-F4>等で終了する事もできないため、わざわざタスクマネージャ起動して
強制終了していたんだけど、ある設定を直したら落ちなくなったのでメモ。

壁紙変更ソフトの設定を直す

FastChange!! という壁紙変更ソフトを使用して壁紙を定期的に変更しているけど、
エラーになるタイミングが壁紙変更と全く同じだった。

FastChange!!が悪いというわけではなく、他の手段で壁紙変更しても、結果は同じ。

というわけで、試しに、Leeyesが起動中は壁紙変更を実施しないように設定したところ、エラーは起きなくなった。

f:id:tonkuma:20161127140613j:plain

何故、壁紙変更と同時にエラーが起きてしまうのかは分からないままだけど、
エラーでなくなったし、気にせずこのまま使う予定。

タブレットとか購入するまでは、Leeyesを使い続けたい。

Firefox/Chrome vim拡張のユーザ数とかissue数とか。

ふと気になったので、Firefox/Chromeで使用可能なvimプラグインの、
ユーザ数とかissueの数を調べたやつ。

Firefox

思ったよりユーザ数少ない。こんなものなのかな。
あとVimperatorはMuttatorのissueも混ざってるので、実際のissueはもっと少ないはず。

名前 ユーザ数(AMO) 最終更新日(AMO) issueの数(Open/Total) 一言
Vimperator 32217 2016/10/15 148/459 言わずと知れた子。e10s対応どうなるのかな。
VimFx 17312 2016/10/22 2/624 e10s環境対応済みの子。
Vimium 2597 2012/01/17 - 更新されてない。多分Chromeに移行したのかな。

Chrome

流石シェアNo.1なだけあって、ユーザ数多い。しっかしVimium圧倒的だなぁ…

名前 ユーザ数(CWS) 最終更新日(CWS) issueの数(Github) 一言
Vimium 232897 2016/10/01 157/1618 Chromeで一番有名っぽいvim拡張。シンプル。
cVim 16508 2016/06/22 174/444 多機能なイメージ。
Vichrome 11754 2013/05/25 26/59 日本人作者。migemo検索使える。
Vrome 6276 2016/02/01 91/329 使ったことない。。

「Vimperatorのissue多いなぁ…」から気になって調べたんだけど、今も開発が続いているものについては、
VimFxを除いてどこも同じ感じ。

やっぱり使用者数に対して、開発が追い付いてない、って事なんだろうか。
Vimperatorもe10sのissueでそんな感じの事書いてたし。

dein.vimインストール時にset shellslash忘れててエラーになった話

確認用に1からvimrc書いた時、set shellslash書き忘れてて、
「何でエラーなるんだああああ」ってなったのでメモ。

問題のvimrc

filetype plugin indent on
let $MY_VIMRUNTIME = $VIM . "/vimfiles"

if &compatible
  set nocompatible
endif
let s:dein_dir = expand('$MY_VIMRUNTIME/dein')
let g:dein#install_log_filename = s:dein_dir . '/dein.log'
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)
call dein#add('Shougo/dein.vim')
call dein#add('Shougo/denite.nvim')
call dein#end()
call dein#save_state()
endif
if dein#check_install()
  call dein#install()
endif

filetype plugin indent on

発生した問題

dein.vimインストール完了のダイアログが出た後、以下のエラーになる。

_vimrcの処理中にエラーが検出されました:
行   17:
E117: 未知の関数です: dein#load_state
E15: 無効な式です: dein#load_state(s:dein_dir)
行   24:
E117: 未知の関数です: dein#check_install
E15: 無効な式です: dein#check_install()

インストールされたはずのdein.vimが見えてない模様。

原因

多分、パスに、(バックスラッシュ)と/(スラッシュ)が混在していること。
vimだとなんだけど、ブラウザで見るとになるから、くっそ見にくい。

  runtimepath=~\Downloads\tmp\vim80-kaoriya-win64\vimfiles\dein/repos/github.com/Shougo/dein.vim\,~/vimfiles

expand()で\vimfiles\deinまで展開されて、以降は直接文字連結してるから、/区切りで入る。

let $MY_VIMRUNTIME = $VIM . "/vimfiles"
let s:dein_dir = expand('$MY_VIMRUNTIME/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

解決手段

  1. set shellslashを設定する。これにより、vimによって/に変換される。

  2. 区切り文字に/を指定している箇所を、全てに変更する。

  3. set runtimepathしてる所を以下の通り変更する。

execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p:gs?\\?/?')

要は、使われる区切り文字が統一されてれば大丈夫、と思う。


普段なんとなく設定してたけど、Windows環境では便利なオプションだなぁ、と、
再認識したわけでした。

cVimでも自分でスクリプト追加出来るらしい

Firefoxで画像読込遅い原因調べてる最中に、cVimでもスクリプトを書ける事を知った。
Custom script examples · 1995eaton/chromium-vim Wiki · GitHub

なお、遅い原因は見付からず仕舞。悲しい。

もしかしてこれ、VimFxで書いたスクリプト、こっちにも移植出来るんじゃね?と思ったので、試した。
結果、問題なく動作した。

copy_title_and_url-> {{
  let url = document.URL;
  let title = document.title;
  let fmt = title+" "+url;
  Status.setMessage(fmt, 3);
  Clipboard.copy(fmt);
}}
map yp :call copy_title_and_url<CR>

Firefox固有の機能を使ってる箇所は当然そのまま移植出来ないけど、
それ以外のJavascriptだけで書いてる部分は問題なく移植出来そう。

というわけで、サブブラウザとしてずっと使っている CentBrowser に追加しといた。URLのコピーとかこういう機能はやっぱあると便利。

後は試しにツールバークリックとかも移植しときたい。
多分 JavaScript APIs - Google Chrome とかで調べれば行けそうな気がする。

vim8にdenite.vim入れて動かしてみた

vim8でもexperimentalだけどdenite.vim動くらしいので、入れてみた。
インストールはdein.vimで。一度vim8のパッケージマネージャも使ってみたい感ある。

call dein#add('Shougo/denite.nvim') " TODO: vim8で試したい

以下、インストール後に行ったこと。

  • file_recで使用する検索コマンド?を、win版のripgrep(rg.exe)に変更した。
    初期のままだと検索結果に何も出力されなかったため。
call denite#custom#var('file_rec', 'command',
  \ ['rg', '--files'])
  • file_recのmatchersをmatcher_regexpに変更した。
    初期のmatcher_fuzzyだと、denite.vimのREADME.mdが探せなかったため。
call denite#custom#source(
  \ 'file_rec', 'matchers', ['matcher_regexp'])

そして、実際に動かしたGIFが以下。正直な所、大きな差を感じる事は無かった。 加えて、denite.nvimでは、検索にrg.exeを指定したためか、実行時にcmdが毎回立ち上がって正直ちょっとウザく感じた。 かといってこれ設定しないと何も検索に引っ掛からないしなぁ。file_mruは初期状態でも大丈夫だったんだけど。

unite.vim f:id:tonkuma:20161013215021g:plain
denite.nvim f:id:tonkuma:20161013215049g:plain

やっぱり、neovimじゃないと本来の力を発揮出来ないのかもしれない。
もしくは、環境や設定でも、大きく変わるのかも。

2016-10-13T22:33:19 追記

syntax highlightを有効に出来ると知ったので試した。
カラフルでこれ好き。是非活用したい。