Создание нового буфера с текстом с использованием EmacsClient - PullRequest
7 голосов
/ 17 марта 2010

У меня есть программа, которая может отправлять текст в любую другую программу для дальнейшего анализа (например, sed, grep и т. Д.). Я хотел бы отправить данные в Emacs и провести там анализ. Как бы я это сделал? EmacsClient принимает имя файла по умолчанию, это строка данных, а не файл, и я действительно не хочу создавать и удалять файлы только для отправки данных в Emacs.

EmacsClient имеет параметр командной строки "eval", который позволяет вам выполнять код lisp вместо открытых файлов. Есть ли простая функция lisp, которая откроет новый буфер с заданным текстом?

Редактировать: я ищу что-то вроде:

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

И новый буфер автоматически появится со словом «привет мир». Я не уверен, как будет установлено имя буфера. Надеюсь, что-нибудь пронумеровано автоматически.

Ответы [ 2 ]

6 голосов
/ 17 марта 2010

Это делает то, что вы просите:

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, чтобы делать то, что вы хотите.

Есть похожий вопрос, на который вы, возможно, захотите посмотреть: Как мне получить базовую интеграцию App <-> Emacs? .

2 голосов
/ 17 марта 2010

Как насчет этого подхода?

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).

Этот подход передает текст в Emacs через Emacsclient из командной строки, поэтому очень длинный вводимый текст может вызвать проблемы. Более общее решение может быть в состоянии разбить длинные входные данные и передать их в Emacs через несколько вызовов Emacsclient.

...