Режимы Emacs: “Команда попыталась использовать мини-буфер в то время как в мини-буфере”

Есть несколько проблем с вашей лямбда-функцией.

Во-первых, fold ожидает (a -> b -> b), так что технически, функцию с двумя аргументами. Прямо сейчас ваша лямбда принимает только 1 аргумент. Поскольку ваш fold напоминает foldr (сгибает справа), вторым аргументом должен быть объект накопитель , который собирает результат из каждого сгиба.

Во-вторых, вы работаете с кортежами, а не списками (как отметил pdexter в комментарии ). Таким образом, вы должны использовать функции fst и snd.

После некоторых модификаций лямбды:

\x acc -> (fst x:fst acc, snd x:snd acc)

Это добавит первый элемент из каждого кортежа к первому списку аккумулятора. И второй элемент из каждого кортежа во второй список аккумулятора. Некоторые результаты:

unzip' :: [(a,b)] -> ([a],[b])
unzip' = fold (\x acc -> (fst x:fst acc, snd x:snd acc)) ([],[])

unzip' [(1, 'a'), (2, 'b'), (3, 'c')]
([1,2,3],"abc")

После комментария Джона вы также можете воспользоваться преимуществами сопоставления с образцом в лямбде, заменив fst и snd. Это может увеличить строгость функции. Вы также можете заменить ([], []) на mempty, предопределенный пустой кортеж.

unzip' = fold (\(x, y) (xs, ys) -> (x:xs, y:ys)) mempty

Подсказка: Перед тем как перейти к функции unzip, вы можете сначала изолировать и протестировать лямбду с помощью fold.

12
задан EoghanM 1 May 2009 в 16:37
поделиться

4 ответа

Вы можете установить переменную enable-recursive-минибуферы , которая предотвратит появление этого сообщения об ошибке. Но он просто разрешает множественные вызовы минибуфера - он не перенаправляет текущую команду минибуфера в новый буфер. Вы можете попробовать это, но я думаю, что это будет более запутанным, потому что исходное действие еще не выполнено ...

Mx связан с 'execute-extended-command , и повторный хостинг (изменение исходного буфера) для этой команды напоминает программирование с продолжением. то есть вы вызываете подпрограмму из местоположения X, но вместо того, чтобы вернуться к X, когда вы закончите, вы возвращаетесь к Y. Я лично думаю, что это вызовет больше путаницы, чем решит. Но я понимаю разочарование (и знаю других, у которых такое же разочарование).

7
ответ дан 2 December 2019 в 06:27
поделиться

Я не уверен, есть ли такая настройка, но я избегаю этого, нажимая ctrl - g , чтобы отменить команду I был в середине письма в минибуфере.

5
ответ дан 2 December 2019 в 06:27
поделиться

Can anyone improve on the following?

I've given up and just want to set \C-w to cancel any previous minibuffer before opening a new one (like doing \C-g\C-w)

So far thanks to Trey I've got:

(defun cancel-completing-read ()
  (if (> (minibuffer-depth) 0) (exit-minibuffer))
   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil))

(defun cancel-and-execute-command (command)
  (interactive (list (cancel-completing-read)))
  (call-interactively (symbol-function (intern command))))

(global-set-key "\M-x" 'cancel-and-execute-command)

What command should I use in the place of exit-minibuffer above?

I've tried

keyboard-escape-quit
exit-minibuffer
keyboard-quit
2
ответ дан 2 December 2019 в 06:27
поделиться

Так как мой первый ответ напрямую не дает вам то, что вы хотите, я подумал, что нашел бы реальное решение. Вот что у меня есть:

(defvar my-execute-extended-command-source-buffer nil
  "var holding the buffer to which the extended-execute-command should apply")
(defvar in-my-execute-extended-command nil
  "internal use - indicates whether we're in a 'recursive edit' of sorts")
(defun my-execute-extended-command (command)
  "home-grown version of execute-extended-command that supports re-hosting the buffer"
  (interactive (list (if in-my-execute-extended-command
                   nil
                 (let ((in-my-execute-extended-command t))
                   (setq my-execute-extended-command-source-buffer (current-buffer))
                   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil)))))
  (if in-my-execute-extended-command
      (progn (setq my-execute-extended-command-source-buffer (current-buffer))
             (select-window (minibuffer-window)))
    (switch-to-buffer my-execute-extended-command-source-buffer)
    (call-interactively (symbol-function (intern command)))))

Я проверил это таким образом. Я привязал его к ключу ( F10 в моем случае б / к я не хотел терять Mx ). Затем с двумя открытыми окнами, каждое из которых отображает свой буфер (скажем, A и B):

  1. Из окна, показывающего буфер A: F10 isearch-for
  2. Переключение из минибуфера в окно, показывающее A: Cx o
  3. Переключиться из окна, отображающего A, в окно, отображающее B: Cx o
  4. «повторно разместить» команду из буфера B: F10
  5. Теперь вернитесь в минибуфер, завершите команду ward RET

Когда я начал вводить поисковый термин, поиск применялся к буферу B.

Это заменяет только функциональность Mx , не команды, вызванные из Mx . Кроме того, эта версия не поддерживает префиксный аргумент.

Надеюсь, это то, что вы хотите.

4
ответ дан 2 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: