From: Jean Louis <bugs@gnu.support>
To: Eli Zaretskii <eliz@gnu.org>
Cc: help-gnu-emacs@gnu.org
Subject: Re: Maybe we can improve this function call-process-to-string?
Date: Thu, 8 Apr 2021 14:53:18 +0300 [thread overview]
Message-ID: <YG7urrw7N03SFNZj@protected.localdomain> (raw)
In-Reply-To: <83a6q99pnd.fsf@gnu.org>
Dear Eli,
Thanks, I will be more using `shell-quote-argument' in those
`shell-command' functions.
> > it is better to use
> > `call-process'. Yet there is no function `call-process-to-string',
> > which I have made as below.
>
> Why do you need such a command? Emacs can copy text between buffers,
> so you don't need to cons a string to insert it into another buffer.
In a function in this example I need to verify image size, sometimes
hundreds of image sizes:
(defun wrs-markdown-image-identify-size (image-file)
"Returns the width and height in format =WIDTHxHEIGHT for discount markdown"
(let ((command (format "identify -format '=%%wx%%h' %s" image-file)))
(shell-command-to-string command)))
Different version is here:
(defun image-dimension (file)
"Returns list of width and height of the image"
(when (rcd-which "identify")
(let* ((dimensions (call-process-to-string "identify" nil nil "-format" "%w %h" file)))
(mapcar 'string-to-number (split-string dimensions)))))
I can improve the first version:
(defun wrs-markdown-image-identify-size (image-file)
"Returns the width and height in format =WIDTHxHEIGHT for discount markdown"
(let* ((image-file (shell-quote-argument image-file))
(command (format "identify -format '=%%wx%%h' %s" image-file)))
(shell-command-to-string command)))
(wrs-markdown-image-identify-size "/home/data1/protected/Media/Pictures/'Screenshot from 2021-03-11 08-59-\"34\".png'") ⇒ "=1280x800"
It seems that it will handle complicated file names. Function
`shell-quote-argument' is good to be implemented everywhere it is
needed.
> In general, one should avoid strings in Emacs Lisp, because buffer
> memory is handled much more efficiently than string memory.
I understand the concept, not at all how to practically run a system
command and receive it as a string. There is either
`shell-command-to-string' or `call-process' which can write to buffer.
If it writes to buffer and I need that information I have to change to
buffer, get information and return it back as string.
> > Is there maybe some other function that can give me string from
> > buffer?
>
> buffer-substring?
Because none of `buffer-substring' nor `buffer-string' can specify the
buffer name then I have to switch temporarily to other buffer, get
string with `buffer-string' and return back. I was thinking there is
some function doing that straight, like (buffer-string BUFFER), but I
don't find such.
I have made this one:
(defun buffer-to-string (buffer)
"Return `buffer-string' for specified BUFFER."
(let ((current-buffer (current-buffer)))
(switch-to-buffer buffer)
(let ((output (buffer-substring-no-properties (point-min) (point-max))))
(switch-to-buffer current-buffer)
output)))
Then this works:
(buffer-to-string (get-buffer "*scratch*"))
Then I can improve this function:
(defun call-process-to-string (program &optional infile display &rest args)
(let* ((buffer-name "RCD Emacs Lisp output")
(buffer (generate-new-buffer buffer-name))
(status (apply #'call-process program infile buffer display args))
(current-buffer (current-buffer))
(output (buffer-to-string buffer)))
(kill-buffer buffer)
output))
Yet not sure if it is best way.
Jean
Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns
Sign an open letter in support of Richard M. Stallman
https://rms-support-letter.github.io/
next prev parent reply other threads:[~2021-04-08 11:53 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-08 7:40 Maybe we can improve this function call-process-to-string? Jean Louis
2021-04-08 7:55 ` Eli Zaretskii
2021-04-08 11:53 ` Jean Louis [this message]
2021-04-08 13:39 ` Eli Zaretskii
2021-04-08 15:56 ` Jean Louis
2021-04-08 16:25 ` Eli Zaretskii
2021-04-08 18:17 ` Jean Louis
2021-04-08 18:36 ` Eli Zaretskii
2021-04-08 18:44 ` Jean Louis
2021-04-08 17:18 ` Arthur Miller
2021-04-08 18:32 ` Jean Louis
2021-04-08 19:41 ` Arthur Miller
2021-04-09 8:52 ` Jean Louis
2021-04-09 10:07 ` tomas
2021-04-08 13:08 ` Michael Albinus
2021-04-08 15:50 ` Jean Louis
2021-04-08 17:49 ` Stefan Monnier
2021-04-08 18:33 ` Jean Louis
2021-04-08 18:40 ` Jean Louis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YG7urrw7N03SFNZj@protected.localdomain \
--to=bugs@gnu.support \
--cc=eliz@gnu.org \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.