If you ever need to show the keybinding for a particular command to
the users of your package (e.g. you’re adding some tips
functionality), you should avoid resisting the urge to write something like
(message "Press <C-c p p> to switch between projects.")
Why is this a bad idea? Because you might change the keybinding of the
command in question (e.g.
projectile-switch-project, but you might
forget to update messages like this. Is there a better way?
substitute-command-keys to the rescue:
(message (substitute-command-keys "Press <\\[projectile-switch-project]> to switch between projects"))
This will produce exactly the same message as before and you’re
guaranteed the keybinding will always be in sync with the command.
P.S. If you want to check interactively the keybinding of some command use
C-h f (
an example -
C-h f RET projectile-switch-project RET will produce this:
projectile-switch-project is an interactive compiled Lisp function.
It is bound to C-c p p, s-p p, <menu-bar> <tools> <Projectile> <Switch
(projectile-switch-project &optional ARG1)
You can also check which command is bound to some key with
By default in Emacs the
Tab key does only indentation. If some major
mode provides completion of some form, you normally have to trigger it
M-Tab. In most window managers, however, this keybinding is used to
switch between open windows, which makes it a bit hard to use out of the box.
There’s a simple trick to augment the default
Tab behavior. Just put
this in your Emacs config:
(setq tab-always-indent 'complete)
Now, when you press
Tab one time it will indent and if you press it
again you’ll get completion candidates. If the indentation at point is
already correct you’ll get the completion candidates right away. As an
added bonus - you don’t really need
Simple and neat! One really has to wonder why this isn’t the default
For the longest time Prelude
included the function
prelude-goto-symbol (bound to
It basically allowed you to jump to any definition in the current source file
imenu behind the curtains.
Recently I’ve found an even better option - the package
imenu-anywhere. It works in a pretty similar
manner but gives you the ability to jump to any definition in any currently open buffer.
That’s quite handy and it greatly reduces the need to use something like
As an added bonus -
imenu-anywhere features helm integration.
This is a very handy package and I encourage you to give it a go!
P.S. Prelude users should simply upgrade to the latest version of
Prelude (it already uses it).
From time to time people ask me about my personal Emacs
configuration. Other just assume that I use
Prelude. For a very long time my
personal configuration was pretty similar to Prelude - in a way it was
a staging ground for things to go into Prelude eventually (although
changes would travel both ways when Prelude users suggest some cool
Recently I’ve decided that in the future I want to do a few things with Prelude:
- extract as much functionality from it as possible into reusable
packages (e.g. super-save
- adopt there use-package
- improve the support for Windows (because now I have Windows computer)
As part of these efforts I reworked my personal config into something
pretty simple (it’s a single
init.el file) and I’ve started
experimenting with ideas for the future. Stay tuned for the results!
The config is available
here. Perhaps some of you will
find something useful there.
A long time ago I wrote about
remapping Return to Control in OS X.
This was the best productivity boost for my Emacs experience ever!
Recently I’ve bought a Windows ultrabook (wanted something as light as
MacBook Air, but more powerful and versatile) and I’m doing most of my
work there in a Xubuntu VM. The first thing I did while setting up Xubuntu
was to figure out how to do the aforementioned remapping.
In my original post some people suggested the tool
xcape, so I took a look at it. The
tool can certainly use some documentation improvements (and pre-built
packages), but it gets the job done. After you’ve installed it you
just need to add the following to your login shell’s init file
.bash_profile) and you’re in business:
xmodmap -e "remove Control = Control_R"
xmodmap -e "keycode 0x69 = Return"
xmodmap -e "keycode 0x24 = Control_R"
xmodmap -e "add Control = Control_R"
xcape -t 10000 -e "Control_R=Return"
Obviously the first time around you should source
after updating it:
This is definitely a lot more work than just clicking in the GUI of
the wonderful Karabiner, but it yields
the desired results and that’s what’s important at the end of the day.
Now if only there was a way to achieve the same result in Windows…
vim users will love
xcape. Its default behaviour is to
Escape key when
Left Control is pressed and released on