【问题标题】:Emacs `dired` error when renaming file using Helm: `apply` wrong number of arguments使用 Helm 重命名文件时 Emacs `dired` 错误:`apply` 参数数量错误
【发布时间】:2018-08-28 07:36:39
【问题描述】:

我不经常使用dired 模式,但正在尝试练习一下。所以我创建了一些空的练习文本文件,并用通常的快捷键标记它们。然后我尝试使用“R”命令重命名文件——以便将文件移动到新文件夹。我收到这个奇怪的错误,操作没有成功。

apply: Wrong number of arguments: (8 . 8), 10 [3 times]

当我尝试使用“C”命令进行复制时遇到了同样的错误。但有趣的是,当我尝试使用“D”进行删除时,问题并没有发生。删除确实有效。因此,似乎某处 apply 函数使用不正确。

我在 ubuntu linux 16.04 LTS 上使用 emacs 版本 25.3 和 Spacemacs 版本 0.200.13.x。

有没有人知道为什么会发生这个错误?由于dired 是emacs 核心的一部分,我想可能会与不同的包或其他东西发生冲突。我检查了 spacemacs github repo 问题列表,但没有看到任何提到的问题。任何帮助将不胜感激。

更新

根据 Phil 的建议,这里是堆栈跟踪:

Debugger entered--Lisp error: (wrong-number-of-arguments (8 . 8) 10)
  helm-read-file-name-handler-1("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil nil "dired-do-rename" "*helm-mode-dired-do-rename*")
  apply(helm-read-file-name-handler-1 ("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil nil "dired-do-rename" "*helm-mode-dired-do-rename*"))
  helm--completing-read-default("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil nil)
  apply(helm--completing-read-default ("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil nil))
  #f(advice-wrapper :override completing-read-default helm--completing-read-default)("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil nil)
  completing-read("Rename jarrett-iccv-09.pdf to: " read-file-name-internal file-exists-p nil "~/Downloads/" file-name-history nil)
  read-file-name-default("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil nil nil nil)
  read-file-name("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil nil nil nil)
  ido-read-file-name("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil nil nil nil)
  apply(ido-read-file-name ("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil nil nil nil))
  #f(advice-wrapper :override #f(advice-wrapper :override read-file-name-default helm--generic-read-file-name) ido-read-file-name)("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil nil nil nil)
  read-file-name("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil)
  apply(read-file-name ("Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil))
  dired-mark-pop-up(nil move ("jarrett-iccv-09.pdf") read-file-name "Rename jarrett-iccv-09.pdf to: " "/home/krishnab/Downloads/" nil)
  dired-mark-read-file-name("Rename %s to: " "/home/krishnab/Downloads/" move nil ("jarrett-iccv-09.pdf") nil)
  dired-do-create-files(move dired-rename-file "Move" nil t "Rename")
  dired-do-rename(nil)
  funcall-interactively(dired-do-rename nil)
  call-interactively(dired-do-rename nil nil)
  command-execute(dired-do-rename)

更新 2

helm github 存储库下似乎确实报告了类似的问题。似乎 helm 和 ido 模式不兼容。

https://github.com/emacs-helm/helm/issues/1819

helm wiki 中也有对此的引用。

https://github.com/emacs-helm/helm/wiki#use-helm-mode-and-ido-mode

我尝试了他们的一些建议,比如添加

'(helm-completing-read-handlers-alist
   (quote
    ((find-file-read-only . ido)
     (find-alternate-file . nil))

但仍然得到同样的错误。

【问题讨论】:

  • 你能在运行emacs -Q时复制问题吗?
  • @phils 说了什么。如果没有,请一分为二,找出罪魁祸首。
  • @phils 我检查了当我使用 emacs -Q 然后 dired 正常工作。棘手的是我使用的是 Spacemacs,所以我在 Messages 缓冲区中没有看到任何奇怪的错误。我还检查了dired-do-rename 函数的帮助,它似乎引用了常规的dired 包。我认为如果它被覆盖,那么我会看到覆盖包的名称。嗯,不知道下一步该往哪里看?
  • 假设 M-x toggle-debug-on-error 在发生错误时为您提供堆栈跟踪,请将其粘贴到问题中。 C-h k R in dired 是否确认 dired-do-rename 实际上是所谓的?如果是这样,帮助说明是否为该功能定义了任何 advice? (如果是这样,它告诉你什么?)
  • @phils 我按照你的建议做了。我不知道那个特定的选项。谢谢你的提示。我在尝试重命名(移动)名为 jarrett-XXX.pdf 的 pdf 文件时触发了错误。

标签: emacs spacemacs dired emacs-helm


【解决方案1】:

乍一看,这在我看来像是当前版本 helm 中的一个错误。

从 MELPA 安装 helm,我看到 helm-read-file-name-handler-1 接受 8 个参数:

(helm-read-file-name-handler-1 PROMPT DIR DEFAULT-FILENAME MUSTMATCH INITIAL PREDICATE NAME BUFFER)

虽然根据堆栈跟踪,helm--completing-read-default 保证使用 10 调用它。

helm--completing-read-defaulthelm-completing-read-handlers-alist中查找dired-do-rename,发现映射到helm-read-file-name-handler-1。然后它将处理程序识别为作为 helm 函数的名称空间,并在此基础上使用 2 个额外的 helm 特定参数调用它。

默认情况下,helm-completing-read-handlers-alist 包括:

(dired-do-rename . helm-read-file-name-handler-1)
(dired-do-copy . helm-read-file-name-handler-1)
(dired-do-symlink . helm-read-file-name-handler-1)
(dired-do-relsymlink . helm-read-file-name-handler-1)
(dired-do-hardlink . helm-read-file-name-handler-1))

所以这个问题会影响所有这些可怕的命令。

你可以通过删除所有这些来解决这个问题。

例如M-x customize-option RET helm-completing-read-handlers-alist

【讨论】:

  • 假设一切顺利,请在 helm 问题队列中跟进。如果它与现有的错误报告不完全吻合,你应该提出一个新的。在我看来,helm-read-file-name-handler-1 如果仍打算在这里使用,则需要对其进行修改。
  • 天哪,这真的很有帮助。我会试试这个,看看我能不能让它工作。我已经记录了 Spacemacs 人员的问题,但我也可以记录 helm 的新问题。我会试试这个,让你知道它是怎么回事。
  • n.b.与 ido 的组合确实看起来是触发因素——我只是自己尝试了一下,默认情况下 helm 在这种情况下使用helm--generic-read-file-name(而不是helm--completing-read-default),并且该函数只是添加了 2 个额外的参数最初的一组 6 给出了正确的总数 8,这显然是它的预期工作方式。因此,鉴于reddit.com/r/emacs/comments/9a68sh/…github.com/emacs-helm/helm/issues/2083,您可能会发现对此无能为力
  • 你是对的。我刚刚看到 helm 开发人员关于停止活动开发一段时间的通知。我本来打算跟你提的,但你打了我一拳。我想最好的解决方案是暂时删除helm-completing-read-handlers-alist 中的那些引用。我仍然会在那里记录问题。
  • 问题已添加到 helm 存储库。 github.com/emacs-helm/helm/issues/2085
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多