假设我在 Emacs 的剪贴板(杀死环)中有一些文本。我想设置一个键盘快捷键:
在对这个文本应用某个 shell 命令后拉出文本:例如:
printf $1 | sed 's@^\\@/samba/@;s@\\@/@g'
(在这种情况下$1
是剪贴板中的文本)
我怎样才能在 Emacs 中做到这一点?
假设我在 Emacs 的剪贴板(杀死环)中有一些文本。我想设置一个键盘快捷键:
在对这个文本应用某个 shell 命令后拉出文本:例如:
printf $1 | sed 's@^\\@/samba/@;s@\\@/@g'
(在这种情况下$1
是剪贴板中的文本)
我怎样才能在 Emacs 中做到这一点?
除非 shell 命令始终相同,否则没有理由为此编写任何 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 引号内转义,因此您的原始内容\\
变为\\\\
.
也就是说,除非您的 shell 脚本特别涉及,否则我怀疑您最好直接在 Emacs 中进行所有处理,而不是将其移植到 sed。