惟有于技术中才能明得真相

Vimperator:键盘操控Firefox

我认为,Firefox是最强悍的浏览器,而Vimperator是Firefox下最强悍的插件。为什么Vimperator很强悍呢?因为它完全改变了我浏览Web的方式,我原来以为浏览Web少不了使用鼠标。废话少说,让我们来亲身经历Vimperator的强大,当然首先得安装。怎么安装,你知道吧,这里我就不教了。似乎Vimperator的主页被墙了,实在是不明所以然了,Vimperator碍GFW什么事了,妈的,反正我无视GFW了。

安装完成后,重启Firefox,你会发现Firefox有大变脸,咦,我的菜单栏呢?我的工具栏呢?初学者发现什么也做不了了,边网页也无法打开了,吓坏了,立即把它给卸了。从这点上来说,Vimperator做得太不贴心了,怎么也得考虑初学者的感受吧。另外Vimperator的快捷键设置得也太不合理了,Ctrl+C,Ctrl+V统统用不了了,一下子让用户的习惯来个大翻转,当然会吓跑不少用户。Vimperator的主要问题在于它太在乎和Vim的一致性了,它在很多方面模拟Vim的特性,但Web浏览和文字编辑还是有很大区别的,前者主要是浏览操作,而后者主要是编辑操作。因此,熟练的Vimperator用户总是需要更改Vimperator的默认设置,这点也是模仿Vim,默认的Vim配置几乎也是不可用的。现在就来看如何用Vimperator来完成日常的浏览网页操作,在继续之前,初学者还是使用“:set go+=mT"把菜单栏和导航栏给打开,然后使用":mkv"来创建一份配置文件,在Windows下是"C:\Documents and Settings\你的用户名\_vimperatorrc",在Linux下是"~/.vimperatorrc"。

首先恢复Ctrl+C,Ctrl+V,没有它怎么能忍受,工作生活全靠它了。修改_vimperatorrc或者.vimperatorrc,添加:

" 解决复制/粘贴/全选/撤消/重做
noremap <C-q> <c-v>
noremap <C-Q> <c-z>
noremap <C-c> <C-v><C-c>
noremap <C-v> <C-v><C-v>
noremap <C-a> <C-v><C-a>
cnoremap <C-c> <C-v><C-c>
cnoremap <C-v> <C-v><C-v>
cnoremap <C-a> <C-v><C-a>
cnoremap <C-x> <C-v><C-x>
inoremap <C-c> <C-v><C-c>
inoremap <C-v> <C-v><C-v>
inoremap <C-a> <C-v><C-a>
inoremap <C-x> <C-v><C-x>
inoremap <C-z> <C-v><C-z>
inoremap <C-y> <C-v><C-y>


上面的代码恢复Ctrl+C,Ctrl+V,Ctrl+X,Ctrl+Z, Ctrl+Y原来的功能,映射很有规律,就是在原有键前面加上<C-v>(即Ctrl+V)。在Vimperator下,Ctrl+V的功能表示暂时忽略下一个按键,它就会传送给Firefox,例如<C-v><C-c>,表示Vimperator不解释<C-c>,交由Firefox来解释,也就是复制功能,而原来<C-c>的功能停止继续加载页面。由于我们现在占用了原来Ctrl-V的功能,我们需要将它映射到另外一个键,我将它映射成了Ctrl+Q,将Ctrl+Z映射成Ctrl+Shift+Q(在配置文件中写成<C-Q>),Ctrl+Z原来的功能是忽略所有接下来的按键,全部交由Firefox来解释,直到按ESC键。

浏览网页的第一步是打开网页,在Vimperator打开网页用不着导航栏,否则Vimperator也不会默认就将将导航栏给隐藏了。在正常模式下输入o,就会进入命令行模式,光标定位到底部状态中,并且显示":open ",在后面就可以输入你要打开的网址,可以按Tab键补全,按回车就可以在当前页打开网址。如果要在新标签页中打开网址,在正常模式下输入t,如果你还处在命令行模式,按ESC回到正常模式,然后再输入t,这时又会进入命令行模式,并且显示":tabopen ",输入网址,按回车会在新的标签页打开网址。"o"和"t"命令还可以用来搜索关键字,但:open或:tabopen后接的网址不含句点(.)时,它会去用Google搜索这个关键字。坦白地说,Vimperator的网址补全功能远抵不上Firefox自带的补全功能强大,在Vimperator中,一旦按tab补全,输入也完全补全了,要回到原来的输入,得不断按Backsapce,如果补全的网址特别长,那是件很痛苦的事,选择网址只能按TAB,如果匹配网址特别多,那么只能不断TAB来跳到目标网址,效率十分低下。鉴于此,我很少使用它的网址补全功能。我经常打开的网址也就那么几个,其它的一切都是Google。比如,我经常访问豆瓣,打开它,输入Mb,就将豆瓣保存名为b的QuickMark,以后要打开豆瓣只要,输入gob,要在新标签页中打开输入gnb,可以使用的名字为[a-ZA-Z0-9],一共保存42个网址,我一共也就保存了10个,输入:qmarks可以查看当前保存的所有QuickMarks。如果你在复制了一个网址在剪切板中,那么按p或P就可以在当前标签而或新标签页打开剪切板中的网址。

