クマーなひとときv2

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

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を有効に出来ると知ったので試した。
カラフルでこれ好き。是非活用したい。

VimFxから画面上の要素を取得する

Issue投げたやつ。
最初質問した時点では、browser console と web console を勘違いしてました。

マニュアルにも追記されたため、もう勘違いする人も出ないはず(白目

後、config.js 内部で content オブジェクトにアクセスするのは「terrible hack」らしい(e10s環境)
これも全然気付いてなかったので、マニュアルに従い、frame.jsと組み合わせた。

コード

最終的に上手くいったコードが以下。
以前の記事で書いた「選択文字列をGoogle翻訳」の処理を変えただけですねこれ。

config.js

vimfx.addCommand({
  name: 'copy_ex',
  description: 'c_"# <title>\\n<URL>"でURLコピー',
  category: 'location',
}, ({vim}) => {
  let url = vim.window.gBrowser.selectedBrowser.currentURI.spec
  // ここで指定してはいけない。frame.jsで取得した値を使用すること。
  // let title = vim.window.content.document.getElementById("ja").innerHTML 
  vimfx.send(vim, 'getElementById', {id: 'ja'}, title => {
    let fmt = "# "+title+"\n"+url
    gClipboardHelper.copyString(fmt)
    vim.notify("Copied String: " + fmt)
  })
})

frame.js

// 指定IDの文字列を返す
vimfx.listen('getElementById', ({id}, callback) => {
  let elem = content.document.getElementById(id)
  let title =
    (elem != null) ? elem.innerHTML
                   : content.document.title
  callback(title)
})

指定したIDが存在するならそのIDの内容をコピー、
存在しなければページのタイトルをコピーする。


これでまた少し便利になった。

Redmond Path vs Rapid Environment Editor

Windows環境変数を編集するツールの話。

7年近くお世話になった Redmond Path と、今日知った Rapid Environment Editor の比較。

対象となるOSはWindows10。
長いので RP と RapidEE を略称とする。

両者の比較

RPの更新は停止している。 RapidEEは最終更新日が2016/03。

比較対象 RP RapidEE
言語 英語のみ 日本語対応
システム変数/ユーザ変数 起動直後から両方操作可能 システム変数を操作するには管理者として実行する必要がある
操作可能な環境変数 PATHのみ 全て
不正なパス 判別可能。アイコンが×で表示される 判別可能。対象行が赤くなる。
変数の検索
環境変数の操作 変更、削除、ボタンでの並べ替え RPの機能+α色々
環境変数の追加 不可
コマンドライン操作 不可

結論

RapidEEの勝ち。

まだまだ違いはあるけれど、以下の二点が強すぎるので、RapidEEに軍配が上がる。

VimFxでmodalHighlightは現状使いづらい。

Firefox51からmodalHighlightというのに変わるらしいけど、VimFxで使うとちょっと問題がある。
modalHighlightに関しては以下の記事が分かりやすい。

rockridge.hatenablog.com

現象

VimFxでmodalHighlightを使うと、nNで検索結果を探すとき、検索バーにフォーカスが当たってしまう。
そのため、nEnterで確定。を、何度も繰り返さないといけない。とても面倒。

f:id:tonkuma:20160927170714g:plain

Issuesも投稿されてる。

The new modal Safari-style findbar breaks VimFx Find commands (/ and friends) · Issue #760 · akhodakivskiy/VimFx

解決法

簡単な解決法は、新しい表示方法を使わないこと。
findbar.modalHighlightfalseに設定すれば、以前の表示方法に戻せる。(findbar.highlightAllも変更必要かも

f:id:tonkuma:20160927171005g:plain

多分、この設定が標準でonにならない限りは、Issueもwaitingのままなんじゃないかな、と思う。

VimFx0.19.0更新来てた。

眠くて意識飛んでる間に更新きてた。
更新内容はここ見ればいいけど、簡単にまとめる。

ブラックリストを開くマッピング gB の追加

gBを押すことで、ブラックリストを編集出来る。
開いた直後は現在のドメインが追加されているので、そのまま Enter を押すだけで、ブラックリストに追加出来る。

f:id:tonkuma:20160926003656g:plain

変更内容は即座に反映される模様。
自分で設定ファイル作って読み込んでいる場合はあまり関係ない機能。

コンテキストメニューを開くマッピング ec の追加

この機能を待ってた!!!

f:id:tonkuma:20160926003834g:plain

メニューが出てからは各メニューのアクセスキーを使おう。
無い場合は…うん、頑張れ。

hit-a-hintの選択中、テキストで絞り込みが可能になった

確かVimperatorにも同じように絞り込みする機能ありましたね(私は使ったことない)
それがVimFxにも実装された。hint表示中に大文字入力で絞り込み出来る。

以下は hint表示中に HINTS と入力した例。

f:id:tonkuma:20160926004010g:plain

絞り込んだ結果が最後の1つになると、自動的に選択される。
新しく追加されたオプション hints.auto_activatehints.timeout 辺りを弄ればその辺の挙動を変更出来る。

一部マッピング/設定名の変更

設定の追加に伴い、変更されている模様。

設定画面で「~の項目で上書きされてるぞ」と教えてくれていたり、

f:id:tonkuma:20160926004422j:plain

コンソールにエラーログ吐いてくれるので、それを見て直そう。

f:id:tonkuma:20160926004452j:plain

個人的に、 前の記事 で書いた「ヒントに関する操作」がちょっと押しづらくなったのが残念。マッピング的に仕方ないけど。

その他

Issue #812 は修正されてた。もう mode == 'normal' は不要。

? を押すと出るヘルプ画面で、説明文をクリックすると、設定画面の項目に一瞬で飛べる。
以前からあったかもしれない。

f:id:tonkuma:20160926004615g:plain


終わり。よし寝る。