0

I have a function. How can I add to it an auto-completion with an available font name?

So if I type something like doSomethingWithFont Ubun<tab> it'll be completed to doSomethingWithFont Ubuntu\ Mono for example.

doSomethingWithFont () { echo $1 } _completeWithFontName () { # ???? } complete -F _completeWithFontName doSomethingWithFont 
1
  • 1
    This sounds like two separate questions: (a) How to get a list of the available fonts and (b) how to create tab completion for that. Commented Nov 20, 2021 at 12:19

1 Answer 1

0

You might want to use the fc_list command to list available fonts, in the format you want them to be entered.

This is how that fits into your sample code:

 _completeWithFontName() { < <(fc-list -f "%{family}\n" | grep "^$2" | sort -u) mapfile -t COMPREPLY; } complete -F _completeWithFontName doSomethingWithFont 

Note that you should not pipe into the mapfile command: piping puts the destination command into a subshell, and you would loose the new contents of the COMPREPLY array immediately, on exit of that subshell. Redirecting < from a process substitution <(...) works better.

The -f parameter to fc-list sets the format, the simple grep command selects those font names that match the first characters entered on the command line, and the sort is for convenience. I also add a -u (unique) parameter to the sort because in this example I list only the families; each variant would appear as a duplicate, so we should sort them out.

7
  • Thank you. The problem only with spaces in font names. For example I have fonts with names : Samyak Devanagari, Samyak Gujarati, Samyak Malayalam, Samyak Tamil. The tab-completion will stop after the first space. Commented Nov 21, 2021 at 9:19
  • That is an issue with all completions. You could, like you would do to match e.g. filenames with spaces in them, enter quoted prefixes, e.g. "Ubu<tab>; the complete functionality will handle that just fine, and even add a closing quote as soon as you <tab> when your prefix has gotten unique. Without quoting, you can escape spaces: Ubuntu\ Co<tab> will complete to Ubuntu\ Condensed. Commented Nov 21, 2021 at 9:30
  • File names don't have this issue, autocompletion escapes symbols automaticaly. I didn't think about starting argument with doublequote for proper completion, it's interesting. Commented Nov 21, 2021 at 9:37
  • I assumed to much. It turns out that to escape spaces with a backslash and have Ubuntu\ Co<tab> complete to Ubuntu\ Condensed, you would have to make your function handle the backslash as an escape; the complete functionality passes it to your function in $2 as a plain backslash character followed by a space or whatever you entered. That means roughly remove unquoted backslashes, except for the 2nd of `\\` (if that ever happens in a fontname), and on output again replace spaces with escaped spaces. Commented Nov 21, 2021 at 9:42
  • @tehkonst About spaces and filename completion: that may depend on the files present. Try for instance touch "a file" "afile" "a document" and then try to complete ls a<tab> and ls a <tab> (a space after the 'a'). Interesting things happen, that clearly have been programmed to make them happen like that for a reason. Now it's up to you to do the same for your font completion. Commented Nov 21, 2021 at 9:50

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.