在历史页面中跳转很简单,只需要按逗号','(和<处于同一键上)或句点'.'(和>处于同一键上)。要跳到浏览器主页,输入gh(在当前标签页中打开)或gH(在新标签页中打开)。gu用于打开网址的上一级目录,例如假设当前处于网页"http://www.example.org/dir1/dir2/test.html",按gu会跳到"http://www.example.org/dir1/dir2/",gU会跑到网站根目录,假设当前网页是"http://www.example.org/dir1/dir2/test.html",gU会跳到“http://www.example.com/"。要刷新当前页面,按r。

接下来看如何浏览页面,像Vim中一样,可以使用j,k来向下或向上移动一行,Ctrl+D和Ctrl+U向下或向上移动半屏,Ctrl+F或Ctrl+B向下或向上移动一屏。j,k是很方便的命令,但是只能移动一行,我将重新将j映射成一次向下移动10行,k一次向上移动10行,这样就快捷多了。有时会发现j,k不好使的情况,这时通常只要输入i进入插入模式,然后再ESC重新回到正常模式就好用了。gg跳到网页开始处,G跑到网页末尾,50%跳到网页中间,类似地25%跳到网页1/4处。输入'/'可以在网页中进行搜索,按n跳到下一个匹配,N跳到上一个匹配,'?'进行反向搜索。'*'向下搜索光标处的单词,'#'向上搜索光标处的单词。

如何切换标签页是常用的操作,Vimperator有很多命令来实现这样的操作,Ctrl+PgDn, gt, Ctrl+n, :tabnext切换到下一个标签页,Ctrl+PgUp, gT, Ctrl+p, :tabprev切换到上一个标签页,这些都不很方便,我将h和l分别映射成切换到上一个标签页和下一个标签页,切换简直可以用飞速来形容。g0切换到第一个标签页,g$切换到最后一个标签页,b然后输入标签页名字可以跳到相应的标签页。Vimperator还有些一些很酷的对标签页进行操作的命令,例如:tabmove 0可以将当前标签页移到第一个标签页,:tabmove 1将当前标签页移到第二个标签页,:tabdetach把当前标签页在新窗口中打开,:tabduplicate打开和当前标签页一样的标签页,这些功能以前可能得用单独的Firefox插件来实现。

