Emacs `dired` ошибка при переименовании файла с помощью Helm:` apply` неверное количество аргументов - PullRequest
0 голосов
/ 28 августа 2018

Я не использую режим dired слишком часто, но пытался немного попрактиковаться с ним. Поэтому я создал несколько пустых тренировочных текстовых файлов и пометил их обычным быстрым сочетанием клавиш. Затем я попытался переименовать файлы с помощью команды «R» - чтобы переместить файлы в новую папку. Я получаю эту странную ошибку, и операция не удается.

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

Я столкнулся с той же ошибкой, когда пытался сделать копию с помощью команды "C". Но достаточно интересно, что проблема не возникает, когда я пытался удалить с помощью «D». Удалить сделал работу. Похоже, что где-то функция apply используется неправильно.

Я использую emacs версии 25.3 и Spacemacs версии 0.200.13.x в Ubuntu Linux 16.04 LTS.

У кого-нибудь есть чувство, почему происходит эта ошибка? Поскольку dired является частью ядра emacs, я думаю, что может быть конфликт с другим пакетом или чем-то еще. Я проверил список проблем репозитория spacemacs github, но не увидел упомянутых проблем. Любая помощь будет оценена.

ОБНОВЛЕНО

Согласно предложению Фила, вот трассировка стека:

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 есть ссылка на это.

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

Но все равно получаю ту же ошибку.

1 Ответ

0 голосов
/ 29 августа 2018

На первый взгляд, это выглядит как ошибка в текущей версии helm.

Устанавливая helm от MELPA, я вижу, что helm-read-file-name-handler-1 принимает 8 аргументов:

(helm-read-file-name-handler-1 ЗАПРОСИТЬ DIR DEFAULT-FILENAME MUSTMATCH ПЕРВОНАЧАЛЬНЫЙ БУФЕР ИМЕНИ ПРЕДИКАТА)

Хотя helm--completing-read-default гарантированно вызывает его с 10, согласно трассировке стека.

helm--completing-read-default ищет dired-do-rename в helm-completing-read-handlers-alist и находит, что он сопоставлен с helm-read-file-name-handler-1. Затем он распознает обработчик как пространство имен, как функцию helm, и на этой основе вызывает его с двумя дополнительными аргументами, относящимися к 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))

Так что эта проблема затрагивает все эти устаревшие команды.

Можно предположить, что обойти это можно, удалив все из них.

например. М-х customize-option RET helm-completing-read-handlers-alist

...