ardggy's blog

Esc - Meta - Alt - Ctrl - Shift

shell-command-on-region で置換する

バッファに 1 + 1 と書いておいて、2 で置換できないかと思ったのでトライ。 置換処理はむしろ外部にまかせたい。vim における '<,'>! である。

C-u M-| CMD <RET> を使えばいけそうであるが、リージョン末尾が改行でない場合に、コマンドが受け付けてくれない場合がある。 実際、1 + 1 をリージョンにして、bc にわたすと parse error となる。

であれば、コマンドに渡す前に改行をつけて、結果を受け取る前に最終行の改行をはずせばなんとかなるかもしれない。

C-u M-| (cat; echo) | bc | perl -pe 'chomp if eof' <RET>

うまくはいくが、さすがに毎回これをタイプするのは面倒なので、下のような advice を書いてやる。

(defadvice shell-command-on-region (before shell-command-on-region-like-vim activate)
  (let* ((command-format "(cat; echo) | %s | perl -pe 'chomp if eof'")
         (new-command (format command-format (ad-get-arg 2))))
    (ad-set-arg 2 new-command)))

f:id:ardggy:20180921023042g:plain