打开链接也是个常用操作,在Vimperator中输入f,就会高亮所有的链接,并且在链接旁边显示其序列号,输入部分链接名字,可以缩小匹配的链接数,如果还有多个匹配的链接,输入其数字序列号就可以在当前页面中打开链接,要在新标签页中打开链接,输入F。键入;进入扩展hint模式,详见参考文档。当我们需要搜索时,经常需要定位到表单输入框,有两种方式,一种输入gi,它会聚焦到第一个输入框或上次聚焦的输入框,前面可以加上数字,例如2gi,表示跳到第二个输入框,当页面中的输入框比较少时,这种方式非常快捷。另外一种就是使用f,刚才我们使用它来打开链接,它不仅会高亮链接,也会高亮输入框。在搜索到页面结果时,经常需要翻页,这时可以输入]]来跳到下一页,[[跳到上一页,上一页或下一页的模式由nextpattern或previouspattern来指定。


觉得写得比较乱,不写了,还不如看Vimperator帮助文档来得清晰,输入:help就可以打开Vimperator的帮助文档。最后附上我的Vimperator的配置文件,加了点注释,希望对大家有点帮助。

" 只显示右边和底部的滚动条,新手可以加上mT显示菜单栏和导航栏
set go=rb

" 设置标题栏显示的字符串,默认为Vimperator,不让别人知道我在使用Vimperator,嘿嘿
set titlestring="Mozilla Firefox"

" 下面一些设置借鉴了:http://pchu.blogbus.com/tag/vimperator/
" j 一次往下移动10行
noremap j 10j
" k 一次往上移动10行
noremap k 10k
" Shift+J 一次往下移动半屏,要比Ctrl+D来得方便一些
noremap J <C-d>
" Shift+K 一次往上移动半屏,要比Ctrl+U来得方便一些
noremap K <C-u>
" 使用h切换到上一个标签页
noremap h gT
" 使用l切换到下一个标签页
noremap l gt
" 将H,L映射到原来h,l的功能,即滚动条向左或右移动
noremap H h
noremap L l
" < 或 > 在历史记录中跳转
noremap , <C-o>
noremap . <C-i>

" 还原 ctrl+K 跳到搜索栏的快捷键
noremap <C-k> <C-v><A-d><Tab>
imap <C-k> <Esc><C-k>
" 还原 ctrl+L 跳到地址栏的快捷键
noremap <C-l> <C-v><C-l>

" 解决复制/粘贴/全选/撤消/重做
noremap <C-q> <c-v>
noremap <C-Q> <c-z>
noremap <C-c> <C-v><C-c>
noremap <C-v> <C-v><C-v>
noremap <C-a> <C-v><C-a>
cnoremap <C-c> <C-v><C-c>
cnoremap <C-v> <C-v><C-v>
cnoremap <C-a> <C-v><C-a>
cnoremap <C-x> <C-v><C-x>
inoremap <C-c> <C-v><C-c>
inoremap <C-v> <C-v><C-v>
inoremap <C-a> <C-v><C-a>
inoremap <C-x> <C-v><C-x>
inoremap <C-z> <C-v><C-z>
inoremap <C-y> <C-v><C-y>

" 启用下面的语句可以在gmail和Google Reader中使用它们自己的快捷键,但发现这样做之后,我就不能使用h,l来飞速地切换页面了,
" 因为每次到gmail处就会卡住(我总是会打开gmail页面)
" :autocmd LocationChange .* js modes.passAllKeys = /www\.google\.com\/reader|mail\.google\.com\/mail/.test(buffer.URL)

" set 上一页,下一页模式,这样可以使用]],[[来快速翻页
set nextpattern=\s*下一页|下一张|下一篇|下一頁|下页|后页\s*,^\\bnext\\b,\\bnext\\b,^>$,^(>>|››|»)$,^(>|»),(>|»)$,\\bmore\\b
set previouspattern=\s*上一页|上一张|上一篇|上一頁|上页|前页\s*,^\\bprev|previous\\b,\\bprev|previous\\b,^<$,^(<<|‹‹|«)$,^(<|«),(<|«)$


" 用来切换工具栏,通常我会隐藏所有的工具栏,但有时又得临时用上一下
:js << EOF
    toggle_element = function (name) {
        document.getElementById(name).collapsed ^= 1;
    }
EOF

" 使用\m来切换菜单栏的显示
map <Leader>m :js toggle_element('toolbar-menubar')<CR>
" 使用\g切换Google工具栏的显示,没有装Google工具栏将此行注释掉
map <Leader>g :js toggle_element('gtbToolbar')<CR>
" 使用\n切换导航工具栏的显示,也可以使用set go+=T来打开导航栏,但总不如\n来得方便吧
map <Leader>n :js toggle_element('nav-bar')<CR>
" 使用\b切换书签工具栏的显示
map <Leader>b :js toggle_element('PersonalToolbar')<CR>

" 下面的代码用来切换标题栏,就像在Google Chrome一样,这样可以得到最大的空间
" 但是并不完善,去掉标题栏之后就不能改变窗口大小了
:js << EOF
    function toggleTitleBar() {
    // 参考这里:http://www.my219.cn/archives/47886
        window.resizeTo(0,0);
        var mWindow = document.getElementById('main-window');
        if (mWindow.getAttribute('hidechrome') == 'true') {
            mWindow.setAttribute('hidechrome','false');
        } else {
            mWindow.setAttribute('hidechrome','true');
        }
        window.moveTo(screen.availLeft,screen.availTop);
        window.resizeTo(screen.availWidth,screen.availHeight);
    }
    " 默认去掉标题栏,不想去掉的将下面的一行注释掉
    toggleTitleBar();
EOF
" 使用\t来切换标题栏的显示
map <Leader>t :js toggleTitleBar()<CR>

" 用F2添加Delicious书签,没有安装Delicious插件的将下面两行注释掉
noremap <F2> <C-v><C-d>
inoremap <F2> <Esc><C-v><C-d>

2 评论:

  Francis

2009年12月30日 07:45

啊哈,Vimperator用起来真的很爽,有Vim的感觉了。

不过有个问题,在论坛或者其他地方发贴的时候,表单焦点跳跃方面有什么好的方法么?

谢谢。

  Unknown

2010年7月18日 15:44

博主,我在vimperator下想添加一个最小化窗口的快捷键,这个该怎么做啊?请指教啊……