プログラムを書いていると「お、なんだこの関数?」と思いググることってよくあると思う。
そんな時一々単語をコピーし、ブラウザを開き、検索バーに打ち込んで検索している自分に腹が立った。なぜこんな無駄な動きをしているんだ。
プログラムに限らずREADMEなどドキュメントを読んでいるときも多々遭遇する。
息を吸うようにググりたい
私はエディタがVimなので本来ならターミナルから動くことは許されない。
唯一「ググる」という行為は許しているが、それでもブラウザに行くまでの動作は限りなく短いほうがよい。
今までのググるまでの道のりは以下の通り。
- 調べたい単語が見つかる
- 単語をコピーする
- ブラウザに移動する
- 検索バーにペーストする
長過ぎる...
理想は「調べたい単語が出てきた時点で既に検索が終了している」状態が望ましい。
関数作った
ということで理想に限りなく近い関数を作った。もちろんVimScriptだ。
" カーソル下の単語をGoogleで検索する function! s:search_by_google() let line = line(".") let col = col(".") let searchWord = expand("<cword>") if searchWord != '' execute 'read !open https://www.google.co.jp/search\?q\=' . searchWord execute 'call cursor(' . line . ',' . col . ')' endif endfunction command! SearchByGoogle call s:search_by_google() nnoremap <silent> <Space>g :SearchByGoogle<CR>
調べたい単語の上で<SPACE> g
をタイプすれば検索された状態のブラウザを開く。
割と理想に近いと思う。
解説
特に難しいこともしていないが一応。
上の関数をシンプルに書くと以下。
" カーソル下の単語をGoogleで検索する function! Search_by_google() let searchWord = expand("<cword>") execute 'read !open https://www.google.co.jp/search\?q\=' . searchWord endfunction
他の部分はエラー判定やキーバインドの設定なので無視して構わない。
調べたい単語の上で:call Search_by_google()
と打てばググることができる。
やっていることは
- カーソル下の単語を取得
- Vimを開いたままシェルコマンドを実行
のみである。
1. カーソル下の単語を取得
これは
expand("<cword>>")
でゲットできる。他にもファイルパスとか取得できたりするので:help expand
で調べてみると楽しいと思う。
2. Vimを開いたままシェルコマンドを実行
execute 'read !open https://www.google.co.jp/search\?q\=' . searchWord
肝はread
。これを付けないで!open https://...
と実行すると、
press enter or type command to continue # もしくは 続けるにはENTERを押すかコマンドを入力してください
と出力され、VimからShellに操作を奪われてしまう。
これを回避するためにread
を使う。
readって何?
詳しくは:help read
で調べてくれればいいが、ざっくりいえばコマンドの出力をVimにそのまま貼り付けるコマンド。
例えば
:read !ls " もしくは :r !ls
と実行すると、ls
の結果がVimに出力される。
もしくはread
を使わなくても、Shift+V→:!ls
のようにVisualモードに切り替えてから実行しても同じ結果が得られる。
shellコマンドのopen
は出力を返すものではないので、Vim上に出力されるものがない=Shellに操作を奪われずVim上で実行したように見える。
ただ、readでコマンドを実行するとカーソル位置が行の最初に移動してしまうため、
let line = line(".") let col = col(".") execute 'call cursor(' . line . ',' . col . ')'
でカーソル位置を実行したときの位置まで戻している。
終わり
「:help
で調べてくれればいいが」と何回も言っているが、本当に:help
は有能なので騙されたと思って実行してみてほしい。きっと楽しいから。
でもVimで欲しい情報を得たい時、phpとかをググるより難しいな。欲しい情報が中々出てこない。
今回だったらshellに操作を奪われないためにどうするかに結構悩み、「"press enter or type command to continue" vim」でググっていたがわからなかったので、とりあえずvim.jpを読んでみた。偶然read
を見つけることができたからいいが、もうちょっとググり力を上げたい。
まあでも道中で知らないVimのコマンド知ることできたし、こういう遠回りは積極的にしていきたい。