A cursor goto hydra for emacs
Posted September 28, 2015 at 04:38 PM | categories: hydra, emacs | tags:
In the spirit of upping my navigation game, here we examine navigation by search like methods. You probably know about C-s with will search forward for a word, and C-r which will search backwards. This will get you to the start of a word pretty easily. It won't get you into a word though, you have to navigate to that, and it isn't too handy to get to a line, or window, or headline in an org-file. Each of these is an emacs command, which as with navigation I don't always remember. Today, we build a hydra to make this easy too.
We will use features from avy , and helm , and some standard emacs features. avy
is pretty neat. It provides an interface to jump to characters, words and subwords by pressing keys. To jump to a character that is visible on the screen, you invoke avy-goto-char and press the character you want to jump to. avy
will overlay a sequence of keys you then type to jump to that character. It might be more convenient to jump to a pair of characters, which you do by invoking avy-goto-char-2. Similarly, there are commands to jump to the beginning of a word, and a subword, both with variations that allow you to specify the beginning letter of the word, or to get overlays on every word.
I spend most of my days in org-files, so I frequently want to jump to an org headline in the current buffer, or some headline in an org-file in my agenda. Helm provides a nice set of functions for this in helm-org-headlines and helm-org-agenda-files-headings. We can also use helm-multi-swoop-org to use the swoop search function in all open org-buffers with helm selection. Within a buffer, you might also use the search forward and backward capabilities, or the more advanced helm-occur or swiper-helm features. Finally, I may want my cursor to go to another recent file, or open buffer.
The hydra we will develop here puts all of these commands a few keystrokes away, with a hint system to remind you what is possible. In addition to these "goto" commands, I add a character to switch to the navigation hydra we developed in the last post so I can switch to navigation if I change my mind. I also put two commands to store the current position before the goto command, and to return to that stored position conveniently. I bind this hydra to super-g, because the super key isn't used much on my Mac, and g reminds of "goto". So, here is my hydra code:
(defhydra goto (:color blue :hint nil) " Goto: ^Char^ ^Word^ ^org^ ^search^ ^^^^^^^^--------------------------------------------------------------------------- _c_: 2 chars _w_: word by char _h_: headline in buffer _o_: helm-occur _C_: char _W_: some word _a_: heading in agenda _p_: helm-swiper _L_: char in line _s_: subword by char _q_: swoop org buffers _f_: search forward ^ ^ _S_: some subword ^ ^ _b_: search backward ----------------------------------------------------------------------------------- _B_: helm-buffers _l_: avy-goto-line _m_: helm-mini _i_: ace-window _R_: helm-recentf _n_: Navigate _._: mark position _/_: jump to mark " ("c" avy-goto-char-2) ("C" avy-goto-char) ("L" avy-goto-char-in-line) ("w" avy-goto-word-1) ;; jump to beginning of some word ("W" avy-goto-word-0) ;; jump to subword starting with a char ("s" avy-goto-subword-1) ;; jump to some subword ("S" avy-goto-subword-0) ("l" avy-goto-line) ("i" ace-window) ("h" helm-org-headlines) ("a" helm-org-agenda-files-headings) ("q" helm-multi-swoop-org) ("o" helm-occur) ("p" swiper-helm) ("f" isearch-forward) ("b" isearch-backward) ("." org-mark-ring-push :color red) ("/" org-mark-ring-goto :color blue) ("B" helm-buffers-list) ("m" helm-mini) ("R" helm-recentf) ("n" hydra-navigate/body)) (global-set-key (kbd "s-g") 'goto/body)
As with the last navigation hydra, this is a pretty massive set of options and takes up some decent screen space at the bottom om my emacs. They are mostly here to remind me that there are better navigation options, and with practice I suspect muscle memory will provide fast navigation tools with more precision and fewer keystrokes than simple navigation.
Copyright (C) 2015 by John Kitchin. See the License for information about copying.
Org-mode version = 8.2.10