[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20626: Wishlist: M-x shell-command-on-rectangle-region
From: |
Juri Linkov |
Subject: |
bug#20626: Wishlist: M-x shell-command-on-rectangle-region |
Date: |
Tue, 16 Jun 2015 00:45:27 +0300 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (x86_64-pc-linux-gnu) |
>> 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))'
- bug#20626: Wishlist: M-x shell-command-on-rectangle-region,
Juri Linkov <=