emacs-devel
[Top][All Lists]
Advanced

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

Re: A function to take the regexp-matched subsring directly


From: Philip Kaludercic
Subject: Re: A function to take the regexp-matched subsring directly
Date: Sun, 30 Oct 2022 17:26:48 +0000

daanturo <daanturo@gmail.com> writes:

> On 30/10/2022 22:45, Philip Kaludercic wrote:
>> Is there a reason you find yourself working with strings as opposed to
>> buffers?  I've seen people try to force functional paradigms on Emacs
>> when they do stuff like creating a list of lines in a buffer then
>> iterating over these instead of using the (faster) buffer searching
>> mechanisms.  My worry is that functions like these, while useful per se,
>> might make more people inclined to write unideomatic and wasteful code.
>
>
> In my case, strings are usually file names and shell command outputs
>
> ```elisp
>
> ;; Get the commit hash returned by git blame
>
> (shell-command-to-string "git blame -L 1,1 -- README")
>
> "19dcb237b5b (Eli Zaretskii 2022-01-01 02:45:51 -0500 1) Copyright (C) 
> 2001-2022 Free Software Foundation, Inc.
> "
>
> ;; parse:
> (regexp-match "^[^ ]+"
> "19dcb237b5b (Eli Zaretskii 2022-01-01 02:45:51 -0500 1) Copyright (C) 
> 2001-2022 Free Software Foundation, Inc.
> ")
> => "19dcb237b5b"

I would argue that this is more robust (though more verbose)

--8<---------------cut here---------------start------------->8---
(with-temp-buffer
  (call-process "git" nil t nil "blame" "-L1,1" "--" "README")
  (goto-char (point-min))
  (if (looking-at "\\`[[:alnum:]]+")
      (match-string 0)
    'some-other-value))
--8<---------------cut here---------------end--------------->8---

>
> ;; From `vc-revision-other-window''s file name, find the original name and 
> the revision
> (regexp-match*
>     "\\(.*?\\)\\(?:\\.~\\(.*?\\)~\\)?\\'"
>     "/foo/bar.el.~main~")
>     
> => ("/foo/bar.el.~main~" "/foo/bar.el" "main")

And the file-name-* functions ought to be used here instead.

> ```
>
>
> And many possible cases where the strings maybe buffer names or any not so 
> long
> strings that are not the size of a buffer.

What do you mean by "size of a buffer"?  Come to think of it, a macro
like `with-string-as-buffer' would be a good addition, to make it easier
to use the text editing functionality instead of string handling.



reply via email to

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