【问题标题】:Elisp how to write current coordinates to bufferElisp如何将当前坐标写入缓冲区
【发布时间】:2012-11-20 21:27:01
【问题描述】:

所以我有这个功能,它可以让我选择文本的开始和结束位置

(defun start-end (pos1 pos2)
 "…"
  (interactive "r")
  ; …
  (message "start: %d. end: %d." pos1 pos2)
)

现在我想写入名为“result”的其他文件缓冲区(如果不存在,则创建缓冲区),例如:

 pos1,pos2,param1,param2

param1,param2 应该在 cmd 行中询问。我该如何做到这一点?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    尝试类似:

    (defun start-end (pos1 pos2 param1 param2)
      (interactive "r\nsParam1: \nsParam2: ")
      (message "%d,%d,%s,%s" pos1 pos2 param1 param2))
    

    interactive 支持一系列不同的输入形式。您可以用换行符分隔它们:s 以使用多个。事实上,您可以提供一个表达式而不是一个字符串,执行它来执行任何交互操作。

    编辑:

    要创建缓冲区,您可以使用以下内容,它允许您使用所有标准打印功能在新缓冲区中插入任何内容:

    (defun start-end (pos1 pos2 param1 param2)
      (interactive "r\nsParam1: \nsParam2: ")
      (with-output-to-temp-buffer "*Result*"
        (princ (format "%d,%d,%s,%s" pos1 pos2 param1 param2))))
    

    【讨论】:

    • @Zdanozdan,请参阅答案中的补充内容。
    【解决方案2】:

    这里是创建缓冲区的代码(如果它不存在),然后将你想要的文本附加到它:

    (defun start-end (pos1 pos2)
      (interactive "nStart: \nnEnd: ")
      (switch-to-buffer (get-buffer-create "*start-end*"))
      (goto-char (point-max))
      (insert (format "start: %d. end: %d.\n" pos1 pos2)))
    

    【讨论】:

    • 如果您不想在迷你缓冲区和*messages* 中显示信息,您可以使用format 而不是message
    • 引用 switch-to-buffer 的文档字符串:“警告:这不是在 Lisp 程序中临时处理另一个缓冲区的方法!请改用set-buffer。这样可以避免弄乱窗口-缓冲对应关系。”。通常,您最好使用with-current-buffer,而不是set-buffer
    • @Moritz:是的,我应该使用格式,忘记更改了。
    • @Stefan 我不知道你从哪里得到的文本,但它不在我的 emacs (24.1.1) 中的函数帮助中。我会使用 with-current-buffer 但此代码在完成后会切换到缓冲区。由提出问题的人选择他们喜欢的行为。
    • @justinhj:确实,警告是从 24.1 意外删除的。它会在 24.3 回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多