all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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/




  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.