41

I understand that if you type ls * it is actually expanded to ls a b c when the current directly has files a, b and c.

I was wondering if there is a way to expand this before I hit enter. Similar to how Ctrl+X works, or tab complete works.

So to make myself clear

$ ls *
<press magic key>
$ ls a b c

in a similar way to:

$ ls ~/
<press tab>
$ ls /home/username

I thought I'd seen this before but I might have been mistaken.

bramp
  • 528

5 Answers5

28

In bash, the readline capability is called glob-expand-word and is bound to CtrlX* by default.

25

You can use the glob-expand-word function, from man bash:

The word before point is treated as a pattern for pathname
expansion, and the list of matching file names is inserted,
replacing the word. If a numeric argument is supplied, an
asterisk is appended before pathname expansion.

Add something like this to your ~/.inputrc:

Control-x: glob-expand-word

So $ ls * followed by Ctrl-X will expand to $ ls a b c, in your example.

cYrus
  • 22,335
15

When you are in vi mode (set -o vi), the "magic key" is Esc*. This works with both bash and ksh.

Zombo
  • 1
jlliagre
  • 14,369
6
$ bind -q glob-expand-word
glob-expand-word can be invoked via "\C-x*".

$ bind -q insert-completions
insert-completions can be invoked via "\e*".

So to use these we can do

ls * Ctrl+x *

or

ls * Esc *

Expand complicated lines before hitting enter

Zombo
  • 1
0

An alternative to glob-expand-word (\C-x*) is insert-completions (\e*). It works without an asterisk at the end, but it also includes other completions like hidden files. I have rebound both in ~/.inputrc:

# insert glob results (\C-x* by default)
"\C-g": glob-expand-word

# insert completion list (\e* by default)
"\ei": insert-completions

glob-complete-word (\eg) can be used to convert for example /System/Library/Launch*/*Finder to /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
  • 42,502
  • 8
  • 126
  • 159