Pythonを用いてVimを拡張してみよう

文:Nick Gibson(Builder AU)
翻訳校正:村上雅章・野崎裕子
2007/12/17 08:00

テキストエディタVimはPythonのスクリプティングもサポートしている。Pythonを使ってVimに独自の機能を追加する方法をご紹介する。

 新たなテキストファイルをオープンし、そのファイル名をpyextend.vimとする--目的の関数をこのファイルに記述した後、それをvimエディタにロードするために「ソーシング」を行うことになる。該当コードが出来上がったのであれば、.vimrc(Windowsの場合は_vimrc)ファイルでそれをインクルードすることによって、VimまたはgVimのセッション開始時に必ずロードされるようにすることができる。

 pyextend.vimに以下のコードを記述してほしい。

function! GetHTML()
python << EOF
import vim, BeautifulSoup, urllib
handle = urllib.urlopen(vim.current.line)
soup = BeautifulSoup.BeautifulSoup(handle.read())
vim.current.buffer[:] = soup.prettify().split('\n')
EOF
endfunction

 このコードには多くの処理が含まれているため、1行ずつ説明していきたい。

function! GetHTML()

 1行目では、GetHTMLというVimscriptの関数を定義している。この関数は引数を受け取らない。Vimでは、関数名は必ず大文字で開始しなければならない。functionの後の!記号は、GetHTMLという名前の関数が既に存在していた場合にそれを上書きするようVimに指示するためのものである。

python << EOF

 この行では、"EOF"のみからなる行がくるまで、VimscriptではなくPythonのコードが記述されていると解釈するようVimに指示している。

import vim, BeautifulSoup, urllib

 ここで、使用する3つのモジュールをインポートしている。vimモジュールはVimウィンドウとその内容にアクセスするためのものであり、BeautifulSoupはHTML解析に使用するライブラリであり、urllibはウェブページをダウンロードするために使用するライブラリである。

handle = urllib.urlopen(vim.current.line)

 handleという変数を作成し、ウェブページへのコネクションをオープンするためのファイルハンドルをそこに代入する。そして、ウェブページのアドレスは、Vimウィンドウ内の現在行に記述されている内容そのものであるとして扱われる。

soup = BeautifulSoup.BeautifulSoup(handle.read())

 ファイルハンドルから読み込み、その内容でBeautifulSoupのインスタンスを生成する。

vim.current.buffer[:] = soup.prettify().split('\n')

 vim.current.bufferは、Vim上で現在作業を行っているファイル中の行を保持しているリストである。スライス記法([:])を用いることで、その内容全体を、ウェブページのHTML形式のソースで置き換えている。

EOF

 独立行にEOFとだけ記述することで、Vimに対してPythonコードの終了を指示している。

endfunction

 その後、関数定義を終了させる。

 pyextend.vimファイルを保存し、新たなウィンドウをオープンする(または、新たな分割画面をオープンするためにVimコマンドの:newを入力する)。次に、:source pyextend.vimと入力することで新たな関数をソーシングする。エラーがあった場合にはインデントをチェックしてほしい。Pythonのコードは、組み込まれた場合であってもインデントが意味を持つからである。

 この関数をテストするには、任意のウェブサイトのアドレス(http://から始めることを忘れないように)を入力した後、そのアドレスのある行にカーソルを置いた状態でコマンドモードから:call GetHTML()を入力する。これで、バッファが該当ページのソースで置き換えられるはずだ。

 例えばアドレスをhttp://www.builderau.com.au/とした場合、結果は以下のようになるはずである。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>
   By developers, for developers - Builder AU
  </title>

 VimをPythonスクリプティングを用いて拡張することによってさまざまなことが可能になる。詳細については、Vimモジュールのドキュメント(英語)に目を通してほしい。

この記事は海外CNET Networks発のニュースをシーネットネットワークスジャパン編集部が日本向けに編集したものです。海外CNET Networksの記事へ

記事に関係する情報をコメントでお寄せください

ニックネーム : CNET_IDにログインしてコメントする

コメント本文(必須) :
  • 新着記事
  • 人気記事
  • 特集
  • ブログ