Chinaunix首页 | 论坛 | 博客
  • 博客访问: 404682
  • 博文数量: 128
  • 博客积分: 2247
  • 博客等级: 大尉
  • 技术积分: 767
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 09:30
文章分类

全部博文(128)

文章存档

2011年(4)

2010年(124)

我的朋友

分类:

2010-06-25 12:49:53

也许当你看到我这个标题的时候, 你就会感到惊讶, 在Emacs里面能浏览网页? 对, 在Emacs里面确实能浏览网页. 你应该是第一次见到能浏览网页的IDE吧, 其他的IDE顶多是能浏览一些带超链接的帮助. 有必要在Emacs里面浏览网页吗? 有那么多的浏览器, 为什么要在Emacs里面浏览网页? 对啊, 为什么啊?

当你在浏览网页的时候, 你是否想过只按几个字母就可以上下滚动网页, 上下翻屏, 前进后退? 现在的浏览器都是多标签页浏览, 你是否想过能用更方便的方式来切换这些标签页, 而不是那么难按的Ctrl+Tab? 当你在网页文本框里面输入文字的时候, 你是否想过是否可以使用自己熟悉的编辑器方式来编辑这些文本呢?

上述功能, w3m都可以完成.

现在你很想见见w3m了吧? 下面就是它:

在w3m里面浏览google

在 w3m里面浏览百度

在w3m里面浏览EmacsWiki

在w3m浏览我的博客

在 w3m浏览我的博客

用w3m在google里搜索刘德华

用w3m在google图片搜索中搜索陈好

下面我来讲讲w3m的使用.

使用M-M打开w3m,它会提示你输入一个url,不输入的话默认为主页(这样设置(setq w3m-home-page “”)), 或者用C-x M-B打开标签页,再或者使用w3m-browse-current-buffer命令直接调用w3m来浏览当前buffer,w3m-browse- current-buffer会单独开一个w3m的buffer来浏览当前buffer内容,而w3m-buffer直接在当前buffer浏览,下面是 用w3m直接浏览这篇文章的html:

使用w3m浏览当前buffer

使用w3m浏览当前buffer

注意:下面所说的按键如无特殊说明,均是在w3m中有效。

浏览页面

正如vim中那样, h, j, k, l上下左右移动光标, J, K快速上下移动光标, u向上滚半屏, 空格键向下翻一屏, n或tab移到光标到下一个链接, p或Shift+tab移动光标到上一个链接, w移动光标到下一个表单, b移动个光标到上一个表单. 按f,w3m会把它的每一个链接加一个编号,你输入编号就可以到达这个链接,非常之方便,效果如下:

w3m 的链接编号


