In a function X that calls completing-read, I'd like to be able to call X and pass in a constant input without invoking the minibuffer. From the emacs manual, it seems I'm supposed to flet completing-read-function, but I'm not sure the correct way to do this.
1 Answer
Assuming that you want the constant input to be optional, you can declare the function as taking an optional argument and then check if the argument is actually passed: if it is, go ahead and use it; if it isn't, then call completing-read.
Something like this:
(defun X (&optional foo) (message (or foo (completing-read "Enter foo value: " nil))) where I assume that the value of foo is a string.
If you call it with M-: (X), then foo will be nil and you will get the prompt. If you call it with M-: (X "bar") then no prompt will be issued and the value of foo will be the string bar.
- 1(Nit:)
(when (null foo))=(unless foo).Drew– Drew2022-01-01 20:34:28 +00:00Commented Jan 1, 2022 at 20:34 - 1Hi @NickD, the function X in question is
counsel-org-goto, which isn't my function. I'd like to refrain from changing it, and instead, when it callscompleting-read, have a user-supplied constant value automatically fed in.extremeaxe5– extremeaxe52022-01-05 18:50:48 +00:00Commented Jan 5, 2022 at 18:50 - You should have specified that in your question. I do not have time to check (and I know nothing about counsel), so I'm afraid I can't help. Maybe somebody else will provide an answer.NickD– NickD2022-01-05 19:43:10 +00:00Commented Jan 5, 2022 at 19:43
fletanything.completing-read-functionis a variable which you canlet-bind (like any dynamic variable). You would bind that variable to a function value.completing-read, or otherwise figure out a way to handle all of the calls sensibly.completing-read.