以前一直用firefox的一个叫做proxyselect的插件切换代理服务器,马马虎虎倒也能用。 不过往往是先点一次启用代理,Google搜索了之后,马上又禁用,因为国内的网址绕道去 美国再连回来还是慢。终于今天不想再忍了,于是找到了这个vimperator的插件

装上这个插件之后,vimperator就多了个:proxy的命令,接下来在.vimperatorrc里加上这么几句:

let mapleader=','
map <leader>p :proxy manual<CR>:echo "PROXY ON"<CR>
map <leader>d :proxy direct<CR>:echo "PROXY OFF"<CR>

这样就可以用,p,d切换代理服务器了。

上文提到的这个插件不算新,好多年了的样子。同样的,在vimperator的github plugin repo里,还 有几个类似的,不过都是日本人写的,文档稍差。

嫌这样还麻烦?好吧,又多RTFM和Google了一下:

javascript <<EOF
    function proxy_toggle() {
        if ( options.getPref("network.proxy.type") == 0 ) {      // direct connect?
            liberator.execute('proxy manual');
            liberator.echo("PROXY ON");
        } else {
            liberator.execute("proxy direct");
            liberator.echo("PROXY OFF");
        }
    }
EOF

map <leader>p :javascript proxy_toggle()<CR>

如果是用Pentadactyl的,或许上面的liberator要改成dactyl才能用。

这样就只用,p就可以在开关代理之间切换了。

那么,现在问题是,如果不输入下,p,我都不知道有没有开代理了。既然折腾了这么半 天,也不在乎多折腾那么一点,对不?以下是最终版:

javascript <<EOJS
    e = document.createElement('label');
    e.id = 'liberator-status-proxy';
    e.style.fontWeight = 'bold'
    document.getElementById('liberator-status').appendChild(e);

    statusline.addField("proxy", "Proxy status", "liberator-status-proxy",
        function (node, state) { node.value = state ? " 🌐 " : " 🌏 " ; })

    function update_proxy_status() {
        state = ( options.getPref("network.proxy.type") == 0 );
        statusline.updateField('proxy', state);
    }

    function proxy_toggle() {
        if ( options.getPref("network.proxy.type") == 0 ) {      // direct connect?
            liberator.execute('proxy manual');
            liberator.echo("PROXY ON");
        }else {
            liberator.execute("proxy direct");
            liberator.echo("PROXY OFF");
        }
        update_proxy_status();
    }
EOJS

set status="input,location,bookmark,history,tabcount,position,proxy"

map <leader>p :javascript proxy_toggle()<CR>

效果如图。如果发现emoji显示不正常,也可以把上面代码的emoji改成汉字什么的。

status line with proxy icon