上图中灰色的数字编号就是链接的数字编号。默认的w3m链接编号有个小问题,就是不显示form的编号,不知道它为啥不显示,我改了一下,使得可以显示 form的编号,因为显示编号实际上是用函数w3m-link-numbering来实现的,它的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun w3m-link-numbering (&rest args)
"Make overlays that display link numbers."
(when w3m-link-numbering-mode
(save-excursion
(goto-char (point-min))
(let ((i 0)
overlay num)
(catch 'already-numbered
(while (w3m-goto-next-anchor)
;; 这里判断是否是一个锚链接
(when (w3m-anchor)
(when (get-char-property (point) 'w3m-link-numbering-overlay)
(throw 'already-numbered nil))
(setq overlay (make-overlay (point) (1+ (point)))
num (format "[%d]" (incf i)))
(w3m-static-if (featurep 'xemacs)
(progn
(overlay-put overlay 'before-string num)
(set-glyph-face (extent-begin-glyph overlay)
'w3m-link-numbering))
(w3m-add-face-property 0 (length num) 'w3m-link-numbering num)
(overlay-put overlay 'before-string num)
(overlay-put overlay 'evaporate t))
(overlay-put overlay 'w3m-link-numbering-overlay i))))))))

上面代码中用了“(when (w3m-anchor)”判断是否有锚链接,form显然没有,所以把这条语句去掉就可以了。
接着前面,还可以使用goto-line直接定位光标到指定行(最好打开行号显示,方便你查看行号)。上述命令以及Emacs本身的光标移动命令使得可以 快速移动光标和定位链接.

图片显示

(setq w3m-default-display-inline-images t)

设置默认显示图片, t或者用鼠标单击图片或者图片url控制是否显示光标处的图片, T控制是否显示所有图片

导航

F或C-;前进, B或C-h后退; S列出历史页面, M-s显示曾经打开的会话和当前的会话; 回车或者单击鼠标在当前标签页中打开光标处的链接, m在新标签页中打开光标处的链接, g在新标签页中打开用户所输入的url, G在当前标签页中打开用户所输入的url, s启用自定义的搜索引擎来搜索, P显示当前标签页url, c拷贝当前标签页url, U拷贝并显示光标所在处的链接的url, d下载光标处的链接, M-d下载用户输入的url, r重新加载当前页, 相当于一般浏览器的强制刷新(Ctrl+F5).

切换标签页

M-n切换到下一个标签页, M-p切换到上一个标签页, C-k关闭当前标签页, C-c 1关闭其他的标签页, 只留下当前标签页, 1或C-x 1最大化当前标签页, 还可以使用Emacs自己的ido来方便的切换标签页. M-n可以复制当前标签页. C-x C-s可以保存当前标签页, C-x C-w可以在保存当前标签页的同时,直接改变当前mode为你所输入的文件名对应的mode,不再是w3m-mode了.

书签

a把当前页面加到书签里面去, M-a把光标处的url加入书签, v新开一个标签页来显示所有的书签, 打开书签后, M-e可以直接打开书签文件进行编辑, M-k可以删除一个书签, C-_可以undo刚才删掉的标签.
下面这个是书签的截图:

w3m 的书签

工具栏

一般的浏览器都有个工具栏,w3m当然也有。w3m-use-toolbar这个选项控制是否显示工具栏,如果你不想要显示工具栏的话把它设为 nil就可以了。但是如果你想要显示工具栏的话,并不需要手动去设置这个变量,为什么呢?因为emacs-w3m已经自动帮你设置好了,代码如下:


1
2
3
4
5
6
7
8
9
10
(defcustom w3m-use-toolbar
(and (featurep 'tool-bar)
;; Emacs 22 and greater return t for `(featurep 'tool-bar)'
;; even if being launched with the -nw option.
(display-images-p)
(or (featurep 'gtk)
(image-type-available-p 'xpm)))
"Non-nil activates toolbar of w3m."
:group 'w3m
:type 'boolean)

如果你有tool-bar这个包,而且能显示图片,它就会自动帮你设为t的。
那是不是现在你就能看到工具栏呢?抱歉,不能,因为工具栏显示的话会用到图片,而这个图片emacs-w3m从哪里找呢?这就需要你指定了,通过w3m- icon-directory指定,指定好它了以后,打开w3m的时候,就会看到一个工具栏了(当然,首先你的工具栏得打开,C-u 1 M-x tool-bar-mode),效果如下:

w3m 的工具栏

其他

M-k显示cookie, 打开cookie页面, 你还可以编辑cookie.
当要在form中输入数据的时候,把光标移到form上,按回车键或m,如果当前form框很小(比如搜索引擎的输入框),w3m会让你在 minibuffer中输入数据,如果很大的话(比如编辑wiki的时候很大的文本框),w3m则会新开一个buffer让你输入,方便之极,在那个新开 的buffer里面,按C-c C-q取消输入,C-c C-c则确认输入。
switch-to-w3m命令可以切换到w3m的buffer。
w3m-weather可以显示天气预报,不过显示的都是作者家(日本)的那天气预报,如果有人对天气预报感兴趣的话,可以使用,这是水木上的写的一个elisp包。

以上我所说的命令已经让你能够快速浏览网页了, w3m的功能特别强大, 等待你的挖掘, w3m的elisp代码有2万5千多行, elisp可不像c代码, 不需要多少行代码就可以实现非常强大的功能, w3m的代码就有那么多, 从此也可见它的功能之强大.

w3m的不足

任何软件都有不足, 包括Emacs, w3m更是如此, 其实它的缺点还挺大的, 它不能识别css, …, 也许你现在觉得它也太弱了吧, 连css都识别不了, 不要这样鄙视它, 它毕竟是一个文本浏览器, 但是它能看图片, 这个从上面的截图你也能看出来. 既然w3m有这么大的缺点, 我为什么还要向大家介绍w3m呢? 原因是它既然是个文本浏览器, 浏览速度当然就很快了, 看一些文字居多的网页还是比较不错的, 小说之类的网页啊, w3m都是个不错的选择, 我现在经常用它来浏览EmacsWiki.

有什么改进的软件吗?

起初是一个firefox的插件, 使得能在firefox下模拟Emacs的快捷键, 随着后来的发展, 它独立成为一个软件了, 它的操作方式完全类似Emacs, 而且它的命令也是自文档的, 不过它的配置文件是JavaScript写的, 对JavaScript比较熟悉的同志是件好事. 目前firefox的插件它也基本都能兼容, 不能兼容的稍微修改一下也能兼容. 那么它是完美的吗? 当然也不是, 由于它是独立于Emacs之外的, 好多对Emacs的定制就不能用于它了, 比如我写了一个非常好用的浏览buffer的包, conkeror便不能用了, 正因为它是独立于Emacs之外, 它的标签页浏览都不是很方便. 不过它有一个非常好用的功能, 就是可以显示每个链接的编号, 然后用户可以输入链接编号快速打开某个链接.

我的w3m配置文件在,配置如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
;; -*- Emacs-Lisp -*-
 
;; Time-stamp: <2010-02-23 13:52:32 Tuesday by ahei>
 
(require 'w3m)
(require 'w3m-lnum)
(require 'util)
 
(defvar w3m-buffer-name-prefix "*w3m" "Name prefix of w3m buffer")
(defvar w3m-buffer-name (concat w3m-buffer-name-prefix "*") "Name of w3m buffer")
(defvar w3m-bookmark-buffer-name (concat w3m-buffer-name-prefix "-bookmark*") "Name of w3m buffer")
(defvar w3m-dir (concat my-emacs-lisps-path "emacs-w3m/") "Dir of w3m.")
 
(setq w3m-command-arguments '("-cookie" "-F"))
(setq w3m-use-cookies t)
(setq w3m-icon-directory (concat w3m-dir "icons"))
(setq w3m-use-mule-ucs t)
(setq w3m-home-page "")
(setq w3m-default-display-inline-images t)
 
(defun w3m-settings ()
(make-local-variable 'hl-line-face)
(setq hl-line-face 'hl-line-nonunderline-face)
(setq hl-line-overlay nil)
(color-theme-adjust-hl-line-face))
 
(add-hook 'w3m-mode-hook 'w3m-settings)
 
(defun w3m-save-current-buffer ()
"Save current w3m buffer."
(interactive)
(save-excursion
(mark-whole-buffer)
(call-interactively 'copy-region-as-kill-nomark))
(with-temp-buffer
(call-interactively 'yank)
(call-interactively 'write-file)))
 
(defun w3m-print-current-url ()
"Display current url."
(interactive)
(w3m-message "%s" (w3m-url-readable-string w3m-current-url)))
 
(defun w3m-copy-current-url ()
"Display the current url in the echo area and put it into `kill-ring'."
(interactive)
(when w3m-current-url
(let ((deactivate-mark nil))
(kill-new w3m-current-url)
(w3m-print-current-url))))
 
(defun view-w3m-bookmark ()
"View w3m bokmark."
(interactive)
(let ((buffer (get-buffer w3m-bookmark-buffer-name)))
(if buffer
(switch-to-buffer buffer)
(with-current-buffer (get-buffer-create w3m-bookmark-buffer-name)
(w3m-mode)
(w3m-bookmark-view)))))
 
(defun switch-to-w3m ()
"Switch to *w3m* buffer."
(interactive)
(let ((buffer (get-buffer w3m-buffer-name)))
(if buffer
(switch-to-buffer buffer)
(message "Could not found w3m buffer."))))
 
(defun w3m-browse-current-buffer ()
"Use w3m browser current buffer."
(interactive)
(w3m-browse-buffer))
 
(defun w3m-browse-buffer (&optional buffer)
"Use w3m browser buffer BUFFER."
(interactive "bBuffer to browse use w3m: ")
(unless buffer (setq buffer (current-buffer)))
(let* ((file (buffer-file-name buffer))
(name (buffer-name buffer)))
(if file
(w3m-goto-url-new-session file)
(with-current-buffer buffer
(save-excursion
(mark-whole-buffer)
(call-interactively 'copy-region-as-kill-nomark)))
(let* ((new-name
(concat
w3m-buffer-name-prefix
"-"
(if (string= "*" (substring name 0 1))
(substring name 1)
(concat name "*"))))
(new-buffer (get-buffer-create new-name)))
(switch-to-buffer new-buffer)
(call-interactively 'yank)
(w3m-buffer)
(w3m-mode)
(setq w3m-current-title (buffer-name))))))
 
;; fix small bug about of `w3m-auto-show'
;; see my-blog/emacs/w3m-auto-show-bug.htm
(defun w3m-auto-show ()
"Scroll horizontally so that the point is visible."
(when (and truncate-lines
w3m-auto-show
(not w3m-horizontal-scroll-done)
(not (and (eq last-command this-command)
(or (eq (point) (point-min))
(eq (point) (point-max)))))
(or (memq this-command '(beginning-of-buffer end-of-buffer))
(string-match "\\`i?search-"
(if (symbolp this-command) (symbol-name this-command) ""))
(and (markerp (nth 1 w3m-current-position))
(markerp (nth 2 w3m-current-position))
(>= (point)
(marker-position (nth 1 w3m-current-position)))
(<= (point)
(marker-position (nth 2 w3m-current-position))))))
(w3m-horizontal-on-screen))
(setq w3m-horizontal-scroll-done nil))
 
(defun w3m-link-numbering (&rest args)
"Make overlays that display link numbers."
(when w3m-link-numbering-mode
(save-excursion
(goto-char (point-min))
(let ((i 0)
overlay num)
(catch 'already-numbered
(while (w3m-goto-next-anchor)
(when (get-char-property (point) 'w3m-link-numbering-overlay)
(throw 'already-numbered nil))
(setq overlay (make-overlay (point) (1+ (point)))
num (format "[%d]" (incf i)))
(w3m-static-if (featurep 'xemacs)
(progn
(overlay-put overlay 'before-string num)
(set-glyph-face (extent-begin-glyph overlay)
'w3m-link-numbering))
(w3m-add-face-property 0 (length num) 'w3m-link-numbering num)
(overlay-put overlay 'before-string num)
(overlay-put overlay 'evaporate t))
(overlay-put overlay 'w3m-link-numbering-overlay i)))))))
 
(apply-define-key
global-map
`(("M-M" w3m-goto-url-new-session)
("C-x M-B" view-w3m-bookmark)
("C-x M-m" switch-to-w3m)))
 
(apply-define-key
w3m-mode-map
`(("" w3m-previous-anchor)
("n" w3m-next-anchor)
("p" w3m-previous-anchor)
("w" w3m-next-form)
("b" w3m-previous-form)
("f" w3m-go-to-linknum)
("M-n" w3m-next-buffer)
("M-p" w3m-previous-buffer)
("C-k" kill-this-buffer)
("C-k" w3m-delete-buffer)
("C-c 1" w3m-delete-other-buffers)
("1" delete-other-windows)
("C-x C-s" w3m-save-current-buffer-sb)
("P" w3m-print-current-url)
("U" w3m-print-this-url)
("c" w3m-copy-current-url)
("g" w3m-goto-url-new-session)
("G" w3m-goto-url)
("d" w3m-download-this-url-sb)
("M-d" w3m-download-sb)
("s" w3m-search)
("S" w3m-history)
("u" View-scroll-page-backward)
("J" roll-down)
("K" roll-up)
("o" other-window)
("m" w3m-view-this-url-new-session)
("C-h" w3m-view-previous-page)
("F" w3m-view-next-page)
("C-;" w3m-view-next-page)
("r" w3m-reload-this-page)
("v" w3m-bookmark-view-new-session)
("M-e" w3m-bookmark-edit)
("'" switch-to-other-buffer)))
VN:F [1.9.0_1079]
阅读(3142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~