ayu-mushi's website

自分が使ってるw3mの設定と拡張

Published
2017-4-8
Last Modified
2017-4-8
Source of This Page(GitHub)
https://github.com/ayu-mushi/ayu-mushi.github.io/blob/develop/src/article/w3m.mdk

1. はじめに

w3mはタブが使えたり、表や画像が表示できたりする1、軽量テキストブラウザです。 w3mでは、キーによる操作を拡張するkeymapや、CGIをローカルで実行できるローカルCGIなどを使って、機能を追加・拡張することができます。 この記事では私がこれを利用して作った機能を紹介します。

2. ローカルCGI

作ったものを紹介する前ににローカルCGIについて説明します。

w3mではシェルスクリプトやPerlで書かれたCGIをローカルで実行でき、CGIのテストや、w3mに機能を追加したいときに使えます。 公式で提供されているものとして、Googleで検索できるgoogle.cgiや、w3mmail.cgiなどがあります。 CGIは、urimethodmapに短縮URLを書いておくと使いやすいです。2

ローカルCGIでシェルスクリプトを使う場合、理由は知りませんが、空白echoをはさみながらechoしないとうまく出力されません。

local CGIについて詳しくは、w3m の local CGI 機能 “w3m Tips | インサイドフラッギング” などを参照してください。

3. ページごとにメモを取る

1つ目。

あるページをフォーカスしてるときctrl-Aを押すと、タイトルとURLとを書き込んだファイルを生成し、そのファイルにメモできるようにします。 ページ毎にコメントを付けるのは記憶術的にも正解

keymapに以下を追加。ただしpath/toはw3m_commentary.pyへのパスとします。

keymap A EXEC_SHELL "python3 path/to/w3m_commentary.py"

4. ページのはてなブックマーク情報を見る

keymap に次のように設定。

keymap HA EXTERN "hateinfo %s && read YES"
#!/usr/bin/env python
# -*- coding: utf-8- -*-

import urllib2
import argparse
import json

def bukome(args):
    req = urllib2.Request('http://b.hatena.ne.jp/entry/json/' + args.uri);
    response = urllib2.urlopen(req)
    json_hate = response.read()
    parsed_hate = json.loads(json_hate)
    print "-----"
    print "count:" + str(parsed_hate["count"])
    print "comments: \n" + reduce(lambda comm0, comm1: comm0 if comm1 == "" else comm0 + "\n\n[ " + comm1 + " ]", map(lambda bkm: bkm["comment"], parsed_hate["bookmarks"]), "")

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='print bookmark comments in hatena.ne.jp')
    parser.add_argument('uri', type=str, help='the URI of the target web page')
    parser.set_defaults(func=bukome)
    args = parser.parse_args()
    args.func(args)

ページをはてなブックマークする方は、Big Sky :: w3mから「はてなブックマーク」するを参照。

5. ダウンロードしたPDFファイルの履歴

~/.w3mにある、pdf(htmlも対応)の要約と、タイトルとを抜き出して一覧。 history.cgiはローカルCGIなので、シェルスクリプトをローカルCGIとして実行できる位置に置きます。 使うときは、file:///cgi-bin/history.cgi?n=0&size=20&ext=html や file:///cgi-bin/history.cgi?n=0&size=20&ext=pdf などのURLを使います。extが探索する拡張子、sizeが一度に表示するファイル数、nが表示するファイルの順位(ls -tで上から)です。 doctitleはPDFファイルからタイトルを抽出するのに使います。 【Python】Web上にあるpdfのタイトルを取得する(中間報告) - 歩いたら休めを参考にしました。

6. カーソルが載ってる単語から英単語辞書を引く

w3mはそのときカーソルがある単語を記録しており、printenvで出力できます(日本語は無理っぽいですが)。 それを使って、英単語辞書を引くことが可能。

printenvの実行例(Githubのサイト):

W3M_CURRENT_FORM=
W3M_CHARSET=UTF-8
W3M_CURRENT_WORD=developers
W3M_FILENAME=/
W3M_TITLE=How people build software  GitHub
W3M_CURRENT_LINE=9
W3M_CURRENT_IMG=
W3M_CURRENT_LINK=
W3M_URL=https://github.com/
W3M_TYPE=text/html
W3M_SOURCEFILE=/home/ayu-mushi/.w3m/w3mtmp1991-970.gz
W3M_CURRENT_COLUMN=15

以下はkeymapの設定例です。ただし、je は英単語を渡すと辞書を引くコマンドです。CUI超お手軽英語辞書 - capriccioso String Creating(Object something){ return My.Expression(something); }を利用します。

keymap O EXEC_SHELL "je $(printenv | ag 'W3M_CURRENT_WORD' | sed -e 's/^W3M_CURRENT_WORD\=\([^<]\)/\1/')"

7. おわりに

私のkeymapは dotfiles/keymap at master · ayu-mushi/dotfiles です。


1.w3m-imgを使えば。