Add commands to search through and open links from history.

#+BEGIN_SRC js
  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, $sort_order = 'date_descending'
          );
          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 a new buffer",
              "find-url-new-buffer",
              $browser_object = browser_object_history_url);

  define_key(content_buffer_normal_keymap, "H", "find-url-from-history");
  define_key(content_buffer_normal_keymap, "h", "find-url-from-history-new-buffer");

#+END_SRC

Set the hints digits to the keys on my keyboard's home row, for easy
access.

#+BEGIN_SRC js
  hint_digits = "arstdhneio";
#+END_SRC

Add the ~search-engines/~ directory to the opensearch load path.

#+BEGIN_SRC js
  function add_to_opensearch_load_path(new_path) {
      if (new_path.startsWith('/')) {
          opensearch_load_paths.push(new_path);
      } else {
          let path = get_home_directory();
          path.append('.conkerorrc');
          path.append(new_path);

          opensearch_load_paths.push(path);
      }
  }

  add_to_opensearch_load_path('search-engines');
#+END_SRC

Add the ~site-js/~ directory to the load path.

#+BEGIN_SRC js
  function add_to_load_path(new_path) {
      if (new_path.startsWith('/')) {
          load_paths.push("file://" + new_path);
      } else {
          let path = get_home_directory();
          path.append('.conkerorrc');
          path.append(new_path);

          load_paths.push("file://" + path.path);
      }
  }

  add_to_load_path('site-js');
#+END_SRC

* Scuttle

  Load the scuttle module.

  #+BEGIN_SRC js
    require('scuttle');
  #+END_SRC

  Set the URL of my scuttle installation.

  #+BEGIN_SRC js
    scuttle_url = 'https://ryuslash.org/scuttle/';
  #+END_SRC

  Add the bookmarked widget to the mode line. This requires my
  customized version of Scuttle to be able to check if a buffer has
  been bookmarked or not.

  #+BEGIN_SRC js
    add_hook('mode_line_hook', mode_line_adder(scuttle_bookmarked_widget));
  #+END_SRC

  Set-up keybindings for posting to scuttle.

  #+BEGIN_SRC js
    define_key(default_global_keymap, 'p', 'scuttle-post');
    define_key(default_global_keymap, 'P', 'scuttle-post-link');
  #+END_SRC

* Emacs integration

  Using org-protocol we can add information from the page.

  #+BEGIN_SRC js
    function org_capture(url, title, selection, window) {
        var cmd_str = 'emacsclient "org-protocol://capture://b/' + url + '/' + title + '/' + selection + '"';

        if (window !== null) {
            window.minibuffer.message('Issuing ' + cmd_str);
        }

        shell_command_blind(cmd_str);
    }

    function org_capture_command(I) {
        var url = encodeURIComponent(I.buffer.display_uri_string);
        var title = encodeURIComponent(I.buffer.document.title);
        var selection = encodeURIComponent(I.buffer.top_frame.getSelection());

        org_capture(url, title, selection, I.window);
    }

    interactive("org-capture",
                "Clip url, title and selection to capture via org-protocol",
                org_capture_command);

    define_key(content_buffer_normal_keymap, "C-c b", "org-capture");
  #+END_SRC