2010-03-17 69 views
7

我有一個程序可以發送文本到任何其他程序進行進一步分析(例如sed,grep等)。我希望它將數據發送給Emacs並在那裏進行分析。我會怎麼做? EmacsClient默認使用一個文件名,這是一個數據字符串,不是一個文件,我真的不想創建和刪除文件來發送數據到Emacs。使用EmacsClient創建一個帶文本的緩衝區

EmacsClient有一個「eval」命令行選項,讓您執行lisp代碼而不是打開的文件。有沒有一個簡單的lisp函數可以用給定的文本打開一個新的緩衝區?

編輯:我在尋找類似:

emacsclientw.exe -eval (open-new-buffer 'hello world')

和一個新的緩衝區將與字的 「hello world」 自動出現。我不知道如何設置緩衝區的名稱。希望自動編號。

回答

6

這確實你問什麼:

emacsclient -e '(open-buffer-with "some\nstuff\nhere")' 

(defun open-buffer-with (txt) 
    "create a new buffer, insert txt" 
    (pop-to-buffer (get-buffer-create (generate-new-buffer-name "something"))) 
    (insert txt)) 

很明顯,你可以自定義open-buffer-with做你想要什麼。

有一個類似的問題,你可能想看看:How do I get basic App<->Emacs integration?

+1

如果其他人在使用EmacsW32工作時遇到任何問題,我必須將雙引號換成雙引號,並且在命令內部使用雙引號:emacsclient -e「(open-buffer-與\「你好,世界\」)「 – 2010-03-17 21:20:32

+0

@OtherMichael你放入什麼工作適合我在Windows中很好,但是我從一個cygwin外殼運行。我不知道如何通過一般的DOS提示符來自定義工作 - 當我在DOS提示符下嘗試時,出現錯誤「emacsclient.exe:No socket or alternate editor」(當然,我從cygwin啓動了Emacs外殼,這可能會導致)。 – 2010-03-17 22:30:00

+0

從cygwin shell中,你啓動了EmacsW32還是cygwin emacs? – 2010-03-18 13:26:33

2

這種方法怎麼樣?

emacsclient -e ' 
    (progn 
    (pop-to-buffer (generate-new-buffer "Piped")) 
    (insert (decode-hex-string " 
    '$(perl -e 'print unpack "H*", qq("Hello, World!")' 
    )'"))) 
' 

我已經插入換行符來分解這個非常長的行用於顯示目的。

當我從終端窗口運行此命令時,在我的Emacs窗口中打開一個名爲Piped的新緩衝區,其中包含文本"Hello, World!"(帶引號)。當我再次運行它時,將打開另一個名爲Piped<2>的緩衝區,並顯示相同的文本。

十六進制轉義(可能與任何其他高級語言一樣容易完成,而不僅僅是Perl)是用於轉義引號,否則該引號將終止向(insert)提供的字符串常量。

這種方法通過命令行通過Emacsclient將文本提供給Emacs,所以非常長的輸入文本可能會給它帶來問題。一個更通用的解決方案可能能夠分解多個Emacsclient調用中的長輸入數據並將其提供給Emacs。

相關問題