* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
[not found] <1119163948.10099018.1432245074823.JavaMail.zimbra@comcast.net>
@ 2015-05-21 22:04 ` asparagus
2015-05-21 22:47 ` Juri Linkov
0 siblings, 1 reply; 12+ messages in thread
From: asparagus @ 2015-05-21 22:04 UTC (permalink / raw)
To: 20626
Wishlist:
M-x shell-command-on-rectangle-region
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-05-21 22:04 ` bug#20626: Wishlist: M-x shell-command-on-rectangle-region asparagus
@ 2015-05-21 22:47 ` Juri Linkov
2015-06-15 21:45 ` Juri Linkov
0 siblings, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-05-21 22:47 UTC (permalink / raw)
To: asparagus; +Cc: 20626
> Wishlist:
> M-x shell-command-on-rectangle-region
As you can see in bug#20070, the effort to make commands rectangleable
had stalled some time ago due to the need to decide how to handle
backward-compatibility of the existing region arguments, e.g. in
(shell-command-on-region START END COMMAND &optional OUTPUT-BUFFER REPLACE
ERROR-BUFFER DISPLAY-ERROR-BUFFER)
how to send the boundaries of the rectangular region in START and END.
One idea is to handle it like recently we handled backward-compatibility
for saving dired positions in saveplace.el where we used a new format like
("~" (dired-filename . "~/.emacs.d/places"))
Using something like this means sending the rectangular bounds
either in START or END in the new format like
(rect (1 . 2) (3 . 4))
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-05-21 22:47 ` Juri Linkov
@ 2015-06-15 21:45 ` Juri Linkov
2015-06-22 22:37 ` Juri Linkov
0 siblings, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-06-15 21:45 UTC (permalink / raw)
To: asparagus; +Cc: 20626
>> Wishlist:
>> M-x shell-command-on-rectangle-region
>
> As you can see in bug#20070, the effort to make commands rectangleable
> had stalled some time ago due to the need to decide how to handle
> backward-compatibility of the existing region arguments, e.g. in
>
> (shell-command-on-region START END COMMAND &optional OUTPUT-BUFFER REPLACE
> ERROR-BUFFER DISPLAY-ERROR-BUFFER)
>
> how to send the boundaries of the rectangular region in START and END.
>
> One idea is to handle it like recently we handled backward-compatibility
> for saving dired positions in saveplace.el where we used a new format like
>
> ("~" (dired-filename . "~/.emacs.d/places"))
>
> Using something like this means sending the rectangular bounds
> either in START or END in the new format like
>
> (rect (1 . 2) (3 . 4))
Sorry, I was wrong. I realized now that query-replace has quite
a different requirement. query-replace needs rectangular boundaries
to limit the search for replacements, whereas shell-command-on-region
should extract the rectangular region as strings and replace it with
the result of the command. Here is a working prototype that demonstrates
its possible implementation:
(define-advice shell-command-on-region
(:around (orig-fun start end command
&optional output-buffer replace
error-buffer display-error-buffer))
(if (and (boundp 'rectangle-mark-mode) rectangle-mark-mode)
(let ((input (mapconcat 'identity (delete-extract-rectangle start end) "\n"))
output)
(with-temp-buffer
(insert input)
(call-process-region (point-min) (point-max)
shell-file-name t t
nil shell-command-switch
command)
(setq output (split-string (buffer-string) "\n")))
(goto-char start)
(insert-rectangle output))
(funcall orig-fun start end command
output-buffer replace
error-buffer display-error-buffer)))
This is another case to take into account when designing the interface,
i.e. in this case the list of boundaries in the arg START is not necessary,
and I have no idea how to avoid `(if (and (boundp 'rectangle-mark-mode)
rectangle-mark-mode))'
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-15 21:45 ` Juri Linkov
@ 2015-06-22 22:37 ` Juri Linkov
2015-06-23 2:02 ` Stefan Monnier
0 siblings, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-06-22 22:37 UTC (permalink / raw)
To: asparagus; +Cc: 20626
> Sorry, I was wrong. I realized now that query-replace has quite
> a different requirement. query-replace needs rectangular boundaries
> to limit the search for replacements, whereas shell-command-on-region
> should extract the rectangular region as strings and replace it with
> the result of the command. Here is a working prototype that demonstrates
> its possible implementation:
>
> (define-advice shell-command-on-region
> (:around (orig-fun start end command
> &optional output-buffer replace
> error-buffer display-error-buffer))
> (if (and (boundp 'rectangle-mark-mode) rectangle-mark-mode)
> (let ((input (mapconcat 'identity (delete-extract-rectangle start end) "\n"))
> output)
> (with-temp-buffer
> (insert input)
> (call-process-region (point-min) (point-max)
> shell-file-name t t
> nil shell-command-switch
> command)
> (setq output (split-string (buffer-string) "\n")))
> (goto-char start)
> (insert-rectangle output))
> (funcall orig-fun start end command
> output-buffer replace
> error-buffer display-error-buffer)))
>
> This is another case to take into account when designing the interface,
> i.e. in this case the list of boundaries in the arg START is not necessary,
> and I have no idea how to avoid `(if (and (boundp 'rectangle-mark-mode)
> rectangle-mark-mode))'
For example, the command ‘kill-ring-save’ has the signature
kill-ring-save (beg end &optional region)
with an additional boolean arg for the region.
And ‘rectangle--extract-region’ contains a condition
that checks for ‘rectangle-mark-mode’.
Combining these two prerequisites we could do a similar thing in
‘shell-command-on-region’ by adding a new arg and using it in the
function body:
diff --git a/lisp/simple.el b/lisp/simple.el
index 1868077..d022504 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3274,7 +3278,8 @@
(defun shell-command-on-region (start end command
&optional output-buffer replace
- error-buffer display-error-buffer)
+ error-buffer display-error-buffer
+ region)
"Execute string COMMAND in inferior shell with region as input.
Normally display output (if any) in temp buffer `*Shell Command Output*';
Prefix arg means replace the region with it. Return the exit code of
@@ -3337,7 +3342,8 @@ (defun shell-command-on-region (start end command
current-prefix-arg
current-prefix-arg
shell-command-default-error-buffer
- t)))
+ t
+ rectangle-mark-mode)))
(let ((error-file
(if error-buffer
(make-temp-file
@@ -3346,6 +3352,18 @@ (defun shell-command-on-region (start end command
temporary-file-directory)))
nil))
exit-status)
+ (if region
+ (let ((input (mapconcat 'identity (delete-extract-rectangle start end) "\n"))
+ output)
+ (with-temp-buffer
+ (insert input)
+ (call-process-region (point-min) (point-max)
+ shell-file-name t t
+ nil shell-command-switch
+ command)
+ (setq output (split-string (buffer-string) "\n")))
+ (goto-char start)
+ (insert-rectangle output))
(if (or replace
(and output-buffer
(not (or (bufferp output-buffer) (stringp output-buffer)))))
@@ -3435,7 +3453,7 @@ (defun shell-command-on-region (start end command
exit-status output))))
;; Don't kill: there might be useful info in the undo-log.
;; (kill-buffer buffer)
- ))))
+ )))))
(when (and error-file (file-exists-p error-file))
(if (< 0 (nth 7 (file-attributes error-file)))
^ permalink raw reply related [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-22 22:37 ` Juri Linkov
@ 2015-06-23 2:02 ` Stefan Monnier
2015-06-23 22:59 ` Juri Linkov
0 siblings, 1 reply; 12+ messages in thread
From: Stefan Monnier @ 2015-06-23 2:02 UTC (permalink / raw)
To: Juri Linkov; +Cc: 20626, asparagus
> (defun shell-command-on-region (start end command
> &optional output-buffer replace
> - error-buffer display-error-buffer)
> + error-buffer display-error-buffer
> + region)
> "Execute string COMMAND in inferior shell with region as input.
> Normally display output (if any) in temp buffer `*Shell Command Output*';
> Prefix arg means replace the region with it. Return the exit code of
> @@ -3337,7 +3342,8 @@ (defun shell-command-on-region (start end command
> current-prefix-arg
> current-prefix-arg
> shell-command-default-error-buffer
> - t)))
> + t
> + rectangle-mark-mode)))
Doesn't make sense: if the value determine the use of rectangles, the
arg shouldn't be called `region' but something like `rectangle'.
Notice how kill-ring-save takes a `region' argument and doesn't have any
rectangle-specific code.
I still believe that shell-command-on-region should not have
rectangle-specific code. The current `region-extract-function' does let
you extract the region (rectangular or not) in order to pass it to
a shell command. So you don't need any rectangle-specific code for that
part of shell-command-on-region.
OTOH There is indeed some functionality missing there to let you insert
the output in a rectangular way (whatever that means).
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-23 2:02 ` Stefan Monnier
@ 2015-06-23 22:59 ` Juri Linkov
2015-06-23 23:50 ` Stefan Monnier
0 siblings, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-06-23 22:59 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 20626, asparagus
> I still believe that shell-command-on-region should not have
> rectangle-specific code. The current `region-extract-function' does let
> you extract the region (rectangular or not) in order to pass it to
> a shell command. So you don't need any rectangle-specific code for that
> part of shell-command-on-region.
> OTOH There is indeed some functionality missing there to let you insert
> the output in a rectangular way (whatever that means).
‘shell-command-on-region’ currently relies on the call to
(call-process-region start end shell-file-name replace ...
but I'm not sure if ‘call-process-region’ is not too low level
to handle rectangular regions. Otherwise, there should be a condition
in ‘shell-command-on-region’ to check for a rectangular region and
insert the output accordingly, so I see no way to avoid checking for
‘rectangle-mark-mode’ in ‘shell-command-on-region’.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-23 22:59 ` Juri Linkov
@ 2015-06-23 23:50 ` Stefan Monnier
2015-06-24 22:27 ` Juri Linkov
2015-06-25 22:30 ` Juri Linkov
0 siblings, 2 replies; 12+ messages in thread
From: Stefan Monnier @ 2015-06-23 23:50 UTC (permalink / raw)
To: Juri Linkov; +Cc: 20626, asparagus
> in ‘shell-command-on-region’ to check for a rectangular region and
> insert the output accordingly, so I see no way to avoid checking for
> ‘rectangle-mark-mode’ in ‘shell-command-on-region’.
In any case checking specifically for a rectangular region is wrong.
Having a "fast-path" for the case of a simple contiguous region is fine,
but the "slow&complex" path is not just for rectangular regions:
the code should also work with a region made up of various
arbitrary chunks (there's currently no package that provides this
feature, but that's no excuse).
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-23 23:50 ` Stefan Monnier
@ 2015-06-24 22:27 ` Juri Linkov
2015-06-25 3:45 ` Stefan Monnier
2015-06-25 22:30 ` Juri Linkov
1 sibling, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-06-24 22:27 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 20626, asparagus
>> in ‘shell-command-on-region’ to check for a rectangular region and
>> insert the output accordingly, so I see no way to avoid checking for
>> ‘rectangle-mark-mode’ in ‘shell-command-on-region’.
>
> In any case checking specifically for a rectangular region is wrong.
> Having a "fast-path" for the case of a simple contiguous region is fine,
> but the "slow&complex" path is not just for rectangular regions:
> the code should also work with a region made up of various
> arbitrary chunks (there's currently no package that provides this
> feature, but that's no excuse).
Then what about adding a new arg REGION to ‘shell-command-on-region’
and other region-sensitive commands that will provide the region
configuration including information about region type and region shape,
e.g. a list in the form ‘(rectangle …)’. Then the command's body
will check the car of the arg REGION and act accordingly depending
on the region shape.
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-24 22:27 ` Juri Linkov
@ 2015-06-25 3:45 ` Stefan Monnier
0 siblings, 0 replies; 12+ messages in thread
From: Stefan Monnier @ 2015-06-25 3:45 UTC (permalink / raw)
To: Juri Linkov; +Cc: 20626, asparagus
> e.g. a list in the form ‘(rectangle …)’. Then the command's body
> will check the car of the arg REGION and act accordingly depending
> on the region shape.
Same difference. It'd still have rectangle-specific code.
Instead it should call something like region-extract-function to do what
it needs to do and *this* thing will have rectangle-specific code (via
something like an add-function in rect.el).
IIUC the current region-extract-function doesn't satisfy all the needs
of shell-command-on-region, so either it will have to be extended again,
or we have to add more region-<foo>-function or equivalent methods.
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-23 23:50 ` Stefan Monnier
2015-06-24 22:27 ` Juri Linkov
@ 2015-06-25 22:30 ` Juri Linkov
2015-06-26 1:53 ` Stefan Monnier
1 sibling, 1 reply; 12+ messages in thread
From: Juri Linkov @ 2015-06-25 22:30 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 20626, asparagus
> In any case checking specifically for a rectangular region is wrong.
> Having a "fast-path" for the case of a simple contiguous region is fine,
> but the "slow&complex" path is not just for rectangular regions:
> the code should also work with a region made up of various
> arbitrary chunks (there's currently no package that provides this
> feature, but that's no excuse).
It's more-less clear how to write code for the "slow&complex" path
using the existing ‘region-extract-function’ and a new function like
‘region-insert-function’ like I demonstrated with define-advice
for shell-command-on-region in the beginning of this thread (where
specific ‘insert-rectangle’ should be replaced with ‘region-insert-function’).
What is not clear is how to distinguish "slow&complex" from the "fast-path"?
Maybe with a new arg REGION?
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-25 22:30 ` Juri Linkov
@ 2015-06-26 1:53 ` Stefan Monnier
2015-06-30 20:44 ` Juri Linkov
0 siblings, 1 reply; 12+ messages in thread
From: Stefan Monnier @ 2015-06-26 1:53 UTC (permalink / raw)
To: Juri Linkov; +Cc: 20626, asparagus
> What is not clear is how to distinguish "slow&complex" from the "fast-path"?
> Maybe with a new arg REGION?
I thought it would be pretty easy: if region-extract-function returns
a single contiguous chunk or multiple chunks.
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#20626: Wishlist: M-x shell-command-on-rectangle-region
2015-06-26 1:53 ` Stefan Monnier
@ 2015-06-30 20:44 ` Juri Linkov
0 siblings, 0 replies; 12+ messages in thread
From: Juri Linkov @ 2015-06-30 20:44 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 20626, asparagus
forcemerge 19829 20626
thanks
>> What is not clear is how to distinguish "slow&complex" from the "fast-path"?
>> Maybe with a new arg REGION?
>
> I thought it would be pretty easy: if region-extract-function returns
> a single contiguous chunk or multiple chunks.
‘query-replace’ will use the same design, so merged it with bug#19829
where I posted a composite patch.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2015-06-30 20:44 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1119163948.10099018.1432245074823.JavaMail.zimbra@comcast.net>
2015-05-21 22:04 ` bug#20626: Wishlist: M-x shell-command-on-rectangle-region asparagus
2015-05-21 22:47 ` Juri Linkov
2015-06-15 21:45 ` Juri Linkov
2015-06-22 22:37 ` Juri Linkov
2015-06-23 2:02 ` Stefan Monnier
2015-06-23 22:59 ` Juri Linkov
2015-06-23 23:50 ` Stefan Monnier
2015-06-24 22:27 ` Juri Linkov
2015-06-25 3:45 ` Stefan Monnier
2015-06-25 22:30 ` Juri Linkov
2015-06-26 1:53 ` Stefan Monnier
2015-06-30 20:44 ` Juri Linkov
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.