(这篇文章是基于一个网友的来信和我的答复。因为对其它朋友使用keysnail有帮助,所以贴出来)
2011/8/8 xxxx <xxxx@gmail.com>:
> 在使用 Vimperator 中,可以把拓展中的命令映射到键盘快捷键上
> 比如:把 Scrapbook 的收集快捷键从 Ctrl+Shift+L 改为 S
> 不知道这点在 Keysnail 下如何实现?
> 现在 Keysnail 还没有一个完整的帮助文档
> 而且我对 JavaScript 也不熟悉
> 因此我不太懂得怎么去写自己的命令
>
> 盼百忙中得到答复,不胜感激!
>
> Yibie 上
>
你好,
我不知道你说的“把拓展中的命令映射到键盘快捷键上“具体是什么方法,我只知道vimperator本身可以通过:emenu来执行菜单项,再将:emenu命令映射到键盘就可以的。
但keysnail目前并没有vimperator里面:emenu这样的功能。这个问题我一般是这么解决的:
1. 首先查看Scrapbook的代码,看它的overlay信息:
打开 ~/.mozilla/firefox/xxxxxx.default/exteionsions/scrapbookplus@addons.mozilla.org.xpi (这是个zip文件)
查看chrome.manifest, 找到以overlay开头的行
overlay chrome://browser/content/browser.xul chrome://scrapbook/content/overlay.xul
这说明这个扩展在firefox主界面(chrome://browser/content/browser.xul) 添加了一些元素,这些元素在chrome://scrapbook/content/overlay.xul这个文件里面描述
2. 继续查看刚才xpi里面的chrome/content/scrapbook/overlay.xul,里面能看到如下描述
<menubar id="main-menubar">
<menu id="ScrapBookMenu" label="ScrapBook Plus"
datasources="rdf:null" ref="urn:scrapbook:root" flags="dont-test-empty"
insertafter="bookmarks-menu bookmarksMenu" accesskey="&sb.key.menubar;"
oncommand="sbMenuHandler.onClick(event);"
onclick="if (event.button == 1) sbMenuHandler.onClick(event);">
<menupopup onpopupshowing="sbMenuHandler.onPopupShowing(event, this);">
<menuitem id="ScrapBookMenubarItem1" key="key_ScrapBookCapture"/>
<menuitem id="ScrapBookMenubarItem2" key="key_ScrapBookCaptureAs"/>
<menuitem id="ScrapBookMenubarItem3"
key="key_BookmarkWithScrapBook" label="&sb.capture.bookmark;..."
oncommand="sbBrowserOverlay.execBookmark('ScrapBookContextPicking');
event.stopPropagation();"/>
<menuitem id="ScrapBookMenubarItem4"
label="&sb.capture.alltabs;..."
oncommand="sbMenuHandler.execCaptureAllTabs();
event.stopPropagation();"/>
<menuitem id="ScrapBookMenubarItem5" sblabel="&sb.sidebar;"
observes="viewScrapBookSidebar" key="key_openScrapBookSidebar"/>
<menuseparator />
</menupopup>
...
这说明这个扩展在Firefox主界面的菜单栏(main-menu-bar)插入了一个菜单项(ScrapBookMenu),其下第一个子菜单项目是
<menuitem id="ScrapBookMenubarItem1" key="key_ScrapBookCapture" />
这就是你说的那个快捷键为Ctrl+Shift+L的菜单(有时根据XUL文件不太容易看出来到底是哪一项对应我们所说的菜单项,就需要先在chrome/locale/zh-CN下面按菜单文字搜索一下),它的按键为key_ScrapBookCapture,在这个overlay.xul中往上找这个key的定义,找到
<key id="key_ScrapBookCapture" key="&sb.key.capture;"
modifiers="accel alt" oncommand="sbBrowserOverlay.execCapture(0, null,
false, 'urn:scrapbook:root');"/>
于是你知道这个菜单项对应的JavaScript代码是: sbBrowserOverlay.execCapture(0, null, false, 'urn:scrapbook:root');
3. 下一步就是在Keysnail的配置界面里面添加一个original command,在实现部分填入上面看到的代码,变成:
function (ev, arg) {
sbBrowserOverlay.execCapture(0, null, false, 'urn:scrapbook:root');
}
然后在界面上输入你想要的热键,就行啦
总的来说,对新手有点复杂哈,这需要了解一点XUL方面的知识,你多琢磨一下。
不过,对于这种已有快捷键(Ctrl+Shift+L)的,我一般不再添加别的键。
巴蛮子