Emacs のクリップボード (キル リング) にテキストがあるとします。次のようなキーボード ショートカットを設定したいと思います。
このテキストに特定のシェルコマンドを適用した後、テキストをヤンクします: 例:
printf $1 | sed 's@^\\@/samba/@;s@\\@/@g'
(この場合$1
、クリップボード内のテキストになります)
Emacsでこれを行うにはどうすればよいですか?
Emacs のクリップボード (キル リング) にテキストがあるとします。次のようなキーボード ショートカットを設定したいと思います。
このテキストに特定のシェルコマンドを適用した後、テキストをヤンクします: 例:
printf $1 | sed 's@^\\@/samba/@;s@\\@/@g'
(この場合$1
、クリップボード内のテキストになります)
Emacsでこれを行うにはどうすればよいですか?
シェル コマンドが常に同じでない限り、このために elisp を記述する理由はありません。
C-yC-uM-| sed 's@^\\@/samba/@;s@\\@/@g'
RET
こちらがジェネリックshell-command-on-string
(defun shell-command-on-str (cmd &optional str)
"Insert result of calling CMD with STR as input.
STR is current-kill if unspecified.
"
(interactive (list (read-shell-command "Shell command on region: ")))
(setq str (or str
(current-kill 0)))
(insert (with-temp-buffer
(insert str)
(shell-command-on-region (point-min) (point-max) cmd nil 'replace)
(buffer-string))))
それを使用する独自の関数を定義できます。
(defun my-sed-on-kill ()
(interactive)
(shell-command-on-str "sed 's@^\\@/samba/@;s@\\@/@g'"))
質問に直接答えるには、Emacs を利用できますshell-command-on-region
。
(defun sed-yank ()
"Yank the kill ring, then run sed on it"
(interactive)
(yank)
(shell-command-on-region (point)
(mark)
"sed 's@^\\\\@/samba/@;s@\\\\@/@g'"
(current-buffer)
t))
「sed ...」行には、任意のコマンドを入れることができます。問題は、バックスラッシュを elisp 引用符内でエスケープする必要があるため、オリジナル\\
が\\\\
.
とはいえ、シェル スクリプトが特に関与しない限り、すべての処理を sed に任せるよりも、Emacs で直接実行した方がよいと思います。