Nukino's memorandum

とあるソフト屋の覚え書き

vimからWindowsヘルプを開くスクリプト

vimでJScriptとかrubyとか書いてる際にWindowsヘルプを操作するのが面倒だったので、vim上からWindows ヘルプを開けるスクリプトを作ってみた。

単純に開くだけではなくて

  1. カーソル位置の単語でキーワード検索
  2. vim上でキーワード入力可能

にも対応した。

またファイルタイプ毎に異なるヘルプファイルを指定できる。

準備

まずHTMLヘルプはコマンドラインからキーワードを指定して実行出来ないみたいなのでそれに対応したツールを ダウンロードする。

hhh.exe(vector)

またWindows Vista/Windows 7はWinHelp形式のファイルを開けないので、必要ならば以下のページから対応した ものをダウンロードする。

http://support.microsoft.com/kb/917607/ja

導入

以下を$VIMRUNTIME/autoloadに置く(Windowsの場合 $HOME/vimfiles/autoload など)。
ファイル名はexternalhelp.vimとする(変えると話がややこしくなるので注意)

設定可能な変数は以下の通り

g:external_hlp_hhhexe
hhh.exeのパス
g:external_hlp_winhlpexe
winhlp32.exeまたはwinhelp.exeのパス
b:externalhelp_file
バッファ固有の外部ヘルプファイルのパス
g:external_hlp_files
キー=ファイルタイプ、値=外部ヘルプのパスの辞書。b:externalhelp_fileの方が優先

関数の呼びだし方はソースのコメント参照(ぉぃ

設定例

$MYVIMRC(~/_vimrc)に以下のように記述 ([F2]→カーソル上の単語でキーワード検索、Shift+[F2]→キーワードをVim上で入力)

$MYVIMRC(ex _vimrc)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    "実行ファイルのパス
    let g:external_hlp_hhhexe = 'E:\Tools\hhh\hhh.exe'
    let g:external_hlp_winhlpexe = 'C:\Windows\winhlp32.exe'

    "ファイルタイプ毎のヘルプファイルを記述。
    "空白が入っていても文字列自体をダブルクォーテーションで括っては駄目。
    let g:external_hlp_files = {
      \"ruby":        expand('~/help/ruby-refm-1.9.2-20110729.chm'),
      \"javascript":  'C:\Program Files\Microsoft Windows Script\ScriptDocs\Script56.CHM'
    \}

    "キーマッピング
    nnoremap <expr><silent> <F2>     externalhelp#show_windowhelp(0)
    nnoremap <expr><silent> <S-F2>   externalhelp#show_windowhelp(1)
    inoremap <expr><silent> <F2>     externalhelp#show_windowhelp(0)
    inoremap <expr><silent> <S-F2>   externalhelp#show_windowhelp(1)

externalhelp#show_windowhelp(2,"")とするとキーワードなしで起動する。

あとVimヘルプのキーワード検索(タグ検索?)用関数(show_vimhelp)を使うなら$MYVIMRC(~/_vimrc)を 以下のようにする([F1]→カーソル上の単語でVimヘルプ表示)

$MYVIMRC(ex _vimrc)
1
2
    nnoremap <silent>       <F1>     :<C-u>call externalhelp#show_vimhelp(0)<CR>
    inoremap <silent>       <F1>     <C-o>:call externalhelp#show_vimhelp(0)<CR>

nnoremap <expr>とかだと動かなかった(エラーメッセージが表示される)ので、callコマンドを呼び出すよう にしてある。

補足

WinHelp形式のヘルプにも対応してあるが、手でcallコマンドで呼び出して挙動を見ただけで、 実際にヘルプファイル割り当てて動かしてないので、若干怪しいところとかがあるかも

Comments