Conkeror改变了我浏览网页的方式:它基本上是Emacs + Firefox,在.conkerrorc中使用基于javascript的配置而不是.emacs中的elisp配置.
多年来,我通过从其他人那里得到一点点零碎,建立了一个庞大的.emacs自定义库.我刚刚开始使用Conkeror,但事实上它使用JS(比Elisp广为人知)必须意味着那里有一些惊人的东西.
小心分享你的作品?我对与Django(或其他动态网页)生成的页面进行良好交互的内容特别感兴趣.
例如,我喜欢基于Conkeror的动作录制器,它允许我浏览网站并查找错误,然后立即保存并提交操作序列作为错误报告,只需一次按键.通过包含复制错误所需的JS动作,它将成为最终的测试工具 - 甚至比Selenium更好,因为它将完全由键盘驱动.
这是我的:
// homepage = "http://www.google.com"; // set default webjump read_url_handler_list = [read_url_make_default_webjump_handler("google")]; // possibly valid URL function possibly_valid_url (str) { return (/[\.\/:]/.test(str)) && !(/\S\s+\S/.test(str)) && !(/^\s*$/.test(str)); } // page modes require("page-modes/google-search-results.js"); // google search results require("page-modes/wikipedia.js"); // wikipedia mode // webjumps define_webjump("gmail", "https://mail.google.com"); // gmail inbox define_webjump("twitter", "http://twitter.com/#!/search/%s", $alternative = "https://twitter.com/"); // twitter define_webjump("w3schools", "http://www.w3schools.com"); // w3schools site define_webjump("w3search", "http://www.google.com/search?sitesearch=www.w3schools.com&as_q=%s"); // w3schools search define_webjump("jquery", "http://docs.jquery.com/Special:Search?ns0=1&search=%s"); // jquery define_webjump("archwiki", "https://wiki.archlinux.org/index.php?search=%s"); // arch wiki define_webjump("stackoverflow", "http://stackoverflow.com/search?q=%s", $alternative = "http://stackoverflow.com/"); // stackoverflow define_webjump("sor", "http://stackoverflow.com/search?q=[r]+%s", $alternative = "http://stackoverflow.com/questions/tagged/r"); // stackoverflow R section define_webjump("stats", "http://stats.stackexchange.com/search?q=%s"); // stats define_webjump("torrentz", "http://torrentz.eu/search?q=%s"); // torrentz define_webjump("avaxsearch", "http://avaxsearch.com/avaxhome_search?q=%s&a=&c=&l=&sort_by=&commit=Search"); // avaxsearch define_webjump("imdb", "http://www.imdb.com/find?s=all;q=%s"); // imdb define_webjump("duckgo", "http://duckduckgo.com/?q=%s", $alternative = "http://duckduckgo.com"); // duckduckgo define_webjump("blekko", "http://blekko.com/ws/%s", $alternative = "http://blekko.com/"); // blekko define_webjump("youtube", "http://www.youtube.com/results?search_query=%s&aq=f", $alternative = "http://www.youtube.com"); // youtube define_webjump("duckgossl", "https://duckduckgo.com/?q=%s"); // duckduckgo SSL define_webjump("downforeveryoneorjustme", "http://www.downforeveryoneorjustme.com/%s"); // downforeveryoneorjustme define_webjump("urbandictionary", "http://www.urbandictionary.com/define.php?term=%s"); // urban dictionary define_webjump("rts", "http://rts.rs"); // RTS define_webjump("facebook", "http://www.facebook.com"); // facebook homepage // tab bar require("new-tabs.js"); // clicks in new buffer require("clicks-in-new-buffer.js"); // Set to either OPEN_NEW_BUFFER(_BACKGROUND) clicks_in_new_buffer_target = OPEN_NEW_BUFFER_BACKGROUND; // Now buffers open in background. // history webjump define_browser_object_class( "history-url", null, function (I, prompt) { check_buffer (I.buffer, content_buffer); var result = yield I.buffer.window.minibuffer.read_url( $prompt = prompt, $use_webjumps = false, $use_history = true, $use_bookmarks = false); yield co_return (result); }); interactive("find-url-from-history", "Find a page from history in the current buffer", "find-url", $browser_object = browser_object_history_url); interactive("find-url-from-history-new-buffer", "Find a page from history in the current buffer", "find-url-new-buffer", $browser_object = browser_object_history_url); define_key(content_buffer_normal_keymap, "h", "find-url-from-history-new-buffer"); define_key(content_buffer_normal_keymap, "H", "find-url-from-history"); // load session module require("session.js"); session_auto_save_auto_load = true; // auto-load session // don't open download buffer automatically remove_hook("download_added_hook", open_download_buffer_automatically); // don't show clock remove_hook("mode_line_hook", mode_line_adder(clock_widget)); // add favicons require("favicon"); add_hook("mode_line_hook", mode_line_adder(buffer_icon_widget), true); read_buffer_show_icons = true; // add content handlers content_handlers.set("application/pdf", content_handler_save); // pdf // torrent // mp3 // ogg function define_switch_buffer_key (key, buf_num) { define_key(default_global_keymap, key, function (I) { switch_to_buffer(I.window, I.window.buffers.get_buffer(buf_num)); }); } for (let i = 0; i < 10; ++i) { define_switch_buffer_key(String((i+1)%10), i); } function enable_scrollbars (buffer) { buffer.top_frame.scrollbars.visible = true; } add_hook("create_buffer_late_hook", enable_scrollbars);