* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me @ 2022-09-12 18:31 Damien Cassou 2022-09-13 12:19 ` Lars Ingebrigtsen 0 siblings, 1 reply; 42+ messages in thread From: Damien Cassou @ 2022-09-12 18:31 UTC (permalink / raw) To: 57752; +Cc: Peter Oliver Hi, The file emacsclient-mail.desktop that is provided by Emacs (see below for an excerpt) doesn't seem to work for me. I would like mailto: links in the web browser to open with emacsclient but nothing happens. How to reproduce: 1. start the Emacs daemon (if not already done) 2. go to https://lists.gnu.org/archive/html/emacs-devel/2022-09/msg00320.html in a non-Emacs web browser 3. click the "Eli Zaretskii" button after "reply via email to" Expected: An Emacs client frame appears with a buffer in message mode Actual: Nothing happens If you try to reproduce and you get a different application opening to compose your email, you might want to add the following to ~/.config/mimeapps.list: [Default Applications] x-scheme-handler/mailto=emacsclient-mail.desktop It feels like launching my web browser from the terminal sometimes makes it work, but that's not really reliable. The freedesktop Desktop Entry Specification [1] contains: Field codes must not be used inside a quoted argument, the result of field code expansion inside a quoted argument is undefined. It seems to me that the .desktop file Emacs provides does just that: use a field code (%u) inside a quoted argument. I might be wrong in the interpretation of the spec though as the next sentence in the spec seems to contradict this interpretation. Anyway, I found a way to always have it working: 1. create a file emacs-compose-email.sh that starts emacsclient 2. add the executable bit to the file 3. reference the shell script from emacsclient-mail.desktop See below for the script and .desktop file. Another advantage of this approach is that the desktop file becomes much simpler with much less backslashes. My question is: do you want a patch with this change? emacs-compose-email.sh: #!/usr/bin/env bash emacsclient --alternate-editor= --eval "(message-mailto \"$1\")" Working emacsclient-mail.desktop: [Desktop Entry] Exec=emacs-compose-email.sh %u MimeType=x-scheme-handler/mailto Name=Emacs (Mail, Client) NoDisplay=true Terminal=false Type=Application Version=1.4 Excerpt of the existing (non-working) emacsclient-mail.desktop: [Desktop Entry] Exec=sh -c "exec emacsclient --alternate-editor= --display=\\"\\$DISPLAY\\" --eval \\\\(message-mailto\\\\ \\\\\\"%u\\\\\\"\\\\)" Name=Emacs (Mail, Client) MimeType=x-scheme-handler/mailto; Actions=new-window;new-instance; [Desktop Action new-window] Name=New Window Exec=emacsclient --alternate-editor= --create-frame --eval "(message-mailto \\"%u\\")" [Desktop Action new-instance] Name=New Instance Exec=emacs -f message-mailto %u [1]: https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-12 18:31 bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me Damien Cassou @ 2022-09-13 12:19 ` Lars Ingebrigtsen 2022-09-13 13:29 ` Damien Cassou 2022-09-16 19:42 ` Jim Porter 0 siblings, 2 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-13 12:19 UTC (permalink / raw) To: Damien Cassou; +Cc: Peter Oliver, 57752 Damien Cassou <damien@cassou.me> writes: > Anyway, I found a way to always have it working: > > 1. create a file emacs-compose-email.sh that starts emacsclient > 2. add the executable bit to the file > 3. reference the shell script from emacsclient-mail.desktop > > See below for the script and .desktop file. Another advantage of this > approach is that the desktop file becomes much simpler with much less > backslashes. > > My question is: do you want a patch with this change? I'd prefer to have a .desktop file that works without any helper scripts. Can't the emacsclient-mail.desktop file be rewritten to not use quoting here? ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 12:19 ` Lars Ingebrigtsen @ 2022-09-13 13:29 ` Damien Cassou 2022-09-13 13:41 ` Eli Zaretskii 2022-12-02 14:52 ` Max Nikulin 2022-09-16 19:42 ` Jim Porter 1 sibling, 2 replies; 42+ messages in thread From: Damien Cassou @ 2022-09-13 13:29 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Peter Oliver, 57752 Lars Ingebrigtsen <larsi@gnus.org> writes: > I'd prefer to have a .desktop file that works without any helper > scripts. Can't the emacsclient-mail.desktop file be rewritten to not > use quoting here? This is maybe possible but I haven't found a way. Moreover, the constraints that "Field codes must not be used inside a quoted argument" makes things more complex. One way we could maybe implement this is if it was possible to pass additional CLI arguments to emacsclient and read them from elisp the same way it is possible in batch mode with emacs. -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 13:29 ` Damien Cassou @ 2022-09-13 13:41 ` Eli Zaretskii 2022-09-13 13:58 ` Damien Cassou 2022-12-02 14:52 ` Max Nikulin 1 sibling, 1 reply; 42+ messages in thread From: Eli Zaretskii @ 2022-09-13 13:41 UTC (permalink / raw) To: Damien Cassou; +Cc: larsi, git, 57752 > Cc: Peter Oliver <git@mavit.org.uk>, 57752@debbugs.gnu.org > From: Damien Cassou <damien@cassou.me> > Date: Tue, 13 Sep 2022 15:29:10 +0200 > > One way we could maybe implement this is if > it was possible to pass additional CLI arguments to emacsclient and read > them from elisp the same way it is possible in batch mode with emacs. You mean, by using --eval from the emacsclient command line? ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 13:41 ` Eli Zaretskii @ 2022-09-13 13:58 ` Damien Cassou 2022-09-13 14:57 ` Robert Pluim 2022-09-15 18:30 ` Jim Porter 0 siblings, 2 replies; 42+ messages in thread From: Damien Cassou @ 2022-09-13 13:58 UTC (permalink / raw) To: Eli Zaretskii; +Cc: larsi, git, 57752 Eli Zaretskii <eliz@gnu.org> writes: >> From: Damien Cassou <damien@cassou.me> >> One way we could maybe implement this is if >> it was possible to pass additional CLI arguments to emacsclient and read >> them from elisp the same way it is possible in batch mode with emacs. > > You mean, by using --eval from the emacsclient command line? no because --eval would require a valid elisp expression such as emacsclient --eval (message-mailto "%u") which seems to go against the specification constraint. I thought about using something like the following: emacsclient --function message-mailto-reading-cli-args %u And message-mailto-reading-cli-args would read command-line-args-left or similar to do its job. This requires adding these features to emacsclient and implementing message-mailto-reading-cli-args. -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 13:58 ` Damien Cassou @ 2022-09-13 14:57 ` Robert Pluim 2022-09-13 15:32 ` Damien Cassou 2022-09-15 18:30 ` Jim Porter 1 sibling, 1 reply; 42+ messages in thread From: Robert Pluim @ 2022-09-13 14:57 UTC (permalink / raw) To: Damien Cassou; +Cc: Eli Zaretskii, git, larsi, 57752 >>>>> On Tue, 13 Sep 2022 15:58:06 +0200, Damien Cassou <damien@cassou.me> said: Damien> which seems to go against the specification constraint. I thought about Damien> using something like the following: Damien> emacsclient --function message-mailto-reading-cli-args %u Damien> And message-mailto-reading-cli-args would read command-line-args-left or Damien> similar to do its job. Damien> This requires adding these features to emacsclient and implementing Damien> message-mailto-reading-cli-args. `message-mailto' already looks at `command-line-args-left' (and has done so for quite some time), so all we need is the '-f <function' bit, which would be a nice addition. Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 14:57 ` Robert Pluim @ 2022-09-13 15:32 ` Damien Cassou 0 siblings, 0 replies; 42+ messages in thread From: Damien Cassou @ 2022-09-13 15:32 UTC (permalink / raw) To: Robert Pluim; +Cc: Eli Zaretskii, git, larsi, 57752 Robert Pluim <rpluim@gmail.com> writes: > `message-mailto' already looks at `command-line-args-left' (and has > done so for quite some time), so all we need is the '-f <function' > bit, which would be a nice addition. Excellent news, I should have checked! Thank you. -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 13:58 ` Damien Cassou 2022-09-13 14:57 ` Robert Pluim @ 2022-09-15 18:30 ` Jim Porter 2022-09-16 9:54 ` Lars Ingebrigtsen 1 sibling, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-15 18:30 UTC (permalink / raw) To: Damien Cassou, Eli Zaretskii; +Cc: larsi, git, 57752 On 9/13/2022 6:58 AM, Damien Cassou wrote: > no because --eval would require a valid elisp expression such as > > emacsclient --eval (message-mailto "%u") > > which seems to go against the specification constraint. I thought about > using something like the following: > > emacsclient --function message-mailto-reading-cli-args %u I agree that this would be a useful feature. Org Mode could also benefit from it (and probably some other places too). See https://lists.gnu.org/archive/html/emacs-orgmode/2022-02/msg00056.html ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-15 18:30 ` Jim Porter @ 2022-09-16 9:54 ` Lars Ingebrigtsen 2022-09-16 10:09 ` Robert Pluim 2022-09-16 15:17 ` Jim Porter 0 siblings, 2 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-16 9:54 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 Jim Porter <jporterbugs@gmail.com> writes: >> no because --eval would require a valid elisp expression such as >> emacsclient --eval (message-mailto "%u") >> which seems to go against the specification constraint. I thought >> about >> using something like the following: >> emacsclient --function message-mailto-reading-cli-args %u > > I agree that this would be a useful feature. Org Mode could also > benefit from it (and probably some other places too). See > https://lists.gnu.org/archive/html/emacs-orgmode/2022-02/msg00056.html I've idly wondered before whether we should add a general mechanism for this to avoid having to create functions that look at `command-line-args-left' themselves. (And --eval is problematic in circumstances like this.) So something like --function foo --function-args bar zot gazonk would result in calling `foo' with those arguments. Hm... would we need some way to say "here's the end of --function-args", perhaps? "--"? So: --function foo --function-args bar zot gazonk -- Anybody have any thoughts here? ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 9:54 ` Lars Ingebrigtsen @ 2022-09-16 10:09 ` Robert Pluim 2022-09-16 10:14 ` Lars Ingebrigtsen 2022-09-16 12:38 ` Damien Cassou 2022-09-16 15:17 ` Jim Porter 1 sibling, 2 replies; 42+ messages in thread From: Robert Pluim @ 2022-09-16 10:09 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 >>>>> On Fri, 16 Sep 2022 11:54:22 +0200, Lars Ingebrigtsen <larsi@gnus.org> said: Lars> I've idly wondered before whether we should add a general mechanism for Lars> this to avoid having to create functions that look at Lars> `command-line-args-left' themselves. (And --eval is problematic in Lars> circumstances like this.) emacsclient interprets emacsclient arg1 arg2 --eval (form1) (form2) (form3) as "send (form1), then (form2) then (form3), so by analogy this: Lars> --function foo --function-args bar zot gazonk doesnʼt require a --function-args parameter Lars> would result in calling `foo' with those arguments. Lars> Hm... would we need some way to say "here's the end of Lars> --function-args", perhaps? "--"? So: and this also isnʼt necessary, since the end of args is implicit by reaching the end of the arguments, same as '--eval' Lars> --function foo --function-args bar zot gazonk -- Lars> Anybody have any thoughts here? I idly wondered whether emacsclient could create a monster ʼ--evalʼ form with a binding for `command-line-args-left', but then I started having nightmares about string handling in C, so perhaps itʼs best to just send stuff over to emacs and let server.el handle it :-) Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 10:09 ` Robert Pluim @ 2022-09-16 10:14 ` Lars Ingebrigtsen 2022-09-16 14:18 ` Robert Pluim 2022-09-16 12:38 ` Damien Cassou 1 sibling, 1 reply; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-16 10:14 UTC (permalink / raw) To: Robert Pluim; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 Robert Pluim <rpluim@gmail.com> writes: > Lars> I've idly wondered before whether we should add a general > Lars> mechanism for > Lars> this to avoid having to create functions that look at > Lars> `command-line-args-left' themselves. (And --eval is problematic in > Lars> circumstances like this.) > > emacsclient interprets > > emacsclient arg1 arg2 --eval (form1) (form2) (form3) > > as "send (form1), then (form2) then (form3), so by analogy this: > > Lars> --function foo --function-args bar zot gazonk > > doesnʼt require a --function-args parameter I was thinking first and foremost about on the Emacs side, not on the emacsside client. But if then Emacs had --function-args, then by analogy, emacsclient should also have it. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 10:14 ` Lars Ingebrigtsen @ 2022-09-16 14:18 ` Robert Pluim 2022-09-16 15:21 ` Jim Porter 0 siblings, 1 reply; 42+ messages in thread From: Robert Pluim @ 2022-09-16 14:18 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 >>>>> On Fri, 16 Sep 2022 12:14:33 +0200, Lars Ingebrigtsen <larsi@gnus.org> said: Lars> Robert Pluim <rpluim@gmail.com> writes: Lars> I've idly wondered before whether we should add a general Lars> mechanism for Lars> this to avoid having to create functions that look at Lars> `command-line-args-left' themselves. (And --eval is problematic in Lars> circumstances like this.) >> >> emacsclient interprets >> >> emacsclient arg1 arg2 --eval (form1) (form2) (form3) >> >> as "send (form1), then (form2) then (form3), so by analogy this: >> Lars> --function foo --function-args bar zot gazonk >> >> doesnʼt require a --function-args parameter Lars> I was thinking first and foremost about on the Emacs side, not on the Lars> emacsside client. But if then Emacs had --function-args, then by Lars> analogy, emacsclient should also have it. Wouldnʼt it be easier to define a macro to do the `command-line-args-left' handling on behalf of a defun? That macro would then consume any args up to the next arg starting with '-', so you could do emacs --function foo arg1 arg2 arg3 --function bar arg4 arg5 arg6 There are also quoting and conversion issues to think about, eg: emacs --function foo hello 3 indent-tabs-mode 'always Do we make people say "hello" if they want strings, which implies that indent-tabs-mode would be treated as a variable, 3 as a number, and the ' needs to be escaped somehow? Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 14:18 ` Robert Pluim @ 2022-09-16 15:21 ` Jim Porter 0 siblings, 0 replies; 42+ messages in thread From: Jim Porter @ 2022-09-16 15:21 UTC (permalink / raw) To: Robert Pluim, Lars Ingebrigtsen; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 On 9/16/2022 7:18 AM, Robert Pluim wrote: > There are also quoting and conversion issues to think about, eg: > > emacs --function foo hello 3 indent-tabs-mode 'always > > Do we make people say > > "hello" if they want strings, which implies that indent-tabs-mode > would be treated as a variable, 3 as a number, and the ' needs to be > escaped somehow? Hopefully not, since one of the goals here is to be able to accept arbitrary strings from other programs (e.g. your mailto: handler). If we required strings to look "like this", then it becomes much more difficult to ensure that internal quotation marks are properly escaped. Instead, I think the arguments passed this way should always be strings. If you need something fancier, --eval can step in. (Of course, a function called with --function can convert its arguments however it likes.) ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 10:09 ` Robert Pluim 2022-09-16 10:14 ` Lars Ingebrigtsen @ 2022-09-16 12:38 ` Damien Cassou 2022-09-16 12:50 ` Gregory Heytings 2022-09-16 14:19 ` Robert Pluim 1 sibling, 2 replies; 42+ messages in thread From: Damien Cassou @ 2022-09-16 12:38 UTC (permalink / raw) To: Robert Pluim, Lars Ingebrigtsen; +Cc: Jim Porter, Eli Zaretskii, git, 57752 Robert Pluim <rpluim@gmail.com> writes: > Lars> Hm... would we need some way to say "here's the end of > Lars> --function-args", perhaps? "--"? So: > > and this also isnʼt necessary, since the end of args is implicit by > reaching the end of the arguments, same as '--eval' does it mean emacsclient will never be able to execute more than one function at a time? -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 12:38 ` Damien Cassou @ 2022-09-16 12:50 ` Gregory Heytings 2022-09-16 14:46 ` Damien Cassou 2022-09-16 14:19 ` Robert Pluim 1 sibling, 1 reply; 42+ messages in thread From: Gregory Heytings @ 2022-09-16 12:50 UTC (permalink / raw) To: Damien Cassou Cc: Jim Porter, Robert Pluim, 57752, git, Eli Zaretskii, Lars Ingebrigtsen > > does it mean emacsclient will never be able to execute more than one > function at a time? > I'm not sure what you want to do, but you can use an arbitrarily complex form in eval, with as many function calls as you want, for example: emacsclient --eval '(progn (foo) (bar) (baz) (zot))' ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 12:50 ` Gregory Heytings @ 2022-09-16 14:46 ` Damien Cassou 2022-09-16 15:07 ` Gregory Heytings 0 siblings, 1 reply; 42+ messages in thread From: Damien Cassou @ 2022-09-16 14:46 UTC (permalink / raw) To: Gregory Heytings Cc: Jim Porter, Robert Pluim, 57752, git, Eli Zaretskii, Lars Ingebrigtsen Gregory Heytings <gregory@heytings.org> writes: > I'm not sure what you want to do emacsclient \ --function fun1 --function-args arg1 arg2 \ --function fun2 --function-args arg3 -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 14:46 ` Damien Cassou @ 2022-09-16 15:07 ` Gregory Heytings 2022-09-16 16:18 ` Peter Oliver 0 siblings, 1 reply; 42+ messages in thread From: Gregory Heytings @ 2022-09-16 15:07 UTC (permalink / raw) To: Damien Cassou Cc: Jim Porter, Robert Pluim, 57752, git, Lars Ingebrigtsen, Eli Zaretskii >> I'm not sure what you want to do > > emacsclient \ > --function fun1 --function-args arg1 arg2 \ > --function fun2 --function-args arg3 > But emacsclient doesn't have a --function / --function-args parameter? And why is the above easier / better than emacsclient --eval '(progn (fun1 arg1 arg2) (fun2 arg3))' ? ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 15:07 ` Gregory Heytings @ 2022-09-16 16:18 ` Peter Oliver 2022-09-16 16:42 ` Gregory Heytings 0 siblings, 1 reply; 42+ messages in thread From: Peter Oliver @ 2022-09-16 16:18 UTC (permalink / raw) To: Gregory Heytings Cc: Jim Porter, Damien Cassou, Robert Pluim, 57752, git, Eli Zaretskii, Lars Ingebrigtsen On Fri, 16 Sep 2022, Gregory Heytings wrote: > And why is the above easier / better than > > emacsclient --eval '(progn (fun1 arg1 arg2) (fun2 arg3))' Because, with this, you have to correctly format the arguments with appropriate quoting into a lisp program, rather than just passing them straight in. If the arguments are input from something else, this is harder than it appears. Bad quoting is a common source of bugs (things like SQL injection, for example). -- Peter Oliver ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 16:18 ` Peter Oliver @ 2022-09-16 16:42 ` Gregory Heytings 2022-09-16 17:21 ` Jim Porter 0 siblings, 1 reply; 42+ messages in thread From: Gregory Heytings @ 2022-09-16 16:42 UTC (permalink / raw) To: Peter Oliver Cc: Jim Porter, Damien Cassou, Robert Pluim, 57752, git, Eli Zaretskii, Lars Ingebrigtsen >> And why is the above easier / better than >> >> emacsclient --eval '(progn (fun1 arg1 arg2) (fun2 arg3))' > > Because, with this, you have to correctly format the arguments with > appropriate quoting into a lisp program, rather than just passing them > straight in. If the arguments are input from something else, this is > harder than it appears. Bad quoting is a common source of bugs (things > like SQL injection, for example). > If that's the intended use case, IMO instead of adding two --function and --function-arg arguments it would be much clearer to add a --setq parameter: emacsclient --setq arg1 ... --setq arg2 ... --setq arg3 ... --eval '(progn (fun1 arg1 arg2) (fun2 arg3))' ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 16:42 ` Gregory Heytings @ 2022-09-16 17:21 ` Jim Porter 2022-09-16 18:26 ` Gregory Heytings 0 siblings, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-16 17:21 UTC (permalink / raw) To: Gregory Heytings, Peter Oliver Cc: Damien Cassou, Robert Pluim, 57752, git, Lars Ingebrigtsen, Eli Zaretskii On 9/16/2022 9:42 AM, Gregory Heytings wrote: >>> And why is the above easier / better than >>> >>> emacsclient --eval '(progn (fun1 arg1 arg2) (fun2 arg3))' >> >> Because, with this, you have to correctly format the arguments with >> appropriate quoting into a lisp program, rather than just passing them >> straight in. If the arguments are input from something else, this is >> harder than it appears. Bad quoting is a common source of bugs >> (things like SQL injection, for example). >> > > If that's the intended use case, IMO instead of adding two --function > and --function-arg arguments it would be much clearer to add a --setq > parameter: > > emacsclient --setq arg1 ... --setq arg2 ... --setq arg3 ... --eval > '(progn (fun1 arg1 arg2) (fun2 arg3))' I'm not convinced that '--function-arg' is necessary, but I do think that adding '--function' to emacsclient would be the best solution of the ones presented so far. That would allow both of the following in .desktop files: emacsclient --function my-function-taking-one-url %u emacsclient --function my-function-taking-many-urls %U (Likewise for %f/%F, which expands to one/many file names.) '--setq' has the disadvantage that you'd need some way to prepend *each* URL/filename with it in the %U/%F cases. The functions above would need to be able to consume command-line arguments (like 'message-mailto' does), but that's not a big deal. We could even add an 'apply-from-command-line' function that adapts any existing function to do this: emacsclient --function apply-from-command-line func arg1 arg2 'apply-from-command-line' could look at the arity of 'func' and consume the appropriate number of command-line arguments. Adding '--function' to emacsclient also has the advantage that it's already available for emacs, so it's not really an all-new feature so much as it is just adding a new place you can use it from. The semantics of '--function' are already set, and should work just fine for the cases described in this bug. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 17:21 ` Jim Porter @ 2022-09-16 18:26 ` Gregory Heytings 2022-09-16 19:33 ` Jim Porter 0 siblings, 1 reply; 42+ messages in thread From: Gregory Heytings @ 2022-09-16 18:26 UTC (permalink / raw) To: Jim Porter Cc: Damien Cassou, Robert Pluim, Peter Oliver, 57752, git, Lars Ingebrigtsen, Eli Zaretskii > > I'm not convinced that '--function-arg' is necessary, but I do think > that adding '--function' to emacsclient would be the best solution of > the ones presented so far. > It's not very adaptable, whereas --eval allows you to run an arbitrary form. > > That would allow both of the following in .desktop files: > > emacsclient --function my-function-taking-one-url %u > emacsclient --function my-function-taking-many-urls %U > Sure, and how would you use it say in shell scripts, in which these %u/%U/%f/%F constructs do not exist? > > '--setq' has the disadvantage that you'd need some way to prepend *each* > URL/filename with it in the %U/%F cases. > What about --setq args "(list %U)"? > > The functions above would need to be able to consume command-line > arguments (like 'message-mailto' does), but that's not a big deal. We > could even add an 'apply-from-command-line' function that adapts any > existing function to do this: > > emacsclient --function apply-from-command-line func arg1 arg2 > > 'apply-from-command-line' could look at the arity of 'func' and consume > the appropriate number of command-line arguments. > That's over-engineering IMO. > > Adding '--function' to emacsclient also has the advantage that it's > already available for emacs, > No, emacs only has --funcall: call Emacs Lisp function FUNC with no arguments. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 18:26 ` Gregory Heytings @ 2022-09-16 19:33 ` Jim Porter 2022-09-16 20:04 ` Gregory Heytings 0 siblings, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-16 19:33 UTC (permalink / raw) To: Gregory Heytings Cc: Damien Cassou, Robert Pluim, Peter Oliver, 57752, git, Lars Ingebrigtsen, Eli Zaretskii On 9/16/2022 11:26 AM, Gregory Heytings wrote: >> That would allow both of the following in .desktop files: >> >> emacsclient --function my-function-taking-one-url %u >> emacsclient --function my-function-taking-many-urls %U >> > > Sure, and how would you use it say in shell scripts, in which these > %u/%U/%f/%F constructs do not exist? That depends on the script. However, as an example, maybe you want a 'browse' alias that you can use from the shell (or a shell script) like this: browse https://gnu.org https://fsf.org You might define that alias one of these ways (assuming 'eww-browse-url' were enhanced to use 'command-line-args-left' like 'message-mailto'): alias browse='firefox' alias browse='emacs -f eww-browse-url' alias browse='emacsclient --funcall eww-browse-url' >> '--setq' has the disadvantage that you'd need some way to prepend >> *each* URL/filename with it in the %U/%F cases. >> > > What about --setq args "(list %U)"? That wouldn't work, since .desktop files forbid %-expansions inside quotes[1]. Even working around that, the expansion would look something like this: (list mailto:foo@bar.com ...) Since want each argument to be a string (and wrapping quotes around each element won't work for the same reason I previously mentioned), we'd probably want a different syntax than the above. I wouldn't expect that syntax to make a list of strings. >> Adding '--function' to emacsclient also has the advantage that it's >> already available for emacs, >> > > No, emacs only has --funcall: call Emacs Lisp function FUNC with no > arguments. Sorry, yes. I meant --funcall. This would likely necessitate some changes to how emacsclient talks to the main emacs process though, since I believe positional arguments to emacsclient are currently always treated as file names to visit. For "emacsclient --funcall" to work like "emacs --funcall", emacsclient would have to let the main emacs process process at least some of the arguments in the same manner as command-line arguments to "emacs" (i.e. allow reading them via '(pop command-line-args-left)' or something similar). (I also have an alternate strategy for addressing the original bug, which I'll describe in a separate message so that this subthread doesn't get too unwieldy.) [1] https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s07.html ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 19:33 ` Jim Porter @ 2022-09-16 20:04 ` Gregory Heytings 2022-09-18 13:58 ` Robert Pluim 0 siblings, 1 reply; 42+ messages in thread From: Gregory Heytings @ 2022-09-16 20:04 UTC (permalink / raw) To: Jim Porter Cc: Damien Cassou, Robert Pluim, Peter Oliver, 57752, git, Lars Ingebrigtsen, Eli Zaretskii >> What about --setq args "(list %U)"? > > That wouldn't work, since .desktop files forbid %-expansions inside > quotes[1]. Even working around that, the expansion would look something > like this: > > (list mailto:foo@bar.com ...) > Okay, now I see what you mean, you want to be able to pass an array of strings/arguments to Elisp. Then I think that the cleanest/most flexible way to do that would be --setq VAR VAL ... -- (note the final double hyphen) defined as having the effect of (setq VAR (list "VAL" ...)). That would allow zero, one or more arguments. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 20:04 ` Gregory Heytings @ 2022-09-18 13:58 ` Robert Pluim 0 siblings, 0 replies; 42+ messages in thread From: Robert Pluim @ 2022-09-18 13:58 UTC (permalink / raw) To: Gregory Heytings Cc: Jim Porter, Damien Cassou, Peter Oliver, 57752, git, Lars Ingebrigtsen, Eli Zaretskii >>>>> On Fri, 16 Sep 2022 20:04:25 +0000, Gregory Heytings <gregory@heytings.org> said: Gregory> Okay, now I see what you mean, you want to be able to pass an array of Gregory> strings/arguments to Elisp. Then I think that the cleanest/most Gregory> flexible way to do that would be Gregory> --setq VAR VAL ... -- Gregory> (note the final double hyphen) defined as having the effect of (setq Gregory> VAR (list "VAL" ...)). That would allow zero, one or more arguments. That sounds good, although it should not be called '--setq', to avoid people opening bugs saying "I did --setq indent-tabs-mode nil -- and itʼs still 't'". --let or --bind or ....? Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 12:38 ` Damien Cassou 2022-09-16 12:50 ` Gregory Heytings @ 2022-09-16 14:19 ` Robert Pluim 2022-09-16 14:47 ` Damien Cassou 1 sibling, 1 reply; 42+ messages in thread From: Robert Pluim @ 2022-09-16 14:19 UTC (permalink / raw) To: Damien Cassou; +Cc: Jim Porter, Lars Ingebrigtsen, git, Eli Zaretskii, 57752 >>>>> On Fri, 16 Sep 2022 14:38:46 +0200, Damien Cassou <damien@cassou.me> said: Damien> Robert Pluim <rpluim@gmail.com> writes: Lars> Hm... would we need some way to say "here's the end of Lars> --function-args", perhaps? "--"? So: >> >> and this also isnʼt necessary, since the end of args is implicit by >> reaching the end of the arguments, same as '--eval' Damien> does it mean emacsclient will never be able to execute more than Damien> one function at a time? Hmm, thatʼs a good point. May have the next argument starting with a ʼ-ʼ implicitly end the arglist, so you could do ʼ--functionʼ again? Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 14:19 ` Robert Pluim @ 2022-09-16 14:47 ` Damien Cassou 0 siblings, 0 replies; 42+ messages in thread From: Damien Cassou @ 2022-09-16 14:47 UTC (permalink / raw) To: Robert Pluim; +Cc: Jim Porter, Lars Ingebrigtsen, git, Eli Zaretskii, 57752 Robert Pluim <rpluim@gmail.com> writes: > Hmm, thatʼs a good point. May have the next argument starting with a > ʼ-ʼ implicitly end the arglist, so you could do ʼ--functionʼ again? I think the suggestion of Lars using ʼ--ʼ was clearer and is also aligned with other commands I often use. -- Damien Cassou "Success is the ability to go from one failure to another without losing enthusiasm." --Winston Churchill ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 9:54 ` Lars Ingebrigtsen 2022-09-16 10:09 ` Robert Pluim @ 2022-09-16 15:17 ` Jim Porter 2022-09-18 10:23 ` Lars Ingebrigtsen 1 sibling, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-16 15:17 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 On 9/16/2022 2:54 AM, Lars Ingebrigtsen wrote: > I've idly wondered before whether we should add a general mechanism for > this to avoid having to create functions that look at > `command-line-args-left' themselves. (And --eval is problematic in > circumstances like this.) > > So something like > > --function foo --function-args bar zot gazonk > > would result in calling `foo' with those arguments. > > Hm... would we need some way to say "here's the end of > --function-args", perhaps? "--"? So: > > --function foo --function-args bar zot gazonk -- > > Anybody have any thoughts here? I have two thoughts: 1) Instead of specifying the function args with a flag, I think I'd go the other way and specify the function as being special, e.g.: emacs --apply func arg1 arg2 2) Even better, why not just use --function and pass some higher-order function: emacs --function apply-from-command-line func arg1 arg2 That way, it's easy to substitute in some other higher-order function if you want. emacsclient would still need to add a --function flag though, and probably some changes to how it forwards arguments to the main emacs so that you can do stuff like this. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 15:17 ` Jim Porter @ 2022-09-18 10:23 ` Lars Ingebrigtsen 2022-09-18 14:46 ` Robert Pluim ` (2 more replies) 0 siblings, 3 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-18 10:23 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 Jim Porter <jporterbugs@gmail.com> writes: > 1) Instead of specifying the function args with a flag, I think I'd go > the other way and specify the function as being special, e.g.: > > emacs --apply func arg1 arg2 Yes, that sounds good. (But we'd still need "--" to say that the arguments have ended.) > 2) Even better, why not just use --function and pass some higher-order > function: > > emacs --function apply-from-command-line func arg1 arg2 I think that sounds more obscure, really (even if it's simpler to implement in the "emacs" case). > That way, it's easy to substitute in some other higher-order function > if you want. emacsclient would still need to add a --function flag > though, and probably some changes to how it forwards arguments to the > main emacs so that you can do stuff like this. Since we have to add something new to emacsclient in any case, I'd rather go with adding "--apply" to both Emacs and emacsclient, I think. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-18 10:23 ` Lars Ingebrigtsen @ 2022-09-18 14:46 ` Robert Pluim 2022-09-19 8:09 ` Lars Ingebrigtsen 2022-09-18 18:31 ` Jim Porter 2022-09-19 8:56 ` Gregory Heytings 2 siblings, 1 reply; 42+ messages in thread From: Robert Pluim @ 2022-09-18 14:46 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 >>>>> On Sun, 18 Sep 2022 12:23:47 +0200, Lars Ingebrigtsen <larsi@gnus.org> said: Lars> Jim Porter <jporterbugs@gmail.com> writes: >> 1) Instead of specifying the function args with a flag, I think I'd go >> the other way and specify the function as being special, e.g.: >> >> emacs --apply func arg1 arg2 Lars> Yes, that sounds good. (But we'd still need "--" to say that the Lars> arguments have ended.) >> 2) Even better, why not just use --function and pass some higher-order >> function: >> >> emacs --function apply-from-command-line func arg1 arg2 Lars> I think that sounds more obscure, really (even if it's simpler to Lars> implement in the "emacs" case). >> That way, it's easy to substitute in some other higher-order function >> if you want. emacsclient would still need to add a --function flag >> though, and probably some changes to how it forwards arguments to the >> main emacs so that you can do stuff like this. I think this would be covered by '--apply apply-from-command-line func arg1 arg2' Youʼd have to write 'apply-from-command-line' yourself, although thereʼd be nothing stopping us from providing a generic one that does (apply (intern (pop command-line-args-left)) command-line-args-left) or similar. Lars> Since we have to add something new to emacsclient in any case, I'd Lars> rather go with adding "--apply" to both Emacs and emacsclient, I think. I think this is the best option (and we leave anything complicated to '--eval'). Robert -- ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-18 14:46 ` Robert Pluim @ 2022-09-19 8:09 ` Lars Ingebrigtsen 0 siblings, 0 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-19 8:09 UTC (permalink / raw) To: Robert Pluim; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 Robert Pluim <rpluim@gmail.com> writes: > Youʼd have to write 'apply-from-command-line' yourself, although > thereʼd be nothing stopping us from providing a generic one that does > > (apply (intern (pop command-line-args-left)) command-line-args-left) > > or similar. I don't see any advantages to having something like that over something like --apply. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-18 10:23 ` Lars Ingebrigtsen 2022-09-18 14:46 ` Robert Pluim @ 2022-09-18 18:31 ` Jim Porter 2022-09-19 8:12 ` Lars Ingebrigtsen 2022-09-19 8:56 ` Gregory Heytings 2 siblings, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-18 18:31 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 On 9/18/2022 3:23 AM, Lars Ingebrigtsen wrote: > Jim Porter <jporterbugs@gmail.com> writes: > >> 1) Instead of specifying the function args with a flag, I think I'd go >> the other way and specify the function as being special, e.g.: >> >> emacs --apply func arg1 arg2 > > Yes, that sounds good. (But we'd still need "--" to say that the > arguments have ended.) This is actually the trickiest part about this to me. If I were designing this, I'd say that '--apply' consumes every positional argument up to the next flag. If it encounters a '--' while consuming arguments, *every* remaining argument gets passed to the function. That allows the following: emacs --apply func1 arg1 arg2 --apply func2 arg3 arg4 -Q => emacs -Q (func1 "arg1" "arg2") (func2 "arg3" "arg4") emacs --apply func -- --arg1 --arg2 => emacs (func "--arg1" "--arg2") This way, users can pass arguments beginning with a "-" to the function being applied while still retaining a fair amount of flexibility in other cases. It would also be good for shell scripts/aliases where you don't know ahead of time what the arguments will look like. If you had this in your shell environment: EDITOR="emacs --apply fancy-find-file" then you might try to visit a file named "-Q". However, it would treat "-Q" as an argument to emacs instead. With what I suggested above, you'd just say: EDITOR="emacs --apply fancy-find-file --" That's a common way of doing this for other command-line tools, so I think most people should understand the behavior fairly easily. >> 2) Even better, why not just use --function and pass some higher-order >> function: >> >> emacs --function apply-from-command-line func arg1 arg2 > > I think that sounds more obscure, really (even if it's simpler to > implement in the "emacs" case). Either is fine with me. Originally, I thought that "--funcall apply-from-command-line ..."[1] might be nicer since you could replace 'apply-from-command-line' with a fancier function, e.g. one that parses numeric values, but I think you'd be able to do that with --apply anyway. It's probably better to keep the simple path simple and go with --apply. [1] I had meant to type --funcall instead of --function in my previous message, but got mixed up. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-18 18:31 ` Jim Porter @ 2022-09-19 8:12 ` Lars Ingebrigtsen 2022-09-19 15:48 ` Jim Porter 0 siblings, 1 reply; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-19 8:12 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 Jim Porter <jporterbugs@gmail.com> writes: > This is actually the trickiest part about this to me. If I were > designing this, I'd say that '--apply' consumes every positional > argument up to the next flag. Sorry, that would just be a very fiddly, often-breaking interface. If you say emacs --apply foo $1 $2 and $2 happens to be "-*hakuna-matata*-", then you'd get a failure. Morover, there's no way to separate emacs --apply foo param1 param2 from emacs --apply foo param1 file-to-be-opened So we need "--" to end the parameter list. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-19 8:12 ` Lars Ingebrigtsen @ 2022-09-19 15:48 ` Jim Porter 2022-09-19 18:45 ` Lars Ingebrigtsen 0 siblings, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-19 15:48 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 On 9/19/2022 1:12 AM, Lars Ingebrigtsen wrote: > Jim Porter <jporterbugs@gmail.com> writes: > >> This is actually the trickiest part about this to me. If I were >> designing this, I'd say that '--apply' consumes every positional >> argument up to the next flag. > > Sorry, that would just be a very fiddly, often-breaking interface. If > you say > > emacs --apply foo $1 $2 > > and $2 happens to be "-*hakuna-matata*-", then you'd get a failure. In my suggestion, this would be spelled emacs --apply foo -- $1 $2 However... > Morover, there's no way to separate > > emacs --apply foo param1 param2 > > from > > emacs --apply foo param1 file-to-be-opened > > So we need "--" to end the parameter list. This would indeed be impossible in my suggestion (at least not without having 'foo' call 'find-file'). Just to make sure I understand your suggestion: '--apply' would consume *every* argument after it until it sees a '--'? So to apply 2 functions, you'd say: emacs --apply func1 arg1 arg2 -- --apply func2 arg3 arg4 That seems like it would probably be ok, so long as no one wanted to pass a literal '--' to the function. I don't think there's much of a security risk either, since the worst that would happen is someone sending "-- foobar", causing "foobar" to get opened as a file. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-19 15:48 ` Jim Porter @ 2022-09-19 18:45 ` Lars Ingebrigtsen 0 siblings, 0 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-19 18:45 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Eli Zaretskii, git, 57752 Jim Porter <jporterbugs@gmail.com> writes: > This would indeed be impossible in my suggestion (at least not without > having 'foo' call 'find-file'). Just to make sure I understand your > suggestion: '--apply' would consume *every* argument after it until it > sees a '--'? So to apply 2 functions, you'd say: > > emacs --apply func1 arg1 arg2 -- --apply func2 arg3 arg4 Yes. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-18 10:23 ` Lars Ingebrigtsen 2022-09-18 14:46 ` Robert Pluim 2022-09-18 18:31 ` Jim Porter @ 2022-09-19 8:56 ` Gregory Heytings 2022-09-19 12:00 ` Lars Ingebrigtsen 2022-09-19 16:05 ` Jim Porter 2 siblings, 2 replies; 42+ messages in thread From: Gregory Heytings @ 2022-09-19 8:56 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 >> emacs --apply func arg1 arg2 > > Yes, that sounds good. > Hmm... I did not see the --apply proposal earlier, it's nice and lispy indeed. I think I would prefer to separate the two concerns (stuffing argument strings into the Lisp environment on the one hand, and forms on the other hand), but it seems good enough, and perhaps it's the best compromise. One disadvantage I see is that it becomes a bit more complex to write function calls with arguments that are not strings. E.g. to call (some-func 1 "arg" t) one would have to do something like --eval '(defun tmp-func (arg) (some-func 1 arg t))' --apply tmp-func arg instead of something like --set args arg -- --eval '(some-func 1 (car args) t)' Likewise, if we want to use the arguments in multiple --eval forms, something like --eval '(defun setarg1 (arg) (setq arg1 arg))' --apply setarg1 arg -- --eval '(... arg1 ...)' --eval '(... arg1 ...)' will be necessary. Yet another example is that to loop over all arguments, one would have to do something like --eval '(defun loop-fun (args) (dolist (arg args) ...))' --apply loop-fun args instead of something like --set args arg -- --eval '(dolist (arg args) ...)' One case in which --apply is better is when the function is already defined by Emacs, e.g. (with the .desktop example mentioned upthread, and assuming that find-many-files is defined by Emacs) --apply find-many-files %F is probably clearer than --set files %F -- --eval '(find-many-files files)' > > (But we'd still need "--" to say that the arguments have ended.) > Except for the last argument(s), of course. IOW, except if there are no arguments that must not be passed to the function after the function arguments. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-19 8:56 ` Gregory Heytings @ 2022-09-19 12:00 ` Lars Ingebrigtsen 2022-09-19 16:05 ` Jim Porter 1 sibling, 0 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-19 12:00 UTC (permalink / raw) To: Gregory Heytings; +Cc: Damien Cassou, Jim Porter, Eli Zaretskii, git, 57752 Gregory Heytings <gregory@heytings.org> writes: > One disadvantage I see is that it becomes a bit more complex to write > function calls with arguments that are not strings. E.g. to call > > (some-func 1 "arg" t) Yes, that's unfortunate. On the other hand, where these things are useful, you'd usually expect the Emacs to take string arguments. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-19 8:56 ` Gregory Heytings 2022-09-19 12:00 ` Lars Ingebrigtsen @ 2022-09-19 16:05 ` Jim Porter 2022-09-19 17:01 ` Gregory Heytings 1 sibling, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-19 16:05 UTC (permalink / raw) To: Gregory Heytings, Lars Ingebrigtsen Cc: Damien Cassou, Eli Zaretskii, git, 57752 On 9/19/2022 1:56 AM, Gregory Heytings wrote: > Hmm... I did not see the --apply proposal earlier, it's nice and lispy > indeed. > > I think I would prefer to separate the two concerns (stuffing argument > strings into the Lisp environment on the one hand, and forms on the > other hand), but it seems good enough, and perhaps it's the best > compromise. > > One disadvantage I see is that it becomes a bit more complex to write > function calls with arguments that are not strings. E.g. to call > > (some-func 1 "arg" t) > > one would have to do something like > > --eval '(defun tmp-func (arg) (some-func 1 arg t))' --apply tmp-func arg > > instead of something like > > --set args arg -- --eval '(some-func 1 (car args) t)' If Emacs gained a 'set-arg' function (similar to 'setarg1' in your message) that does the right thing, you could say: --apply set-arg args arg -- --eval '(some-func 1 (car args) t)' Another way would be a function that "intelligently" converts arguments to other types. This is similar to how Eshell command forms work: if you're calling a Lisp function with sh-like syntax, it will automatically convert arguments that look like numbers into actual numbers. So maybe you could do something like: --apply autoconvert-strings-and-apply some-func 1 arg t That seems clumsier to me than 'set-arg', but since these could all be written as Lisp functions, users or package authors should be able to do whatever they need. Of course, core Emacs could add whichever helper function(s) seem generally useful. > One case in which --apply is better is when the function is already > defined by Emacs... Yeah, for more-complex forms, you'd still need to fall back to --eval or something similar. But a Lisp function like 'set-arg' could let us reuse the --apply machinery. I think it could be as simple as this: (defun set-arg (name &rest value) (set (intern name) value)) That should give us '--set', except that it's spelled '--apply set-arg'. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-19 16:05 ` Jim Porter @ 2022-09-19 17:01 ` Gregory Heytings 0 siblings, 0 replies; 42+ messages in thread From: Gregory Heytings @ 2022-09-19 17:01 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Lars Ingebrigtsen, git, Eli Zaretskii, 57752 > > But a Lisp function like 'set-arg' could let us reuse the --apply > machinery. I think it could be as simple as this: > > (defun set-arg (name &rest value) > (set (intern name) value)) > > That should give us '--set', except that it's spelled '--apply set-arg'. > Indeed. So --apply with a predefined set-args function should cover all cases I mentioned earlier. That should have been obvious, sorry for the noise. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 13:29 ` Damien Cassou 2022-09-13 13:41 ` Eli Zaretskii @ 2022-12-02 14:52 ` Max Nikulin 2023-07-26 5:14 ` Max Nikulin 1 sibling, 1 reply; 42+ messages in thread From: Max Nikulin @ 2022-12-02 14:52 UTC (permalink / raw) To: Damien Cassou, Lars Ingebrigtsen; +Cc: Jim Porter, Peter Oliver, 57752 On 13/09/2022 20:29, Damien Cassou wrote: > Lars Ingebrigtsen writes: >> I'd prefer to have a .desktop file that works without any helper >> scripts. Can't the emacsclient-mail.desktop file be rewritten to not >> use quoting here? > > This is maybe possible but I haven't found a way. Moreover, the > constraints that "Field codes must not be used inside a quoted argument" > makes things more complex. It is possible to pass %u to shell using positional parameters: sh -c 'echo "$1"' demo ARGUMENT However POSIX shell is not enough to escape double quote and backslash inside %u for elisp. BASH allows to perform substitutions during variable expansion. The idea is the following (it needs more backslashes to conform XDG spec): bash -c 'e=${1//\\/\\\\}; e=${e///\"/\\\"}; emacsclient --alternate-editor= --display="$DISPLAY" --eval=\(message-mailto\ "\"$e\""\)' emacsclient-mailto %u ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-12-02 14:52 ` Max Nikulin @ 2023-07-26 5:14 ` Max Nikulin 0 siblings, 0 replies; 42+ messages in thread From: Max Nikulin @ 2023-07-26 5:14 UTC (permalink / raw) To: Damien Cassou, Lars Ingebrigtsen; +Cc: Jim Porter, Peter Oliver, 57752 On 02/12/2022 21:52, Max Nikulin wrote: > > bash -c 'e=${1//\\/\\\\}; e=${e///\"/\\\"}; emacsclient > --alternate-editor= --display="$DISPLAY" --eval=\(message-mailto\ > "\"$e\""\)' emacsclient-mailto %u A similar approach has been applied in the following commits: - c8ec0017cb9 2023-03-08 19:37:27 +0100 Ulrich Müller: Avoid using bash in the emacsclient desktop file - 3c1693d08b0 2023-03-07 18:25:37 +0100 Ulrich Müller: Fix Elisp code injection vulnerability in emacsclient-mail.desktop - d32091199ae 2022-12-19 16:51:20 +0100 Ulrich Müller: Fix quoted argument in emacsclient-mail.desktop Exec key See - (#60204) - Gabriel Corona. Shell command and Emacs Lisp code injection in emacsclient-mail.desktop. Wed, 8 Mar 2023 12:37:29 +0100 https://www.openwall.com/lists/oss-security/2023/03/08/2 So the specific reported issue has been fixed. I am unsure if this bug should be closed or it should be left open to continue discussion how to implement passing literal arguments through emacsclient. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-13 12:19 ` Lars Ingebrigtsen 2022-09-13 13:29 ` Damien Cassou @ 2022-09-16 19:42 ` Jim Porter 2022-09-18 10:26 ` Lars Ingebrigtsen 1 sibling, 1 reply; 42+ messages in thread From: Jim Porter @ 2022-09-16 19:42 UTC (permalink / raw) To: Lars Ingebrigtsen, Damien Cassou; +Cc: Peter Oliver, 57752 On 9/13/2022 5:19 AM, Lars Ingebrigtsen wrote: > I'd prefer to have a .desktop file that works without any helper > scripts. Can't the emacsclient-mail.desktop file be rewritten to not > use quoting here? Here's another strategy for handling this, inspired by org-protocol[1]. For those who haven't used it, org-protocol invokes emacsclient with an "org-protocol://..." URL to let you do things like capture text from another application. Extending from that, what if Emacs introduced URL handlers, so that these: emacs mailto:foo@bar.com emacsclient mailto:foo@bar.com would look up a "mailto:" handler defined somewhere in Emacs[2] (e.g. 'message-mailto') and call that function instead of 'find-file'. This is roughly how the org-protocol module handles this, although it only works for emacsclient (it adds advice to a few functions from server.el). This would be less flexible than having a generic way of feeding certain command-line arguments to an Emacs Lisp function, but I'm not sure what practical uses we'd need that for aside from handling URLs, as in this bug or for org-protocol. If there are some other uses people have for the more-flexible implementation, I think it would help to list those so we can be sure the chosen solution addresses them. [1] https://orgmode.org/manual/Protocols.html [2] Possibly opt-in in the user's config. I don't have any preferences here. ^ permalink raw reply [flat|nested] 42+ messages in thread
* bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me 2022-09-16 19:42 ` Jim Porter @ 2022-09-18 10:26 ` Lars Ingebrigtsen 0 siblings, 0 replies; 42+ messages in thread From: Lars Ingebrigtsen @ 2022-09-18 10:26 UTC (permalink / raw) To: Jim Porter; +Cc: Damien Cassou, Peter Oliver, 57752 Jim Porter <jporterbugs@gmail.com> writes: > If there are some other uses people have for the more-flexible > implementation, I think it would help to list those so we can be sure > the chosen solution addresses them. The general use case is that having --apply just makes things easier to script without having to worry about string interpolation. Getting --eval "(...\\"$foo\\" $bar)" etc right in all circumstances is hard and leads to fragile scripts. ^ permalink raw reply [flat|nested] 42+ messages in thread
end of thread, other threads:[~2023-07-26 5:14 UTC | newest] Thread overview: 42+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-09-12 18:31 bug#57752: 28.1.91; emacsclient-mail.desktop doesn't work for me Damien Cassou 2022-09-13 12:19 ` Lars Ingebrigtsen 2022-09-13 13:29 ` Damien Cassou 2022-09-13 13:41 ` Eli Zaretskii 2022-09-13 13:58 ` Damien Cassou 2022-09-13 14:57 ` Robert Pluim 2022-09-13 15:32 ` Damien Cassou 2022-09-15 18:30 ` Jim Porter 2022-09-16 9:54 ` Lars Ingebrigtsen 2022-09-16 10:09 ` Robert Pluim 2022-09-16 10:14 ` Lars Ingebrigtsen 2022-09-16 14:18 ` Robert Pluim 2022-09-16 15:21 ` Jim Porter 2022-09-16 12:38 ` Damien Cassou 2022-09-16 12:50 ` Gregory Heytings 2022-09-16 14:46 ` Damien Cassou 2022-09-16 15:07 ` Gregory Heytings 2022-09-16 16:18 ` Peter Oliver 2022-09-16 16:42 ` Gregory Heytings 2022-09-16 17:21 ` Jim Porter 2022-09-16 18:26 ` Gregory Heytings 2022-09-16 19:33 ` Jim Porter 2022-09-16 20:04 ` Gregory Heytings 2022-09-18 13:58 ` Robert Pluim 2022-09-16 14:19 ` Robert Pluim 2022-09-16 14:47 ` Damien Cassou 2022-09-16 15:17 ` Jim Porter 2022-09-18 10:23 ` Lars Ingebrigtsen 2022-09-18 14:46 ` Robert Pluim 2022-09-19 8:09 ` Lars Ingebrigtsen 2022-09-18 18:31 ` Jim Porter 2022-09-19 8:12 ` Lars Ingebrigtsen 2022-09-19 15:48 ` Jim Porter 2022-09-19 18:45 ` Lars Ingebrigtsen 2022-09-19 8:56 ` Gregory Heytings 2022-09-19 12:00 ` Lars Ingebrigtsen 2022-09-19 16:05 ` Jim Porter 2022-09-19 17:01 ` Gregory Heytings 2022-12-02 14:52 ` Max Nikulin 2023-07-26 5:14 ` Max Nikulin 2022-09-16 19:42 ` Jim Porter 2022-09-18 10:26 ` Lars Ingebrigtsen
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).