1

假设我在 Emacs 的剪贴板(杀死环)中有一些文本。我想设置一个键盘快捷键:

在对这个文本应用某个 shell 命令后拉出文本:例如:

   printf $1 | sed 's@^\\@/samba/@;s@\\@/@g'

(在这种情况下$1是剪贴板中的文本)

我怎样才能在 Emacs 中做到这一点?

4

3 回答 3

5

除非 shell 命令始终相同,否则没有理由为此编写任何 elisp:

C-yC-uM-| sed 's@^\\@/samba/@;s@\\@/@g' RET

于 2013-03-29T00:37:07.670 回答
3

这是一个通用的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'"))
于 2013-03-29T00:31:35.473 回答
1

要直接回答您的问题,您可以利用 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。

于 2013-03-28T22:13:14.740 回答