help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Maybe we can improve this function call-process-to-string?


From: Jean Louis
Subject: Re: Maybe we can improve this function call-process-to-string?
Date: Thu, 8 Apr 2021 18:56:30 +0300
User-agent: Mutt/2.0.6 (2021-03-06)

* Eli Zaretskii <eliz@gnu.org> [2021-04-08 16:40]:
> > Date: Thu, 8 Apr 2021 14:53:18 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: help-gnu-emacs@gnu.org
> > 
> > > 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.
> 
> Why do you need a string?  The string is a means to an end, right?
> What is that end?

Hahaha, I am not sure if you are joking, but of course string is a
mean to an end... funny. Now, I need it for example, to get widht and
height from a image by using system command `identify', sometimes I
will extract GPS coordinate from an image, so I call system commands
from Emacs Lisp that processes bunch of images.

For example, to quickly construct a Markdown hyperlink to the image
below, I enter the Dired and do M-x md-image-hyperlink

  /home/data1/protected/public_html/gnu.support/images/1536:
  total used in directory 304K available 42.4 GiB
  -rw-r--r-- 1 173K Oct  8  2016 2016-10-08-23:12:44.jpg
  -rw-r--r-- 1 125K Mar 18  2017 gnu-head-large.jpg

With this result:

[![https://gnu.support/images/1536/gnu-head-large.jpg](https://gnu.support/images/1536/gnu-head-large.jpg
 =1536x1024 
"https://gnu.support/images/1536/gnu-head-large.jpg";)](https://gnu.support/images/1536/gnu-head-large.jpg
 "https://gnu.support/images/1536/gnu-head-large.jpg";)

That is where `shell-command-to-string' comes handy, and HTML pages
meant for Discount flavor of markdown can be generated.

(defun md-image-hyperlink ()
  (interactive)
  (let ((files (dired-get-marked-files))
        (list '()))
    (dolist (file files)
      (let* ((small-image (public-html-rest file))
             (large-image (replace-regexp-in-string 
"/320/\\|/400/\\|/640/\\|/800/" "/1536/" small-image))
             (command (format "identify -format '[![%s](%s =%%wx%%h \"%s\")](%s 
\"%s\")' '%s'" small-image small-image small-image large-image large-image 
file)))
        (message "%s" command)
        (push (shell-command-to-string command) list)))
    (kill-new (with-temp-buffer
                (dolist (item list)
                  (insert item))
                (buffer-string)))))

> > 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 suggest to look up with-current-buffer and with-temp-buffer.

I would not know how to get output from system command by using those
functions without using shell-command-to-string or call-process

Jean



reply via email to

[Prev in Thread] Current Thread [Next in Thread]