Есть несколько проблем с вашей лямбда-функцией.
Во-первых, 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
.
Вы можете установить переменную enable-recursive-минибуферы
, которая предотвратит появление этого сообщения об ошибке. Но он просто разрешает множественные вызовы минибуфера - он не перенаправляет текущую команду минибуфера в новый буфер. Вы можете попробовать это, но я думаю, что это будет более запутанным, потому что исходное действие еще не выполнено ...
Mx
связан с 'execute-extended-command
, и повторный хостинг (изменение исходного буфера) для этой команды напоминает программирование с продолжением. то есть вы вызываете подпрограмму из местоположения X, но вместо того, чтобы вернуться к X, когда вы закончите, вы возвращаетесь к Y. Я лично думаю, что это вызовет больше путаницы, чем решит. Но я понимаю разочарование (и знаю других, у которых такое же разочарование).
Я не уверен, есть ли такая настройка, но я избегаю этого, нажимая ctrl - g , чтобы отменить команду I был в середине письма в минибуфере.
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
Так как мой первый ответ напрямую не дает вам то, что вы хотите, я подумал, что нашел бы реальное решение. Вот что у меня есть:
(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):
F10 isearch-for
Cx o
Cx o
F10
ward RET
Когда я начал вводить поисковый термин, поиск применялся к буферу B.
Это заменяет только функциональность Mx
, не команды, вызванные из Mx
. Кроме того, эта версия не поддерживает префиксный аргумент.
Надеюсь, это то, что вы хотите.