Я использую Distel для моей разработки erlang, но функция, которая используется для завершения, печатает свой вывод в ibuffer. Я хотел бы получить его в минибуфере с поддержкой ido, может кто-нибудь знает, как это сделать?Нужна помощь, чтобы переписать функцию elisp для использования минибуфера + ido вместо ibuffer
Вот код:
(defun erl-complete (node)
"Complete the module or remote function name at point."
(interactive (list (erl-target-node)))
(let ((win (get-buffer-window "*Completions*" 0)))
(if win (with-selected-window win (bury-buffer))))
(let ((end (point))
(beg (ignore-errors
(save-excursion (backward-sexp 1)
;; FIXME: see erl-goto-end-of-call-name
(when (eql (char-before) ?:)
(backward-sexp 1))
(point)))))
(when beg
(let* ((str (buffer-substring-no-properties beg end))
(buf (current-buffer))
(continuing (equal last-command (cons 'erl-complete str))))
(setq this-command (cons 'erl-complete str))
(if (string-match "^\\(.*\\):\\(.*\\)$" str)
;; completing function in module:function
(let ((mod (intern (match-string 1 str)))
(pref (match-string 2 str))
(beg (+ beg (match-beginning 2))))
(erl-spawn
(erl-send-rpc node 'distel 'functions (list mod pref))
(&erl-receive-completions "function" beg end pref buf
continuing
#'erl-complete-sole-function)))
;; completing just a module
(erl-spawn
(erl-send-rpc node 'distel 'modules (list str))
(&erl-receive-completions "module" beg end str buf continuing
#'erl-complete-sole-module)))))))
(defun &erl-receive-completions (what beg end prefix buf continuing sole)
(let ((state (erl-async-state buf)))
(erl-receive (what state beg end prefix buf continuing sole)
((['rex ['ok completions]]
(when (equal state (erl-async-state buf))
(with-current-buffer buf
(erl-complete-thing what continuing beg end prefix
completions sole))))
(['rex ['error reason]]
(message "Error: %s" reason))
(other
(message "Unexpected reply: %S" other))))))
Я не совсем понимаю. Вы говорите о завершении работы в минибуфере, но код, который вы показываете, похоже, заключается в выполнении «в буфере». Поэтому я думаю, что вы хотите настроить «функции завершения-на-точке». – Stefan
Да, это был мой вопрос более или менее: как мне изменить этот код, поэтому все альтернативы для завершения отображаются в минибуфере (с поддержкой ido) вместо интерактивного буфера. Я не написал код, расположенный выше, из пакета [Distel] (https://github.com/massemanet/distel), и, честно говоря, моего знания elisp недостаточно, чтобы я мог обернуть голову вокруг этого функция. – SpaceOgre
О, так что я думаю, что вы хотите что-то вроде 'icomplete-mode', но для завершения« in-buffer ». То есть само завершение не выполняется в минибуфере, но список кандидатов на завершение отображается в эхо-области (и автоматически обновляется по мере редактирования текста), а не в \ * Completions \ *. Выполнение 'icomplete-mode' работы с' функцией завершения-на-точке' по-прежнему находится в моем списке задач, tho. – Stefan