* Run terminal command with output in current buffer @ 2021-07-16 6:43 lisa-asket 2021-07-16 6:53 ` Jean-Christophe Helary ` (2 more replies) 0 siblings, 3 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 6:43 UTC (permalink / raw) To: help-gnu-emacs How can I run a terminal command and insert the output in the current buffer? ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 6:43 Run terminal command with output in current buffer lisa-asket @ 2021-07-16 6:53 ` Jean-Christophe Helary 2021-07-16 7:07 ` Eli Zaretskii 2021-07-16 13:48 ` Emanuel Berg via Users list for the GNU Emacs text editor 2 siblings, 0 replies; 42+ messages in thread From: Jean-Christophe Helary @ 2021-07-16 6:53 UTC (permalink / raw) To: lisa-asket; +Cc: help-gnu-emacs > On Jul 16, 2021, at 15:43, lisa-asket@perso.be wrote: > > > How can I run a terminal command and insert the output in the current buffer? M-x eval-expression (shell-command COMMAND (current-buffer)) ? -- Jean-Christophe Helary @brandelune https://mac4translators.blogspot.com https://sr.ht/~brandelune/omegat-as-a-book/ ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 6:43 Run terminal command with output in current buffer lisa-asket 2021-07-16 6:53 ` Jean-Christophe Helary @ 2021-07-16 7:07 ` Eli Zaretskii 2021-07-16 9:04 ` lisa-asket 2021-07-16 11:30 ` lisa-asket 2021-07-16 13:48 ` Emanuel Berg via Users list for the GNU Emacs text editor 2 siblings, 2 replies; 42+ messages in thread From: Eli Zaretskii @ 2021-07-16 7:07 UTC (permalink / raw) To: help-gnu-emacs > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 08:43:27 +0200 (CEST) > > How can I run a terminal command and insert the output in the current buffer? "C-u M-! the command RET" See the doc string of M-! for details. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 7:07 ` Eli Zaretskii @ 2021-07-16 9:04 ` lisa-asket 2021-07-16 11:32 ` Eli Zaretskii 2021-07-16 11:30 ` lisa-asket 1 sibling, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 9:04 UTC (permalink / raw) To: Eli Zaretskii, help-gnu-emacs It guided we to this command. I wonder how to call the command from my init file, have my own function for it. (shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER) What shall I do with output-buffer ? From: Eli Zaretskii <eliz@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 09:07:21 Europe/Paris > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 08:43:27 +0200 (CEST) > > How can I run a terminal command and insert the output in the current buffer? "C-u M-! the command RET" See the doc string of M-! for details. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 9:04 ` lisa-asket @ 2021-07-16 11:32 ` Eli Zaretskii 2021-07-16 11:48 ` lisa-asket 0 siblings, 1 reply; 42+ messages in thread From: Eli Zaretskii @ 2021-07-16 11:32 UTC (permalink / raw) To: help-gnu-emacs > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 11:04:02 +0200 (CEST) > > It guided we to this command. I wonder how to call the command from my init file, have my own > function for it. > > (shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER) > > What shall I do with output-buffer ? Did you read the doc string? It answers your question quite explicitly. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 11:32 ` Eli Zaretskii @ 2021-07-16 11:48 ` lisa-asket 0 siblings, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 11:48 UTC (permalink / raw) To: Eli Zaretskii, help-gnu-emacs From: Eli Zaretskii <eliz@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 13:32:40 Europe/Paris > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 11:04:02 +0200 (CEST) > > It guided we to this command. I wonder how to call the command from my init file, have my own > function for it. > > (shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER) > > What shall I do with output-buffer ? Did you read the doc string? It answers your question quite explicitly. I can go without it, but I have put (current-buffer). ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 7:07 ` Eli Zaretskii 2021-07-16 9:04 ` lisa-asket @ 2021-07-16 11:30 ` lisa-asket 2021-07-16 11:58 ` lisa-asket 2021-07-16 13:25 ` Felix Dietrich 1 sibling, 2 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 11:30 UTC (permalink / raw) To: Eli Zaretskii, help-gnu-emacs I have progressed as follows, with the intention that I can run the following command grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . -------- (defun runcom () "docstring" (interactive) ;; grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . (cmd-excl (read-from-minibuffer "exclude: ")) (setq cmd-excl (concat " -C --exclude=\*." cmd-excl)) (cmd-incl (read-from-minibuffer "include: ")) (setq cmd-incl (concat " -C --include=\*." cmd-incl)) (cmd-cnum (read-from-minibuffer "cnum: ")) (setq cmd-cnum (concat " -C " cmd-cnum)) (cmd-ptrn (read-from-minibuffer "pattern: ")) (setq cmd (concat "grep -hir " cmd-excl cmd-incl cmd-cnum cmd-ptrn)) (shell-command cmd (current-buffer)) ) From: Eli Zaretskii <eliz@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 09:07:21 Europe/Paris > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 08:43:27 +0200 (CEST) > > How can I run a terminal command and insert the output in the current buffer? "C-u M-! the command RET" See the doc string of M-! for details. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 11:30 ` lisa-asket @ 2021-07-16 11:58 ` lisa-asket 2021-07-16 15:14 ` Felix Dietrich 2021-07-16 13:25 ` Felix Dietrich 1 sibling, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 11:58 UTC (permalink / raw) To: lisa-asket, Eli Zaretskii, help-gnu-emacs I experience problem with read-from-minibuffer (cmd-excl (read-from-minibuffer "exclude: ")) Symbol's function definition is void From: lisa-asket@perso.be To: Eli Zaretskii <eliz@gnu.org>; help-gnu-emacs@gnu.org Subject: Run terminal command with output in current buffer Date: 16/07/2021 13:30:01 Europe/Paris I have progressed as follows, with the intention that I can run the following command grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . -------- (defun runcom () "docstring" (interactive) ;; grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . (cmd-excl (read-from-minibuffer "exclude: ")) (setq cmd-excl (concat " -C --exclude=\*." cmd-excl)) (cmd-incl (read-from-minibuffer "include: ")) (setq cmd-incl (concat " -C --include=\*." cmd-incl)) (cmd-cnum (read-from-minibuffer "cnum: ")) (setq cmd-cnum (concat " -C " cmd-cnum)) (cmd-ptrn (read-from-minibuffer "pattern: ")) (setq cmd (concat "grep -hir " cmd-excl cmd-incl cmd-cnum cmd-ptrn)) (shell-command cmd (current-buffer)) ) From: Eli Zaretskii <eliz@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 09:07:21 Europe/Paris > From: lisa-asket@perso.be > Date: Fri, 16 Jul 2021 08:43:27 +0200 (CEST) > > How can I run a terminal command and insert the output in the current buffer? "C-u M-! the command RET" See the doc string of M-! for details. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 11:58 ` lisa-asket @ 2021-07-16 15:14 ` Felix Dietrich 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 15:22 ` lisa-asket 0 siblings, 2 replies; 42+ messages in thread From: Felix Dietrich @ 2021-07-16 15:14 UTC (permalink / raw) Cc: help-gnu-emacs lisa-asket@perso.be writes: > I experience problem with read-from-minibuffer > > > (cmd-excl (read-from-minibuffer "exclude: ")) Assign values to variables by using “setq”. Values can be arbitrary expressions: (setq cmd-excl "value") (setq cmd-excl (read-from-minibuffer "exclude: ")) If you write “(cmd-excl…” the lisp interpreter will try to call a function “cmd-excl”. You can declare local variables with “let”: (let (cmd-excl cmd-incl) (setq cmd-excl "value")) Values can be declared and assigned to at the same time: (let ((cmd-excl "value") cmd-incl) cmd-excl) There is also “let*”: (let ((cmd-excl "value") (cmd-incl cmd-excl)) ; can access cmd-excl here already ; because of let* cmd-incl) -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 15:14 ` Felix Dietrich @ 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 15:44 ` lisa-asket 2021-07-19 0:42 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-16 15:22 ` lisa-asket 1 sibling, 2 replies; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 15:21 UTC (permalink / raw) To: help-gnu-emacs > You can declare local variables with “let”: > > (let (cmd-excl cmd-incl) > (setq cmd-excl "value")) Please don't. Use (let ((cmd-excl "value") cmd-incl) instead. [ This is less code to write, simpler code for the reader, simpler code for the compiler, and even marginally more efficient. ] Only use `setq` when you really want that variable to contain different values at different times. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 15:44 ` lisa-asket 2021-07-16 16:32 ` Felix Dietrich 2021-07-16 16:36 ` Run " Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 0:42 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 2 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 15:44 UTC (permalink / raw) To: monnier, help-gnu-emacs Thanks, I am using the following code But when using `shell-command` I have to wait until the command is executed before it gets displayed in the buffer. Can I make it print as it is executing ? (shell-command cmd (current-buffer)) -------- (defun runcom () "docstring" (interactive) ;; grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . (let ( (cmd-excl (read-from-minibuffer "exclude: ")) (cmd-incl (read-from-minibuffer "include: ")) (cmd-cnum (read-from-minibuffer "cnum: ")) (cmd-ptrn (read-from-minibuffer "pattern: ")) (cmd-dpth (read-from-minibuffer "dpth: ")) cmd ) (setq cmd-excl (concat " --exclude=\\*." cmd-excl)) (setq cmd-incl (concat " --include=\\*." cmd-incl)) (setq cmd-cnum (concat " -C " cmd-cnum)) (setq cmd (concat "grep -hir" cmd-excl cmd-incl cmd-cnum " " cmd-ptrn " " cmd-dpth)) (message "%s" cmd) (shell-command cmd (current-buffer))) ) From: Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 17:21:08 Europe/Paris > You can declare local variables with “let”: > > (let (cmd-excl cmd-incl) > (setq cmd-excl "value")) Please don't. Use (let ((cmd-excl "value") cmd-incl) instead. [ This is less code to write, simpler code for the reader, simpler code for the compiler, and even marginally more efficient. ] Only use `setq` when you really want that variable to contain different values at different times. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 15:44 ` lisa-asket @ 2021-07-16 16:32 ` Felix Dietrich 2021-07-16 17:00 ` lisa-asket 2021-07-16 16:36 ` Run " Stefan Monnier via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 42+ messages in thread From: Felix Dietrich @ 2021-07-16 16:32 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be writes: > But when using `shell-command` I have to wait until the command is > executed before it gets displayed in the buffer. Can I make it print > as it is executing ? Reread the docstring of “shell-command”! There you will find: “If COMMAND ends in ‘&’, execute it asynchronously. The output appears in the buffer ‘*Async Shell Command*’. That buffer is in shell mode. You can also use ‘async-shell-command’ that automatically adds ‘&’.” -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buffer 2021-07-16 16:32 ` Felix Dietrich @ 2021-07-16 17:00 ` lisa-asket 2021-07-16 19:35 ` Felix Dietrich 0 siblings, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 17:00 UTC (permalink / raw) To: Felix Dietrich, help-gnu-emacs Many thanks, I just did not follow what asynchronously meant. Can one assign default values when `read-from-minibuffer` in empty? From: Felix Dietrich <felix.dietrich@sperrhaken.name> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 18:32:00 Europe/Paris lisa-asket@perso.be writes: > But when using `shell-command` I have to wait until the command is > executed before it gets displayed in the buffer. Can I make it print > as it is executing ? Reread the docstring of “shell-command”! There you will find: “If COMMAND ends in ‘&’, execute it asynchronously. The output appears in the buffer ‘*Async Shell Command*’. That buffer is in shell mode. You can also use ‘async-shell-command’ that automatically adds ‘&’.” -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-16 17:00 ` lisa-asket @ 2021-07-16 19:35 ` Felix Dietrich 2021-07-16 19:48 ` lisa-asket 2021-07-19 1:10 ` terminal command with output in current buffer Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 2 replies; 42+ messages in thread From: Felix Dietrich @ 2021-07-16 19:35 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be writes: > Many thanks, I just did not follow what asynchronously meant. Fair enough. > Can one assign default values when `read-from-minibuffer` in empty? “read-from-minibuffer” as well as the functions suggested by Stefan Monnier (“read-number”, “read-string”, …) have a parameter DEFAULT or DEFAULT-VALUE (or similar) that you may use for that purpose; read their documentation. You may also check the return value of “read-from-minibuffer” or “read-string” and act accordingly: (let ((read-result (read-from-minibuffer "Prompt: "))) (if (seq-empty-p read-result) (setq read-result "default-value"))) See also: <https://www.gnu.org/software/emacs/manual/html_node/eintr/if.html> -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buffer 2021-07-16 19:35 ` Felix Dietrich @ 2021-07-16 19:48 ` lisa-asket 2021-07-16 21:58 ` Felix Dietrich 2021-07-19 1:10 ` terminal command with output in current buffer Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 19:48 UTC (permalink / raw) To: Felix Dietrich, help-gnu-emacs I am getting a small problem when using `(cmd-cnum (read-number "context: "))` Wrong type argument: sequencep, 8 From: Felix Dietrich <felix.dietrich@sperrhaken.name> To: help-gnu-emacs@gnu.org Subject: Re: terminal command with output in current buffer Date: 16/07/2021 21:35:05 Europe/Paris lisa-asket@perso.be writes: > Many thanks, I just did not follow what asynchronously meant. Fair enough. > Can one assign default values when `read-from-minibuffer` in empty? “read-from-minibuffer” as well as the functions suggested by Stefan Monnier (“read-number”, “read-string”, …) have a parameter DEFAULT or DEFAULT-VALUE (or similar) that you may use for that purpose; read their documentation. You may also check the return value of “read-from-minibuffer” or “read-string” and act accordingly: (let ((read-result (read-from-minibuffer "Prompt: "))) (if (seq-empty-p read-result) (setq read-result "default-value"))) See also: <https://www.gnu.org/software/emacs/manual/html_node/eintr/if.html> -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-16 19:48 ` lisa-asket @ 2021-07-16 21:58 ` Felix Dietrich 2021-07-17 5:58 ` lisa-asket 2021-07-17 9:09 ` terminal command with output in current buff lisa-asket 0 siblings, 2 replies; 42+ messages in thread From: Felix Dietrich @ 2021-07-16 21:58 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be writes: > I am getting a small problem when using `(cmd-cnum (read-number "context: "))` > > Wrong type argument: sequencep, 8 Could you provide more context? If you are trying to use ‘seq-empty-p’ with the result of ‘read-number’: that does not work because the result of ‘read-number’ is a number not a sequence (which a string as returned by ‘read-from-minibuffer’ is). -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buffer 2021-07-16 21:58 ` Felix Dietrich @ 2021-07-17 5:58 ` lisa-asket 2021-07-17 9:09 ` terminal command with output in current buff lisa-asket 1 sibling, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-17 5:58 UTC (permalink / raw) To: Felix Dietrich, help-gnu-emacs From: Felix Dietrich <felix.dietrich@sperrhaken.name> To: help-gnu-emacs@gnu.org Subject: Re: terminal command with output in current buffer Date: 16/07/2021 23:58:51 Europe/Paris lisa-asket@perso.be writes: > I am getting a small problem when using `(cmd-cnum (read-number "context: "))` > > Wrong type argument: sequencep, 8 Could you provide more context? If you are trying to use ‘seq-empty-p’ with the result of ‘read-number’: that does not work because the result of ‘read-number’ is a number not a sequence (which a string as returned by ‘read-from-minibuffer’ is). Right, this is what I have (cmd-cnum (read-number "context: " 8)) (cmd-temp `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) (cmd (concat (mapconcat #'shell-quote-argument cmd-temp " ") " " cmd-path)) ) ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buff 2021-07-16 21:58 ` Felix Dietrich 2021-07-17 5:58 ` lisa-asket @ 2021-07-17 9:09 ` lisa-asket 2021-07-17 9:19 ` lisa-asket 1 sibling, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-17 9:09 UTC (permalink / raw) To: Felix Dietrich, help-gnu-emacs Thought the following could solve the problem, but was not so. (cmd-cnum (write-to-string (read-number "context: " 8))) (cmd-temp `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) From: Felix Dietrich <felix.dietrich@sperrhaken.name> To: help-gnu-emacs@gnu.org Subject: Re: terminal command with output in current buffer Date: 16/07/2021 23:58:51 Europe/Paris lisa-asket@perso.be writes: > I am getting a small problem when using `(cmd-cnum (read-number "context: "))` > > Wrong type argument: sequencep, 8 Could you provide more context? If you are trying to use ‘seq-empty-p’ with the result of ‘read-number’: that does not work because the result of ‘read-number’ is a number not a sequence (which a string as returned by ‘read-from-minibuffer’ is). -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buff 2021-07-17 9:09 ` terminal command with output in current buff lisa-asket @ 2021-07-17 9:19 ` lisa-asket 2021-07-17 11:33 ` Felix Dietrich 0 siblings, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-17 9:19 UTC (permalink / raw) To: lisa-asket, Felix Dietrich, help-gnu-emacs number-to-string seems to be what is required (cmd-cnum (number-to-string (read-number "context: " 8))) (cmd-temp `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) After selecting wy search pattern and storing it in `cmd-ptrn`, how can I highlight the pattern when tho grep results are being transferred to the current buffer ? From: lisa-asket@perso.be To: Felix Dietrich <felix.dietrich@sperrhaken.name>; help-gnu-emacs@gnu.org Subject: terminal command with output in current buff Date: 17/07/2021 11:09:02 Europe/Paris Thought the following could solve the problem, but was not so. (cmd-cnum (write-to-string (read-number "context: " 8))) (cmd-temp `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) From: Felix Dietrich <felix.dietrich@sperrhaken.name> To: help-gnu-emacs@gnu.org Subject: Re: terminal command with output in current buffer Date: 16/07/2021 23:58:51 Europe/Paris lisa-asket@perso.be writes: > I am getting a small problem when using `(cmd-cnum (read-number "context: "))` > > Wrong type argument: sequencep, 8 Could you provide more context? If you are trying to use ‘seq-empty-p’ with the result of ‘read-number’: that does not work because the result of ‘read-number’ is a number not a sequence (which a string as returned by ‘read-from-minibuffer’ is). -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buff 2021-07-17 9:19 ` lisa-asket @ 2021-07-17 11:33 ` Felix Dietrich 0 siblings, 0 replies; 42+ messages in thread From: Felix Dietrich @ 2021-07-17 11:33 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be writes: > I am getting a small problem when using `(cmd-cnum (read-number "context: "))` > > Wrong type argument: sequencep, 8 Please provide, if possible, small self-contained examples that reproduce your problem and more context around your snippets: I had to hunt for the context in your past messages. Here is a simplified version of your code that causes the problem and serves as an example of what I mean by “self-contained example”: (let* ((cmd-cnum (read-number "Number: ")) (cmd-temp `("grep" ,cmd-cnum)) ;; same as: (cmd-temp (list "grep" cmd-cnum)) (mapconcat #'shell-quote-argument cmd-temp " ")) > number-to-string seems to be what is required Anyway you have found a solution to your problem. Let me just add a short explanation in case the issue is not entirely clear to you yet: ‘shell-quote-argument’ works on strings; when you map over a list, you apply the function on each element of the list and collect the results. Therefore, in your call to ‘mapconcat’ the function ‘shell-quote-argument’ will eventually be passed the value of ‘cmd-cnum’, which you have inserted into the list. Examples that do not work: (shell-quote-argument 5) ⇒ Wrong type argument: sequencep, 5 (mapconcat #'shell-quote-argument '(5) " ") ⇒ Wrong type argument: sequencep, 5 (mapconcat #'shell-quote-argument '("grep" 5) " ") ⇒ Wrong type argument: sequencep, 5 (mapconcat #'shell-quote-argument '(5 "grep") " ") ⇒ Wrong type argument: sequencep, 5 > After selecting wy search pattern and storing it in `cmd-ptrn`, how > can I highlight the pattern when tho grep results are being > transferred to the current buffer ? Now itʼs getting complicated and I couldnʼt give you an answer of the of my head: look into adding text properties [1] to strings and at process filters [2]. How could you identify the information elements grep puts on each line and their position? It will probably also be insightful to look at how the Emacs command “M-x grep” [3] is implemented. Footnotes: [1] <https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Props-and-Strings.html> [2] <https://www.gnu.org/software/emacs/manual/html_node/elisp/Filter-Functions.html> [3] <https://www.gnu.org/software/emacs/manual/html_node/emacs/Grep-Searching.html> -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-16 19:35 ` Felix Dietrich 2021-07-16 19:48 ` lisa-asket @ 2021-07-19 1:10 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-20 12:55 ` terminal command with output in current buffer Felix Dietrich 1 sibling, 2 replies; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 1:10 UTC (permalink / raw) To: help-gnu-emacs Felix Dietrich wrote: > (let ((read-result (read-from-minibuffer "Prompt: "))) > (if (seq-empty-p read-result) > (setq read-result "default-value"))) What? :P `setq' again... (let*((read-result (read-from-minibuffer "Prompt: ")) (value (if (string= "" read-result) "default-value" read-result) )) value) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-19 1:10 ` terminal command with output in current buffer Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 23:12 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-20 12:05 ` ‘read-string’ over ‘read-from-minibuffer’ Felix Dietrich 2021-07-20 12:55 ` terminal command with output in current buffer Felix Dietrich 1 sibling, 2 replies; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-19 4:54 UTC (permalink / raw) To: help-gnu-emacs > (let*((read-result (read-from-minibuffer "Prompt: ")) Please don't use `read-from-minibuffer` unless you're defining a `read-<foo>` function. Use `read-string` instead. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-19 23:12 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-20 12:05 ` ‘read-string’ over ‘read-from-minibuffer’ Felix Dietrich 1 sibling, 0 replies; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 23:12 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier via Users list for the GNU Emacs text editor wrote: >> (let*((read-result (read-from-minibuffer "Prompt: ")) > > Please don't use `read-from-minibuffer` unless you're > defining a `read-<foo>` function. Use `read-string` instead. OK, thanks, 5 places to fix... I wonder what the last function, "replace-regexp-1" is supposed to do, what the -1 means, and what sets it apart from what should be there already, is what I'm thinking ... or am I wrong? ;; in https://dataswamp.org/~incal/emacs-init/edit.el ... (defun insert-string-centered (str &optional width) (interactive (list (read-string "string: ") (read-number "width: " (window-text-width) ) )) (let*((span (if (and width (< 0 width)) width (window-text-width))) (str-len (length str)) (pad (- (/ (- span str-len) 2) (if (zerop (mod str-len 2)) 1 0) )) (pad-str (make-string pad ?\s)) ) (insert pad-str str) )) (defalias 'isc #'insert-string-centered) ;; https://dataswamp.org/~incal/emacs-init/time-cmp.el (defun dope (from boxes pills dose) (interactive (list (read-string "from: " (format-time-string "%F")) (read-number "boxes: ") (read-number "pills/box: " 50) (read-number "pills/day: " 6) )) (let*((days (/ (* boxes pills) dose)) (done (time-add (date-to-time (format "%sT00:00+01:00" from)) (days-to-time (1- days)) )) (str (format-time-string "%F" done)) (more (format-time-string "%F" (time-add done (days-to-time -10)))) ) (insert (format "%s [%s] %s" from more str) ))) ;; https://dataswamp.org/~incal/emacs-init/sort-incal.el (defun sort-line-words (beg end &optional set-delim) (interactive "r\nP") (let*((str (region-to-string)) (delim-str (when set-delim (read-string "delimiter: "))) (str-list (split-string str delim-str)) (sorted (erc-sort-strings str-list)) ) (kill-region beg end) (if set-delim (progn (dolist (s (nreverse (cdr (nreverse sorted)))) (insert (format "%s%s" s delim-str))) (insert (format "%s" (car (last sorted))))) (insert-string-list sorted) ))) ;; https://dataswamp.org/~incal/emacs-init/latex.el (defun replace-regexp-1 (regexp to-string &optional beg end) (interactive `(,(read-string "regexp: ") ,(read-string "to string: ") ,@(if (use-region-p) (list (region-beginning) (region-end)) (list (point-min) (point-max))) )) (let ((beg-set (or beg (point-min))) (end-set (or end (point-max))) ) (save-excursion (goto-char end-set) (while (re-search-backward regexp beg-set t) (replace-match to-string) )))) (defalias 'rr #'replace-regexp-1) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* ‘read-string’ over ‘read-from-minibuffer’ 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 23:12 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-20 12:05 ` Felix Dietrich 2021-07-20 15:11 ` Stefan Monnier via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 42+ messages in thread From: Felix Dietrich @ 2021-07-20 12:05 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier <monnier@iro.umontreal.ca> writes: >> (let*((read-result (read-from-minibuffer "Prompt: ")) > > Please don't use `read-from-minibuffer` unless you're defining > a `read-<foo>` function. > Use `read-string` instead. Could you elaborate? I see that ‘read-string’ ensures that there is no ‘minibuffer-completion-table’ set, which is relevant for recursive minibuffers, if I understand itʼs comment correctly. Anything else one should be wary about? -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: ‘read-string’ over ‘read-from-minibuffer’ 2021-07-20 12:05 ` ‘read-string’ over ‘read-from-minibuffer’ Felix Dietrich @ 2021-07-20 15:11 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-20 15:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-20 15:11 UTC (permalink / raw) To: help-gnu-emacs Felix Dietrich [2021-07-20 14:05:03] wrote: > Stefan Monnier <monnier@iro.umontreal.ca> writes: >>> (let*((read-result (read-from-minibuffer "Prompt: ")) >> Please don't use `read-from-minibuffer` unless you're defining >> a `read-<foo>` function. >> Use `read-string` instead. > > Could you elaborate? `read-from-minibuffer` is the function designed as the core of `read-string`, `read-number`, `completing-read`, and friends. If you want to write such a `read-<foo>` function, then `read-from-minibuffer` is for you. If you want to just read a *string*, then `read-string` is what you should use. It doesn't behave very differently from `read-from-minibuffer`, but it makes your code's intentions more clear. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: ‘read-string’ over ‘read-from-minibuffer’ 2021-07-20 15:11 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-20 15:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-20 15:46 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier via Users list for the GNU Emacs text editor wrote: > `read-from-minibuffer` is the function designed as the core > of `read-string`, `read-number`, `completing-read`, > and friends. > > If you want to write such a `read-<foo>` function, then > `read-from-minibuffer` is for you. > > If you want to just read a *string*, then `read-string` is > what you should use. It doesn't behave very differently from > `read-from-minibuffer`, but it makes your code's intentions > more clear. Yes, we understand, it is not meant to be used directly from Lisp in general but only from the type-specific functions, however what happens is that you stumble upon it, test it and it works, and then use it. Maybe the byte compiler can tell you not to use it? (Can you make it not say the same when used correctly/as intended?) The docstring for `read-from-minibuffer', tho very long, it does not mention either `read-string' or `read-number', actually putting this information there might not help for the most part since the impression is straightforward (which is good!) and after testing it and seeing that it works as expected, people will be even less inclined to read that long doc string. But, if you put it there, at least you can yank that part from the docstring into a post like this so the "elaborating" part will be faster :P -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-19 1:10 ` terminal command with output in current buffer Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-20 12:55 ` Felix Dietrich 2021-07-20 18:15 ` Yuri Khan 1 sibling, 1 reply; 42+ messages in thread From: Felix Dietrich @ 2021-07-20 12:55 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes: > Felix Dietrich wrote: > >> (let ((read-result (read-from-minibuffer "Prompt: "))) >> (if (seq-empty-p read-result) >> (setq read-result "default-value"))) > > What? :P `setq' again... > > (let*((read-result (read-from-minibuffer "Prompt: ")) > (value (if (string= "" read-result) > "default-value" > read-result) )) > value) This is whatʼs bothering you the most? ;) I have reread the part of the elisp manual about reading text from the minibuffer, and it suggests one “do all minibuffer input as part of reading the arguments for a command, in the ‘interactive’ specification.” [1] Not directly applicable to a stand-alone let snippet but relevant in the context of the thread (which involved reading user input for an interactive command). Footnotes: [1] (info "(elisp) Text from Minibuffer") -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: terminal command with output in current buffer 2021-07-20 12:55 ` terminal command with output in current buffer Felix Dietrich @ 2021-07-20 18:15 ` Yuri Khan 2021-07-20 18:23 ` lisa-asket 0 siblings, 1 reply; 42+ messages in thread From: Yuri Khan @ 2021-07-20 18:15 UTC (permalink / raw) To: Felix Dietrich; +Cc: help-gnu-emacs On Tue, 20 Jul 2021 at 20:07, Felix Dietrich <felix.dietrich@sperrhaken.name> wrote: > This is whatʼs bothering you the most? ;) I have reread the part of the > elisp manual about reading text from the minibuffer, and it suggests one > “do all minibuffer input as part of reading the arguments for a command, > in the ‘interactive’ specification.” What’s bothering *me* in this thread is that we still don’t know the *actual problem* lisa-asket is trying to solve (as opposed to fragments of an envisioned solution). ^ permalink raw reply [flat|nested] 42+ messages in thread
* terminal command with output in current buffer 2021-07-20 18:15 ` Yuri Khan @ 2021-07-20 18:23 ` lisa-asket 0 siblings, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-20 18:23 UTC (permalink / raw) To: Yuri Khan, Felix Dietrich; +Cc: help-gnu-emacs From: Yuri Khan <yuri.v.khan@gmail.com> To: Felix Dietrich <felix.dietrich@sperrhaken.name> Subject: Re: terminal command with output in current buffer Date: 20/07/2021 20:15:53 Europe/Paris Cc: help-gnu-emacs <help-gnu-emacs@gnu.org> On Tue, 20 Jul 2021 at 20:07, Felix Dietrich <felix.dietrich@sperrhaken.name> wrote: > This is whatʼs bothering you the most? ;) I have reread the part of the > elisp manual about reading text from the minibuffer, and it suggests one > “do all minibuffer input as part of reading the arguments for a command, > in the ‘interactive’ specification.” What’s bothering *me* in this thread is that we still don’t know the *actual problem* lisa-asket is trying to solve (as opposed to fragments of an envisioned solution). The problem has been solved, but then others continued discussing some intricacies and observations, which is fine with me. ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 15:44 ` lisa-asket 2021-07-16 16:32 ` Felix Dietrich @ 2021-07-16 16:36 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 17:24 ` lisa-asket 2021-07-16 18:04 ` lisa-asket 1 sibling, 2 replies; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 16:36 UTC (permalink / raw) To: help-gnu-emacs > (let ( (cmd-excl (read-from-minibuffer "exclude: ")) > (cmd-incl (read-from-minibuffer "include: ")) > (cmd-cnum (read-from-minibuffer "cnum: ")) > (cmd-ptrn (read-from-minibuffer "pattern: ")) > (cmd-dpth (read-from-minibuffer "dpth: ")) > cmd ) > > (setq cmd-excl (concat " --exclude=\\*." cmd-excl)) > (setq cmd-incl (concat " --include=\\*." cmd-incl)) > (setq cmd-cnum (concat " -C " cmd-cnum)) > > (setq cmd (concat "grep -hir" cmd-excl cmd-incl > cmd-cnum " " cmd-ptrn " " cmd-dpth)) > (message "%s" cmd) > (shell-command cmd (current-buffer))) ) I'd probably write this as something like: (let* ((cmd-excl (concat "--exclude=*." (read-string "exclude: "))) (cmd-incl (concat "--include=*." (read-string "include: "))) (cmd-cnum (read-string "cnum: ")) (cmd-ptrn (read-string "pattern: ")) (cmd-dpth (read-string "dpth: ")) (cmd1 `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) (cmd (concat (mapconcat #'shell-quote-argument cmd1 " ") " " cmd-depth))) (message "%s %s" cmd) (shell-command cmd (current-buffer))) ) Note the use of `read-string` (`read-from-minibuffer` is a low-level function used to implement `read-string`, `read-number`, `read-buffer`, `completing-read`, ...) and the use of `shell-quote-argument` to deal with quoting those parts that need it. I presumed that "dpth" is supposed to be a glob pattern, which is the only place where you actually need the shell. You could also use `file-expand-wildcards` instead so you don't need a shell at all (and hence don't need `shell-quote-argument` either) and can use `call-process` instead of `shell-command` which stops you from worrying about what happens if the users put a `|`, `;`, `$(cmd)`, or other fun stuff in dpth. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 16:36 ` Run " Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 17:24 ` lisa-asket 2021-07-16 18:01 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 18:04 ` lisa-asket 1 sibling, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 17:24 UTC (permalink / raw) To: monnier, help-gnu-emacs I use `dpth` for the directory path for grep. The search pattern regexp is `cmd-ptrn`. -------- From: Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 18:36:49 Europe/Paris > (let ( (cmd-excl (read-from-minibuffer "exclude: ")) > (cmd-incl (read-from-minibuffer "include: ")) > (cmd-cnum (read-from-minibuffer "cnum: ")) > (cmd-ptrn (read-from-minibuffer "pattern: ")) > (cmd-dpth (read-from-minibuffer "dpth: ")) > cmd ) > > (setq cmd-excl (concat " --exclude=\\*." cmd-excl)) > (setq cmd-incl (concat " --include=\\*." cmd-incl)) > (setq cmd-cnum (concat " -C " cmd-cnum)) > > (setq cmd (concat "grep -hir" cmd-excl cmd-incl > cmd-cnum " " cmd-ptrn " " cmd-dpth)) > (message "%s" cmd) > (shell-command cmd (current-buffer))) ) I'd probably write this as something like: (let* ((cmd-excl (concat "--exclude=*." (read-string "exclude: "))) (cmd-incl (concat "--include=*." (read-string "include: "))) (cmd-cnum (read-string "cnum: ")) (cmd-ptrn (read-string "pattern: ")) (cmd-dpth (read-string "dpth: ")) (cmd1 `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) (cmd (concat (mapconcat #'shell-quote-argument cmd1 " ") " " cmd-depth))) (message "%s %s" cmd) (shell-command cmd (current-buffer))) ) Note the use of `read-string` (`read-from-minibuffer` is a low-level function used to implement `read-string`, `read-number`, `read-buffer`, `completing-read`, ...) and the use of `shell-quote-argument` to deal with quoting those parts that need it. I presumed that "dpth" is supposed to be a glob pattern, which is the only place where you actually need the shell. You could also use `file-expand-wildcards` instead so you don't need a shell at all (and hence don't need `shell-quote-argument` either) and can use `call-process` instead of `shell-command` which stops you from worrying about what happens if the users put a `|`, `;`, `$(cmd)`, or other fun stuff in dpth. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 17:24 ` lisa-asket @ 2021-07-16 18:01 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 18:07 ` lisa-asket 0 siblings, 1 reply; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 18:01 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be [2021-07-16 19:24:09] wrote: > I use `dpth` for the directory path for grep. > The search pattern regexp is `cmd-ptrn`. Thanks for confirming, so I understood it right. [ I had a doubt because this part of the arguments is supposed to be a set of file names (i.e. often a glob pattern) whereas `dpth` sounded like "depth" to me. ] Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 18:01 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 18:07 ` lisa-asket 0 siblings, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 18:07 UTC (permalink / raw) To: monnier, help-gnu-emacs From: Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 20:01:51 Europe/Paris lisa-asket@perso.be [2021-07-16 19:24:09] wrote: >> I use `dpth` for the directory path for grep. >> The search pattern regexp is `cmd-ptrn`. >Thanks for confirming, so I understood it right. >[ I had a doubt because this part of the arguments is supposed to be >a set of file names (i.e. often a glob pattern) whereas `dpth` sounded >like "depth" to me. ] >Stefan Have now changed the name to be cmd-path to avoid mis-representation, ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 16:36 ` Run " Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 17:24 ` lisa-asket @ 2021-07-16 18:04 ` lisa-asket 1 sibling, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 18:04 UTC (permalink / raw) To: monnier, help-gnu-emacs Have attempted to call `read-number` for `cmd-cnum` which gets emacs to complain when I enter the value `8` for cmd-cnum. (cmd-cnum (read-number "-C ")) From: Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 18:36:49 Europe/Paris > (let ( (cmd-excl (read-from-minibuffer "exclude: ")) > (cmd-incl (read-from-minibuffer "include: ")) > (cmd-cnum (read-from-minibuffer "cnum: ")) > (cmd-ptrn (read-from-minibuffer "pattern: ")) > (cmd-dpth (read-from-minibuffer "dpth: ")) > cmd ) > > (setq cmd-excl (concat " --exclude=\\*." cmd-excl)) > (setq cmd-incl (concat " --include=\\*." cmd-incl)) > (setq cmd-cnum (concat " -C " cmd-cnum)) > > (setq cmd (concat "grep -hir" cmd-excl cmd-incl > cmd-cnum " " cmd-ptrn " " cmd-dpth)) > (message "%s" cmd) > (shell-command cmd (current-buffer))) ) I'd probably write this as something like: (let* ((cmd-excl (concat "--exclude=*." (read-string "exclude: "))) (cmd-incl (concat "--include=*." (read-string "include: "))) (cmd-cnum (read-string "cnum: ")) (cmd-ptrn (read-string "pattern: ")) (cmd-dpth (read-string "dpth: ")) (cmd1 `("grep" "-hir" ,cmd-excl ,cmd-incl "-C" ,cmd-cnum ,cmd-ptrn)) (cmd (concat (mapconcat #'shell-quote-argument cmd1 " ") " " cmd-depth))) (message "%s %s" cmd) (shell-command cmd (current-buffer))) ) Note the use of `read-string` (`read-from-minibuffer` is a low-level function used to implement `read-string`, `read-number`, `read-buffer`, `completing-read`, ...) and the use of `shell-quote-argument` to deal with quoting those parts that need it. I presumed that "dpth" is supposed to be a glob pattern, which is the only place where you actually need the shell. You could also use `file-expand-wildcards` instead so you don't need a shell at all (and hence don't need `shell-quote-argument` either) and can use `call-process` instead of `shell-command` which stops you from worrying about what happens if the users put a `|`, `;`, `$(cmd)`, or other fun stuff in dpth. Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 15:44 ` lisa-asket @ 2021-07-19 0:42 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-19 4:49 ` Stefan Monnier via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 0:42 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier via Users list for the GNU Emacs text editor wrote: > Only use `setq` when you really want that variable to > contain different values at different times. How do you do it when you compute a value as part of a loop? We just saw it with binary-search, so let's use that as example. OK, so they use `setf', not `setq' (set function, not set function quote - ?) That's better, really? Not in that sense at least? (defun binary-search (value array) (let ((low 0) (high (1- (length array)))) (cl-do () ((< high low) nil) (let ((middle (floor (+ low high) 2))) (cond ((> (aref array middle) value) (setf high (1- middle))) ((< (aref array middle) value) (setf low (1+ middle))) (t (cl-return middle))))))) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-19 0:42 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 4:49 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 20:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 42+ messages in thread From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-19 4:49 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg via Users list for the GNU Emacs text editor [2021-07-19 02:42:44] wrote: > Stefan Monnier via Users list for the GNU Emacs text editor wrote: >> Only use `setq` when you really want that variable to >> contain different values at different times. > How do you do it when you compute a value as part of a loop? AFAICT in your case you do want the variable(s) to contain different values at different times. > We just saw it with binary-search, so let's use that as example. OK, > so they use `setf', not `setq' (set function, not set function > quote - ?) `setf` and `setq` are basically the same thing here. BTW, if you really do want to avoid `setq` (and hence `setf` as well), you can of course do it, using recursion: (defun binary-search (value array) (cl-labels ((loop (low high) (let ((middle (floor (+ low high) 2))) (cond ((> (aref array middle) value) (loop low (1- middle))) ((< (aref array middle) value) (loop (1+ middle) high)) (t (cl-return middle)))))) (loop 0 (1- (length array))))) -- Stefan ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-19 4:49 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-19 20:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-19 20:51 UTC (permalink / raw) To: help-gnu-emacs Stefan Monnier via Users list for the GNU Emacs text editor wrote: > AFAICT in your case you do want the variable(s) to contain > different values at different times. You know there is one and only one correct value that you are supposed to use in the program, only to compute that you use a loop, so the "you do want the variable(s) to contain different values at different times" is only true in terms of the computation of the final value, if you follow. But maybe that qualifies? > `setf` and `setq` are basically the same thing here. I know right? > BTW, if you really do want to avoid `setq` (and hence `setf` > as well), you can of course do it, using recursion: Yes, but maybe you really do want to avoid that even more... Nah, I think `setq' in loops are the exception that confirms the other rule, that one should only use it for global vars. And when should you use global vars? When they already exist :) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 15:14 ` Felix Dietrich 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-07-16 15:22 ` lisa-asket 1 sibling, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 15:22 UTC (permalink / raw) To: Felix Dietrich; +Cc: help-gnu-emacs Thanks, have put it in `let`. From: Felix Dietrich <felix.dietrich@sperrhaken.name> Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 17:14:36 Europe/Paris Cc: help-gnu-emacs@gnu.org lisa-asket@perso.be writes: > I experience problem with read-from-minibuffer > > > (cmd-excl (read-from-minibuffer "exclude: ")) Assign values to variables by using “setq”. Values can be arbitrary expressions: (setq cmd-excl "value") (setq cmd-excl (read-from-minibuffer "exclude: ")) If you write “(cmd-excl…” the lisp interpreter will try to call a function “cmd-excl”. You can declare local variables with “let”: (let (cmd-excl cmd-incl) (setq cmd-excl "value")) Values can be declared and assigned to at the same time: (let ((cmd-excl "value") cmd-incl) cmd-excl) There is also “let*”: (let ((cmd-excl "value") (cmd-incl cmd-excl)) ; can access cmd-excl here already ; because of let* cmd-incl) -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 11:30 ` lisa-asket 2021-07-16 11:58 ` lisa-asket @ 2021-07-16 13:25 ` Felix Dietrich 1 sibling, 0 replies; 42+ messages in thread From: Felix Dietrich @ 2021-07-16 13:25 UTC (permalink / raw) To: help-gnu-emacs lisa-asket@perso.be writes: > ;; grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . > > (cmd-excl (read-from-minibuffer "exclude: ")) > (setq cmd-excl (concat " -C --exclude=\*." cmd-excl)) > > (cmd-incl (read-from-minibuffer "include: ")) > (setq cmd-incl (concat " -C --include=\*." cmd-incl)) The backslash is special in Emacs strings, and you need to escape it with an extra backslash if you want it to be part of the string. Compare the strings inserted by these two commands: (insert "\*") ; This will insert just ‘*’. (insert "\\*") ; This will insert ‘\*’. In front of certain characters, the backlash translates these characters into other characters [1][2]. Characters preceded by a backslash that are not known “escape sequences” stand for themselves; this is the case for ‘*’, and that is why you need to double the backslash. Similarly, you may need to escape characters for the shell in the string read from the minibuffer: have a look at the function “shell-quote-argument”. Is the first string to “concat” missing a space at itʼs end? If this isnʼt an exercise for fun or otherwise: you can call grep from within Emacs using the command “M-x grep”. Footnotes: [1] (elisp) Basic Char Syntax <https://www.gnu.org/software/emacs/manual/html_node/elisp/Basic-Char-Syntax.html> [2] (elisp) Syntax for Strings <https://www.gnu.org/software/emacs/manual/html_node/elisp/Syntax-for-Strings.html> -- Felix Dietrich ^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: Run terminal command with output in current buffer 2021-07-16 6:43 Run terminal command with output in current buffer lisa-asket 2021-07-16 6:53 ` Jean-Christophe Helary 2021-07-16 7:07 ` Eli Zaretskii @ 2021-07-16 13:48 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-16 14:28 ` lisa-asket 2 siblings, 1 reply; 42+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-16 13:48 UTC (permalink / raw) To: help-gnu-emacs lisa-asket wrote: > How can I run a terminal command and insert the output in > the current buffer? (shell-command "ls" t) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 13:48 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-07-16 14:28 ` lisa-asket 2021-07-16 15:06 ` lisa-asket 0 siblings, 1 reply; 42+ messages in thread From: lisa-asket @ 2021-07-16 14:28 UTC (permalink / raw) To: moasenwood, help-gnu-emacs I am getting some problem reading from the minibuffer with this command (cmd-excl (read-from-minibuffer "exclude: ")) From: Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 15:48:52 Europe/Paris lisa-asket wrote: > How can I run a terminal command and insert the output in > the current buffer? (shell-command "ls" t) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
* Run terminal command with output in current buffer 2021-07-16 14:28 ` lisa-asket @ 2021-07-16 15:06 ` lisa-asket 0 siblings, 0 replies; 42+ messages in thread From: lisa-asket @ 2021-07-16 15:06 UTC (permalink / raw) To: lisa-asket, moasenwood, help-gnu-emacs I have done the following, which should work. But `shell-command` does not seem to run. -------- (defun runcom () "docstring" (interactive) ;; grep -hir --exclude=\*.el --include=\*.{org,texi} -C 8 "node-gnu-fdl" . (let ( cmd (cmd-excl (read-from-minibuffer "exclude: ")) (cmd-incl (read-from-minibuffer "include: ")) (cmd-cnum (read-from-minibuffer "cnum: ")) (cmd-ptrn (read-from-minibuffer "pattern: ")) (cmd-dpth (read-from-minibuffer "dpth: ")) ) (setq cmd-excl (concat " --exclude=\\*." cmd-excl)) (setq cmd-incl (concat " --include=\\*." cmd-incl)) (setq cmd-cnum (concat " -C " cmd-cnum)) (setq cmd (concat "grep -hir" cmd-excl cmd-incl cmd-cnum " " cmd-ptrn " " cmd-dpth)) (message "%s" cmd) (shell-command cmd (current-buffer)) )) From: lisa-asket@perso.be To: moasenwood@zoho.eu; help-gnu-emacs@gnu.org Subject: Run terminal command with output in current buffer Date: 16/07/2021 16:28:58 Europe/Paris I am getting some problem reading from the minibuffer with this command (cmd-excl (read-from-minibuffer "exclude: ")) From: Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> To: help-gnu-emacs@gnu.org Subject: Re: Run terminal command with output in current buffer Date: 16/07/2021 15:48:52 Europe/Paris lisa-asket wrote: > How can I run a terminal command and insert the output in > the current buffer? (shell-command "ls" t) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 42+ messages in thread
end of thread, other threads:[~2021-07-20 18:23 UTC | newest] Thread overview: 42+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-07-16 6:43 Run terminal command with output in current buffer lisa-asket 2021-07-16 6:53 ` Jean-Christophe Helary 2021-07-16 7:07 ` Eli Zaretskii 2021-07-16 9:04 ` lisa-asket 2021-07-16 11:32 ` Eli Zaretskii 2021-07-16 11:48 ` lisa-asket 2021-07-16 11:30 ` lisa-asket 2021-07-16 11:58 ` lisa-asket 2021-07-16 15:14 ` Felix Dietrich 2021-07-16 15:21 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 15:44 ` lisa-asket 2021-07-16 16:32 ` Felix Dietrich 2021-07-16 17:00 ` lisa-asket 2021-07-16 19:35 ` Felix Dietrich 2021-07-16 19:48 ` lisa-asket 2021-07-16 21:58 ` Felix Dietrich 2021-07-17 5:58 ` lisa-asket 2021-07-17 9:09 ` terminal command with output in current buff lisa-asket 2021-07-17 9:19 ` lisa-asket 2021-07-17 11:33 ` Felix Dietrich 2021-07-19 1:10 ` terminal command with output in current buffer Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-19 4:54 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 23:12 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-20 12:05 ` ‘read-string’ over ‘read-from-minibuffer’ Felix Dietrich 2021-07-20 15:11 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-20 15:46 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-20 12:55 ` terminal command with output in current buffer Felix Dietrich 2021-07-20 18:15 ` Yuri Khan 2021-07-20 18:23 ` lisa-asket 2021-07-16 16:36 ` Run " Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 17:24 ` lisa-asket 2021-07-16 18:01 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-16 18:07 ` lisa-asket 2021-07-16 18:04 ` lisa-asket 2021-07-19 0:42 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-19 4:49 ` Stefan Monnier via Users list for the GNU Emacs text editor 2021-07-19 20:51 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-16 15:22 ` lisa-asket 2021-07-16 13:25 ` Felix Dietrich 2021-07-16 13:48 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-07-16 14:28 ` lisa-asket 2021-07-16 15:06 ` lisa-asket
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).