“在类连接列表上调用apply函数时,”类型参数错误:stringp,cons“

时间:2013-12-10 15:42:01

标签: emacs elisp

我想在Emacs中编写一些功能,这将允许我在我当前缓冲区文件所在的目录中运行我最喜欢的编辑器和文件管理器。我不熟悉Lisp,所以这段代码可能很丑,无论如何:

(setq terminal-program "rxvt-unicode")

(defun buffer-dir-name ()
  (file-name-directory buffer-file-name))

(defun terminal-option-buffer-dir ()
  (let ((dir (format "'%s'" (buffer-dir-name))))
    `("-cd" ,dir)))

(setq terminal-option-ranger '("-e" "ranger"))

(defun run-terminal ()
  (interactive)
  (start-process "terminal" nil terminal-program) (terminal-option-buffer-dir))

;; outdated, see below
(defun run-file-manager ()
  (interactive)
  (let ((args (append (terminal-option-buffer-dir) terminal-option-ranger)))
    (message (type-of args)
    (apply 'start-process "filemanager" nil terminal-program args))))

函数run-terminal工作正常。但是当我尝试运行run-file-manager时,我遇到了以下错误:Wrong type argument: stringp, cons。为什么?文档说明append函数的返回值是一个列表,而不是缺点。


在Drew响应之后,我看到调试后run-file-manager函数有一些垃圾。现在看起来如下:

(defun run-file-manager ()
  (interactive)
  (let ((args (append (terminal-option-buffer-dir) terminal-option-ranger)))
    (apply 'start-process "filemanager" nil terminal-program args)))
;;  (apply 'start-process "filemanager" nil terminal-program '("-cd" "/opt/" "-e" "ranger"))))

现在我有另一个问题。当我调用此函数时,它什么都不做。但是如果第一次调用apply被注释而第二次被取消注释它会按预期工作:它在 / opt 目录中的终端中运行ranger。有什么想法吗?


我解决了我的问题,这与问题标题略有不同。问题是函数terminal-option-buffer-dir正在返回-cd选项,其值为'而不是/,这是urxvt所必需的。 我通过将BUFFER函数的参数start-process设置为"*Messages*"来调试它。

1 个答案:

答案 0 :(得分:2)

错误消息msg表示run-file-manager中的某些内容需要一个字符串并改为使用符号cons

message期望字符串作为其第一个参数。但是type-of会返回一个符号。在这种情况下,它返回符号cons