1

Emacs のクリップボード (キル リング) にテキストがあるとします。次のようなキーボード ショートカットを設定したいと思います。

このテキストに特定のシェルコマンドを適用した後、テキストをヤンクします: 例:

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

(この場合$1、クリップボード内のテキストになります)

Emacsでこれを行うにはどうすればよいですか?

4

3 に答える 3

5

シェル コマンドが常に同じでない限り、このために 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 引用符内でエスケープする必要があるため、オリジナル\\\\\\.

とはいえ、シェル スクリプトが特に関与しない限り、すべての処理を sed に任せるよりも、Emacs で直接実行した方がよいと思います。

于 2013-03-28T22:13:14.740 に答える