// vim:ft=javascript require("theme.js"); theme_load_paths.unshift("~/.conkeror/"); theme_unload("default"); theme_load("theme"); require("session.js"); session_auto_save_auto_load = true; require("favicon.js"); require("new-tabs.js"); tab_bar_show_icon = true; tab_bar_show_index = false; require("clicks-in-new-buffer.js"); require("opensearch.js"); define_opensearch_webjump("?", "duckduckgo.xml"); define_opensearch_webjump("?g", "google.xml"); define_opensearch_webjump("?w", "wikipedia.xml"); define_opensearch_webjump("?e", "eBay.xml"); external_content_handlers.set("application/pdf", "llpp"); external_content_handlers.set("video/*", "vlc"); editor_shell_command = "urxvt -e vim"; url_completion_use_history = true; url_remoting_fn = load_url_in_new_buffer; download_buffer_automatic_open_target = OPEN_NEW_BUFFER_BACKGROUND; require("adblockplus.js"); // Set zoom to 90% session_pref("layout.css.devPixelsPerPx", "0.9"); // Just key-kill all websites. I can use quote mode (ctrl+q) require("key-kill"); key_kill_mode.test.push(/\/\/.*\//); //regexp matches all sites view_source_use_external_editor = true; // Set cwd to ~/downloads so that downloads are saved there cwd = get_home_directory(); cwd.append("downloads"); ///////////////////////////////////////////////////////////////////////////////// // reopening closed buffers define_key(default_global_keymap, "A-W", "revive-buffer"); // Save origin kill_buffer command var kill_buffer_original = kill_buffer_original || kill_buffer; var killed_buffer_urls = []; var killed_buffer_histories = []; // remember_killed_buffer kill_buffer = function (buffer, force) { var hist = buffer.web_navigation.sessionHistory; if (buffer.display_uri_string && hist) { killed_buffer_histories.push(hist); killed_buffer_urls.push(buffer.display_uri_string); } kill_buffer_original(buffer,force); }; interactive("revive-buffer", "Loads url from a previously killed buffer", function restore_killed_buffer (I) { if (killed_buffer_urls.length !== 0) { var url = yield I.minibuffer.read( $prompt = "Restore killed url:", $completer = new all_word_completer($completions = killed_buffer_urls), $default_completion = killed_buffer_urls[killed_buffer_urls.length - 1], $auto_complete = "url", $auto_complete_initial = true, $auto_complete_delay = 0, $require_match = true); var window = I.window; var creator = buffer_creator(content_buffer); var idx = killed_buffer_urls.indexOf(url); // Create the buffer var buf = creator(window, null); // Recover the history buf.web_navigation.sessionHistory = killed_buffer_histories[idx]; // This line may seem redundant, but it's necessary. var original_index = buf.web_navigation.sessionHistory.index; buf.web_navigation.gotoIndex(original_index); // Focus the new tab window.buffers.current = buf; // Remove revived from cemitery killed_buffer_urls.splice(idx,1); killed_buffer_histories.splice(idx,1); } else { I.window.minibuffer.message("No killed buffer urls"); } }); ///////////////////////////////////////////////////////////////////////////////// // pass password management define_key(default_global_keymap, "C-j", "pass-get-name"); define_key(default_global_keymap, "C-J", "pass-get-password"); // Extract first and second domain by this hack function get_domain(I) { var domain = I.buffer.document.location.href; var tmp_a = I.buffer.document.createElement('a'); tmp_a.href = domain; domain = tmp_a.hostname.match(/[^.]+\.[^.]+$/); yield co_return(domain); } function shell(cmd, input) { var res = { stdout: "", stderr: "", result: 0 }; res.result = yield shell_command(cmd, $fds = [{ output: async_binary_string_writer(input) }, { input: async_binary_reader(function (s) res.stdout+=s||"") }, { input: async_binary_reader(function (s) res.stderr+=s||"") } ] ); yield co_return(res); }; var pass_domain = ""; var pass_account = ""; function pass_chose_account(I) { pass_domain = yield get_domain(I); var res = yield shell("cd ~/.password-store && find -path '*" + pass_domain + "*' -type f", ""); var accs = res.stdout.split('\n'); if (accs.length == 0 || accs.length == 1) { I.window.minibuffer.message("pass: No accounts detected for domain: " + pass_domain); pass_account = ""; return; // Note that accs has empty line at end so all this is bumped by one } else if (accs.length == 2) { pass_account = accs[0].replace(/\.\//, '').replace(/\.gpg$/, ''); } else { var accs_list = []; for (i = 0; i < accs.length - 1; i++) { accs_list.push(accs[i].replace(/\.\//, '').replace(/\.gpg$/, '')); } pass_account = yield I.minibuffer.read( $prompt = "Chose account for " + pass_domain + ":", $completer = new all_word_completer($completions = accs_list), $default_completion = accs_list[accs_list.length - 1], $auto_complete = "url", $auto_complete_initial = true, $auto_complete_delay = 0, $require_match = true); } } function pass_get_password(I) { var domain = yield get_domain(I); if (pass_account == "" || String(pass_domain) != String(domain)) { yield pass_chose_account(I); } if (pass_account != "" && I.buffer.focused_element) { var res = yield shell("pass " + pass_account, ""); dumpln(res.stdout); I.buffer.focused_element.value = res.stdout; I.window.minibuffer.message("pass: Inserted password for account: " + pass_account); pass_account = ""; // remove selected account so we can select new one } }; function pass_get_name(I) { yield pass_chose_account(I); I.window.minibuffer.message("pass: Chosen account: " + pass_account); if (I.buffer.focused_element){ var regexp = /[^\/]*$/; I.buffer.focused_element.value = regexp.exec(pass_account)[0]; } }; interactive("pass-get-name", "Choses account for to be loged as. As result name of account is outputed.", pass_get_name); interactive("pass-get-password", "Receives password from pass for currently selected account.", pass_get_password); ///////////////////////////////////////////////////////////////////////////////// // Local SOCKS5 proxy var proxy_session_enabled = false; interactive("proxy-session-toggle", "Toggle the SOCKS proxy server", function (I) { if (proxy_session_enabled) { session_pref('network.proxy.type', 0); //direct connection I.window.minibuffer.message("SOCKS5 proxy is now disabled."); proxy_session_enabled = false; } else { session_pref('network.proxy.socks', '127.0.0.1'); session_pref('network.proxy.socks_port', 8123); session_pref('network.proxy.type', 1); I.window.minibuffer.message("SOCKS5 proxy 127.0.0.1:8123 is now enabled."); proxy_session_enabled = true; } }); /////////////////////////////////////////////////////////////////////////////////