* [QUESTION] How to use :filter in `make-process'?
@ 2020-03-03 7:49 stardiviner
2020-03-03 8:19 ` Joost Kremers
2020-03-03 14:39 ` Stefan Monnier
0 siblings, 2 replies; 11+ messages in thread
From: stardiviner @ 2020-03-03 7:49 UTC (permalink / raw)
To: Emacs Help
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
I have an code example try to use :filter handler of make-process.
```
(let ((op-fn (lambda () (message "call the fn"))))
(make-process
:name "sleep command test"
:command (list "sleep" "3")
:filter `(lambda (proc event)
(message "event catched!")
(funcall ,op-fn))
:buffer "*sleep test*"))
```
I don't know how to use it correctly. Can you give some good examples of using
this `:filter' handler, and explain it a little?
Thanks in advanced.
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5eDCEUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsOYiQgAvbGnIiyR+SMjgf9Cr6ZQ5jSRcbwo
cPDl8tsWSAZkv8sYCbdlPWsLSAGg8pipTP/jSsB2wSF2xALAkxntNGSLwfryQcO4
nmKsDuPE6W2VewB6D7WrAmMjNUrQi0b27Frev017wYIWnWE1nK6cSpzh69/V/rOE
ACl+ReskQcv5lAhtHgBQXVmmqGvbrq0fbeZyqjIpw0MPACuRFjG03S+zPXIiE/Rn
tKtIvnniMutz8qxx37soV5VpcBazG5rrSc3pFGTTMb/dreiqz7Bmxh/xlVJXgCec
2GYz1H1TxHuHD5MZLvzgOIkuiFVH71x4KcilEA/j+4ZsVacaVgCPBGPgNA==
=R9s9
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 7:49 [QUESTION] How to use :filter in `make-process'? stardiviner
@ 2020-03-03 8:19 ` Joost Kremers
2020-03-03 16:18 ` [SOLVED] " stardiviner
2020-03-03 14:39 ` Stefan Monnier
1 sibling, 1 reply; 11+ messages in thread
From: Joost Kremers @ 2020-03-03 8:19 UTC (permalink / raw)
To: help-gnu-emacs
On Tue, Mar 03 2020, stardiviner wrote:
> I have an code example try to use :filter handler of
> make-process.
[...]
> I don't know how to use it correctly. Can you give some good
> examples of using
> this `:filter' handler, and explain it a little?
There is quite an elaborate explanation in the Elisp manual:
Elisp > Processes > Output from Processes > Filter Functions
or:
(info "(elisp) Filter Functions") ⇐ put cursor here and press C-x
C-e
HTH
--
Joost Kremers
Life has its moments
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 7:49 [QUESTION] How to use :filter in `make-process'? stardiviner
2020-03-03 8:19 ` Joost Kremers
@ 2020-03-03 14:39 ` Stefan Monnier
2020-03-03 15:08 ` stardiviner
1 sibling, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2020-03-03 14:39 UTC (permalink / raw)
To: help-gnu-emacs
> (let ((op-fn (lambda () (message "call the fn"))))
> (make-process
> :name "sleep command test"
> :command (list "sleep" "3")
> :filter `(lambda (proc event)
> (message "event catched!")
^^^^^^^
caught ;-)
> (funcall ,op-fn))
> :buffer "*sleep test*"))
More importantly, the ,op-fn is incorrect, it should be ',op-fn
otherwise the value contained in op-fn will be re-interpreted as an
expression (which will sometimes be harmless but sometimes not,
depending on how the function value ends up represented).
Of course, the better solution is to use `lexical-binding` so you can
just write:
(let ((op-fn (lambda () (message "call the fn"))))
(make-process
:name "sleep command test"
:command (list "sleep" "3")
:filter (lambda (proc event)
(message "event catched!")
(funcall op-fn))
:buffer "*sleep test*"))
-- Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 14:39 ` Stefan Monnier
@ 2020-03-03 15:08 ` stardiviner
2020-03-03 15:25 ` Michael Heerdegen
2020-03-03 16:49 ` Stefan Monnier
0 siblings, 2 replies; 11+ messages in thread
From: stardiviner @ 2020-03-03 15:08 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> (let ((op-fn (lambda () (message "call the fn"))))
>> (make-process
>> :name "sleep command test"
>> :command (list "sleep" "3")
>> :filter `(lambda (proc event)
>> (message "event catched!")
> ^^^^^^^
> caught ;-)
>> (funcall ,op-fn))
>> :buffer "*sleep test*"))
>
> More importantly, the ,op-fn is incorrect, it should be ',op-fn
> otherwise the value contained in op-fn will be re-interpreted as an
> expression (which will sometimes be harmless but sometimes not,
> depending on how the function value ends up represented).
>
> Of course, the better solution is to use `lexical-binding` so you can
> just write:
>
> (let ((op-fn (lambda () (message "call the fn"))))
> (make-process
> :name "sleep command test"
> :command (list "sleep" "3")
> :filter (lambda (proc event)
> (message "event catched!")
> (funcall op-fn))
> :buffer "*sleep test*"))
>
Use lexical-binding in your example, it does not work. report error:
: error in process sentinel: Symbol’s value as variable is void: op-fn [2 times]
>
> -- Stefan
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5ecugUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsPRXAgAzjfJp3dgJ7fKBf0C6flThJXqEhiL
TXrDnJ2mFehQzZO21lmMoGjy2Td6nxuGHJO7VdryhsE0b6hwaVVqbTD1TC+nvbtO
dBZ8ZiSWnbYYgLraLtOU+oFQ6ZTa+gN6ADpbm+44xMk3mL41xjgg5Nx+a4U8+poG
EDLZZNpbuQF9BjL9Bzvkb14lTMV0rOZKuRfo8+Q5VDu92rbQbk1Fkr4dDOgdc5eV
BsPXtkc+zw4PZ8Vcx+GNy52PcthAX2A0Div+TK7sfRm1FIERdQiIk1PuwEub8dT8
Z5WhZSYMjvhwFwRISm7N2K7Fj0qIwLnT/DAiWn/c0uovdNId42jivO9qYA==
=cLpZ
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 15:08 ` stardiviner
@ 2020-03-03 15:25 ` Michael Heerdegen
2020-03-03 17:34 ` stardiviner
2020-03-03 16:49 ` Stefan Monnier
1 sibling, 1 reply; 11+ messages in thread
From: Michael Heerdegen @ 2020-03-03 15:25 UTC (permalink / raw)
To: stardiviner; +Cc: help-gnu-emacs, Stefan Monnier
stardiviner <numbchild@gmail.com> writes:
> Use lexical-binding in your example, it does not work. report error:
>
> : error in process sentinel: Symbol’s value as variable is void: op-fn
> [2 times]
Note that you need to bind the buffer-local variable lexical-binding to
a non-nil value before you eval the example. Typically as file-local
variable in your source file.
Michael.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [SOLVED] Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 8:19 ` Joost Kremers
@ 2020-03-03 16:18 ` stardiviner
2020-03-03 16:51 ` Stefan Monnier
0 siblings, 1 reply; 11+ messages in thread
From: stardiviner @ 2020-03-03 16:18 UTC (permalink / raw)
To: Joost Kremers; +Cc: help-gnu-emacs
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Thanks Joost.
After reading the Info manual (even though the Info manual is not very friendly.)
I have following source code example which works great.
#+begin_src emacs-lisp
(shell-command "touch /tmp/tail.log")
(let ((proc (make-process
:name "*tail log*"
:command (list "tail" "-f" "/tmp/tail.log")
:filter (lambda (proc output)
(message "append log captured")
(let ((p (get-process "*tail log*")))
(when (buffer-live-p (process-buffer p))
(with-current-buffer (process-buffer p)
(let ((moving (= (point) (process-mark proc))))
(save-excursion
;; Insert the text, advancing the process marker.
(goto-char (process-mark proc))
(insert output)
(set-marker (process-mark proc) (point)))
(if moving (goto-char (process-mark proc))))))))
:sentinel (lambda (proc event)
(message "done!"))
:buffer "*tail log*")))
(display-buffer "*tail log*"))
#+end_src
#+RESULTS[<2020-03-04 00:15:51> 9c0b6b462a594bd21b9d5579bd9a9254a3279e62]:
: #<window 183 on *info elisp*>
Then execute following command to append content into the log file:
#+begin_src sh
for N in {0..10}; do
echo $N >> /tmp/tail.log
done
#+end_src
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5eg1IUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsOaCgf+P+aEoz8powv4LhelGuypm71n2AVK
Kmx4wNu967+Uz5pCSpKAhFhRp1ZLIOVypQ1lkpoJD/40kK/vr2GCdKAfX4XSUbqb
aIasFL6xOZE+4V9fw7BJQAqz9T5deFv46scjXsAvaUAMquP8qAd1X6EMEx2PrQ9t
u0NCqTNY4Emob1bkMtDUyfjCYZ1wno+c6mxrpyUTk0AiRLLKA/mqv7p5HdhYZQq5
vsr8Yeg/SwLPoZSQpvXorvhO3chlB1/JL7R65P+cvv+56uaEsWh/PzHRK2FCLzWA
6wI9nGsW05mKzddoNPdU2ZiNuPcwvXPFrHliRyNCR8tHtBvieKEBLqVyzA==
=Pwf1
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 15:08 ` stardiviner
2020-03-03 15:25 ` Michael Heerdegen
@ 2020-03-03 16:49 ` Stefan Monnier
2020-03-03 17:35 ` stardiviner
1 sibling, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2020-03-03 16:49 UTC (permalink / raw)
To: help-gnu-emacs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/x-markdown; coding=UTF-8, Size: 128 bytes --]
> Use lexical-binding in your example, it does not work.
What steps did you take to "Use lexical-binding"?
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [SOLVED] Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 16:18 ` [SOLVED] " stardiviner
@ 2020-03-03 16:51 ` Stefan Monnier
2020-03-03 17:33 ` stardiviner
0 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2020-03-03 16:51 UTC (permalink / raw)
To: help-gnu-emacs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/x-markdown; coding=UTF-8, Size: 320 bytes --]
> After reading the Info manual (even though the Info manual is not very friendly.)
I suggest you `M-x report-emacs-bug` describing what you found
unfriendly, so the maintainers get a chance to improve it (tho of
course, what's friendly for one user can be very hostile for another
and vice versa).
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [SOLVED] Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 16:51 ` Stefan Monnier
@ 2020-03-03 17:33 ` stardiviner
0 siblings, 0 replies; 11+ messages in thread
From: stardiviner @ 2020-03-03 17:33 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> After reading the Info manual (even though the Info manual is not very friendly.)
>
> I suggest you `M-x report-emacs-bug` describing what you found
> unfriendly, so the maintainers get a chance to improve it (tho of
> course, what's friendly for one user can be very hostile for another
> and vice versa).
>
I agree. The point I think unfriendly is where it does not have example with
:filter code example. The Info manual use other functions like
set-process-filter etc instead. Of course the Info manual already explained the
document about :filter though.
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5elPMUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsPPewgAyHFQABpeN742IEAIWGtN3GeX80/b
nMvaagfFYiJFKn2kujnbJySLk79UB/X9abiE1wQ+43vzS8QQYoHkQY2xb0sbNNlm
EskzT94qNxRMLznD6IA7yVwniodDEZXaXHE7Ncsv1CO+7zHFjiN59+SvbvYFU2JI
cyKoOGkZuYj5+uxsKKN8plliXGrjRJY1uwTHTq60kuEgTJI9o86NYVpx4Zl35u8f
mSqMaO0vhSwLuGHdDtDOOhprsjfkeGxH+/EUie8NI4MKCUINpfnRelDl+lu9tAhi
5+QD69Ep8lQmYsclOEauIsl6b3mVGa/66RfmD4QhSa4PlV3+RHRhbAE16w==
=HlNy
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 15:25 ` Michael Heerdegen
@ 2020-03-03 17:34 ` stardiviner
0 siblings, 0 replies; 11+ messages in thread
From: stardiviner @ 2020-03-03 17:34 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: help-gnu-emacs, Stefan Monnier
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Michael Heerdegen <michael_heerdegen@web.de> writes:
> stardiviner <numbchild@gmail.com> writes:
>
>> Use lexical-binding in your example, it does not work. report error:
>>
>> : error in process sentinel: Symbol’s value as variable is void: op-fn
>> [2 times]
>
> Note that you need to bind the buffer-local variable lexical-binding to
> a non-nil value before you eval the example. Typically as file-local
> variable in your source file.
>
> Michael.
Aha, I see. Thanks Michael
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5elSMUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsNI6QgAn2LZb3xR4Sir4mEMGD1VAkCtcIKz
eZLNGlYByQavcpef3yImhE2yEnVQK2V8vOHS3JyKayTQHreOSUOSREgJi/Y8M/dE
pZXiY4HYxe1O2yEBkJkDW0Kn+Dc2gccO0JSVf64GfBxQPHYLB1op9mgshu9kJMD3
gVWMKosL9VroZvKdQxDcpNi8g2PXj/WiEc50H97ixwvAhzCdJwv2TGwkPvS+1p3Z
FGdKdFTIYliWQs0FnpFPqxA00avCaCfQBsBfvSjB4M2xutxjWfEKrbbrL6E974SI
5LmVpK+DZsLQp9oGt7aawz0TiyPIHtB/fnvxHcRhB7r/H5Q3QeZuGbH4NA==
=9WPF
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [QUESTION] How to use :filter in `make-process'?
2020-03-03 16:49 ` Stefan Monnier
@ 2020-03-03 17:35 ` stardiviner
0 siblings, 0 replies; 11+ messages in thread
From: stardiviner @ 2020-03-03 17:35 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Use lexical-binding in your example, it does not work.
>
> What steps did you take to "Use lexical-binding"?
>
>
I thought the lexical-binding is the let-binding.... Sorry, misunderstood.
- --
[ stardiviner ]
I try to make every word tell the meaning what I want to express.
Blog: https://stardiviner.github.io/
IRC(freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
-----BEGIN PGP SIGNATURE-----
iQFIBAEBCAAyFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAl5elVIUHG51bWJjaGls
ZEBnbWFpbC5jb20ACgkQG13xyVromsPIVQf+MfAa8yYp2YOrhXdGnE8GhNUwLEg/
m91GPyA2zJYISpJngvTnEWYCGMS+iI5Jb+iBYMJ0ryC7QcOB2fP3sDedb44dXmsJ
5rFcs/nfrioGhFlk2Ivd13Wbm8OFrjKSxmzKgw/LV933k/MAI7+bWx4KiDGPiFwX
PwtR45ycneXj/TH1yC4323sEXBaKyEcIqrfwkvu2RVMi6nWZY6GA7mZwX80PqQgG
jPXRMvaQXE2VVQ4ynJDMAmp2fhv7s+HsjUA24vBu3ZQk6DAIdiRH+ruSAExjeNDz
hHohRYpzJOcNiI/iNlGIAiaGiauaD/GckqGsmR3HPaFY0B/Ok/ebaE7iEw==
=rTPc
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-03-03 17:35 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-03 7:49 [QUESTION] How to use :filter in `make-process'? stardiviner
2020-03-03 8:19 ` Joost Kremers
2020-03-03 16:18 ` [SOLVED] " stardiviner
2020-03-03 16:51 ` Stefan Monnier
2020-03-03 17:33 ` stardiviner
2020-03-03 14:39 ` Stefan Monnier
2020-03-03 15:08 ` stardiviner
2020-03-03 15:25 ` Michael Heerdegen
2020-03-03 17:34 ` stardiviner
2020-03-03 16:49 ` Stefan Monnier
2020-03-03 17:35 ` stardiviner
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).