psql filename completion: quoting
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: pgsql-hackers@postgresql.org
Date: 2012-01-14T15:20:18Z
Lists: pgsql-hackers
Attachments
- psql-file-completion-v1.patch (text/plain) patch v1
Occasionally, I have a SQL file destined for psql's \i command whose name contains a space. Less often, I'll have a .csv destined for \copy with the same problem. psql's filename completion does not handle these well. It completes on the literal name, but the commands will only recognize quoted names. For example, given a file "foo bar", "\i f<TAB>" will complete to "\i foo bar", which will not execute. If I type "\i 'f<TAB>", completion will not help at all. The attached patch wraps rl_filename_completion_function() to dequote on input and enquote on output. Now, "\i f<TAB>" and "\i 'f<TAB>" will both complete to "\i 'foo bar'", which executes as expected. The new code handles embedded whitespace, quotes, and backslashes. tab-complete.c works in terms of whitespace-separated words. As such, "\i 'foo b<TAB>" does not complete, because tab-complete.c has no notion of quotes affecting token boundaries. It thinks "'foo" is one token and "b" is another. I'm sure we could fix this (Bash gets it right). It seemed rather independent code-wise, so I did not attempt that for this patch. Thanks, nm