[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.