Emacs(client) as editor in psqlpsql is an amazing interactive SQL swiss-army knife terminal thingy that can really tunr your day! Quite frankly, in my professional training activity, I always tell participants to learn to use
psqlfor several reasons, and I also ask them if any of their interactive SQL-terminals has the same set of features, without having back an answer! One nice thing that
psqlprovides, is the capability to edit a complex query directly within your editor of choice. My editor of choice is Emacs! Starting Emacs every time I have to edit a query buffer (via
\ecommand) is awkward: even on recent hardware, Emacs startup is slow. Thankfully, there is a trick: Emacs embeds a client-server approach. And it is a real client-server approach. The idea is to have Emacs started as a daemon, and every time you need a new editor frame (ehm, every time you need to edit something), you can invoke the special command
emacsclientasking to attach to the daemon running. As a result, while the daemon startup is as slow as a normal
emacsinstance is, the
emacsclientediting session is shiningly fast! So far so good! Ehm, no, well, not for me. I had a lot of troubles in trying to configure
emacsclientas an editor. And, shame on me, I had troubles because I was using the wrong set of flags to launcha
emacsclient! To make things worst: I’m using ZSH as my default shell, and for some strange reason I need to investigate on, the shell does not work really well with commands and flags within the same environment variable.
TL;DR - How to do that?There are two ways to change the default editor that
psqlis going to use to edit a query buffer:
- set the well known
- set the
$EDITOR, I will be dropped into my comfortable Emacs environment. Therefore, in order to achieve this, after some research on the flags, simply put the following in your
export EDITOR="emacsclient -t"
or do the same with
PSQL_EDITOR. Then, when you are in the
\eand look at Emacs quickly appear. The very first time, when you will come back to your
psqlsession, you will notice a few lines of warnings coming out from Emacs itself:
testdb=> \e emacsclient: can't find socket; have you started the server? emacsclient: To start the server in Emacs, type "M-x server-start". Starting Emacs daemon. Emacs daemon should have started, trying to connect again testdb=>
That’s because, at the very first time,
emacsclientdoes not find any
emacsinstance running as a daemon, so it starts one by itself, waits a moment, and connect back to the server. This is clearly explained in the messages, that are therefore just warnings.
What about ZSH (and Bash)?One of the reason it took me so long to understand how to configure
emacsclient, was that for some reasons I don’t know (yet), ZSH behaves nastly when you try to launch a command within an environment variable, assuming such variable contains spaces. Why? Because in order to set the variable with spaces, you have to quote your command line, and at that point ZSH assumes the whole string is a single command:
% echo $EDITOR emacsclient -t % $EDITOR zsh: command not found: emacsclient -t
The same does not happen in Bash, that behaves as expected:
% bash $ echo $EDITOR emacsclient -t $ $EDITOR ...
So, I’ve also found a place where Bash seems to behave more intuitively than ZSH is (and no, I’m not going to switch back to Bash for this reason!).
Colors and themes!I tend to use a dark color scheme in all my activities, included terminals I use to SSH-in machines. In these circumstances, Emacs has a very poor default color choice. Assuming you don’t have a specific Emacs startup configuration (and you should, believe me!), you can add a line like the following to one of your startup files (e.g.,
This will make your Emacs experience on dark terminals a lot better! Please consider that changes will not be reflect into any running daemon, so you have to restart Emacs (or re-evaluate) the startup files once you have changed!
ConclusionsEmacs, thanks to its client-server component, can really improve your already awesome experience within
psql! For instance, you can use external tools to reformat your queries while you are writing them in the editor. For more documentation on how to customize
emacsclientsee the official documentation.