I've been using Vimium [1] for years now to browse the web (almost) entirely via the keyboard and couldn't live without it. It's incredibly easy to use once you become familiar with the shortcuts. You can even change the bindings to more closely match Emacs [2] if that's your editor of choice.
I also use Vimium and can't live without it, then switched to Qutebrowser which solved some issues that were always annoying me with Vimium, specifically:
1) Vimium key bindings don't work on the new tab page, and don't work until a web page finishes loading. The Qutebrowser key bindings are more first class and built in to the browser, so you can fully trust them to work all the time.
2) Qutebrowser is much better with webpages that also implement their own key bindings. There is pass-through mode which disables all Qutebrowser key bindings (except escape to leave pass-through mode) and lets the web page interpret all keystrokes.
Unfortunately I still keep the other browser around because of compatability, but I have much more hope that Qutebrowser will eventually render pages better rather than Chrome/Vimium ever getting a better interface.
Problem #1 can be fixed by making the Vimium blank page your newtab page.
Vimium comes with a blank .html file; IIRC it's what opens when you issue a command to open a new tab by pressing `t`.
I'm spending more time with FF 57 (it's really great for my needs) so I don't remember how you would set a URL for chrome//:newtab. I think you have to write an extension that redirects (with an inline script) to the Vimium blank page. I'm on mobile so I can't confirm that.
Unfortunately it seems that in WebExtensions, or at least Firefox and Chromium's current implementations of it, keybindings can only be captured by a plugin while a page is finished loading, and while the address bar is focused. There is also no way to do things like focus/defocus the addressbar, autohide the addressbar, autohide the tab bar, and many other small details that Qutebrowser effortlessly achieves.
Obviously a hack, and only addresses one of your points, but the following works pretty well if you wanna focus / defocus the address bar in chrome with a shortcut:
The workaround for 1) was already posted, but for 2), you can use Vimium's "insert mode" by pressing `i` to do the same thing. I use it regularly for Reddit with the enhancement suite.
Copy-pasting an answer I've given about Vimium earlier:
I've used Vimium for some months myself, and wasn't really happy with it. The reasons why mainly boil down to how Vimium is quite limited in what it can do. For example:
- It can't change the user interface at all - qutebrowser has a much more minimal UI.
- It can't spawn external processes. In qutebrowser, you can simply hit ctrl-e while editing some text input, to edit it in e.g. Vim. Or you can use :bind ,v spawn mpv {url} to add a keybinding which spawns mpv with the current page, to watch YouTube videos in a real video player.
- As soon as you are on some special page (like the Chrome extension store, or the "new tab" page), it stops working, because it can't intercept keypresses there. (yes, I've read the other answers about that now)
- In general, qutebrowser is much more configurable and extensible. You can easily integrate it with shell or Python scripts via userscripts, and soon-ish there'll be a Python plugin API as well.
I don't do ETAs for hobby work - possibly in my next summer holidays (~July 2018). I probably won't get to it before that, but I have no idea what I'll do in the holidays yet.
I couldn't figure out how to use vimium in "view source" mode and suspect that its an unsupported feature. That's rather surprising. You don't happen to know how to do this, do you?
1) Vimium key bindings don't work on the new tab page, and don't work until a web page finishes loading. The Qutebrowser key bindings are more first class and built in to the browser, so you can fully trust them to work all the time.
2) Qutebrowser is much better with webpages that also implement their own key bindings. There is pass-through mode which disables all Qutebrowser key bindings (except escape to leave pass-through mode) and lets the web page interpret all keystrokes.
Unfortunately I still keep the other browser around because of compatability, but I have much more hope that Qutebrowser will eventually render pages better rather than Chrome/Vimium ever getting a better interface.