LINUX.ORG.RU

[emacs] Auto completion

 


0

1

Нужен auto completion фреймворк для имакса, auto completion mode не устраивает, так как может показывать только именно то что дополняется. Нужно еще показывать сигнатуры типов. Прикручиваю бэкенд сам, нужен просто фреймворк.

Вот что в имаксе — http://img502.imageshack.us/img502/492/201012280106331280x800s.png Вот в виме — http://img821.imageshack.us/img821/7729/201012280107581280x800s.png

Ответ на: комментарий от Zodd

Пост читаем, скрины смотрим. Мне еще нужно выводить сигнатуры типов, AutoCompletion этого не умеет. Без этого он мне вообще не нужен.

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

на сколько я знаю можно показывать дополнительную информацию(те же сигнатуры) - на http://www.emacswiki.org/emacs/AutoCompleteScreenshot можно увидеть указание типа символа(функция/переменная). Пилите и все будет показывать(я так понимаю работать предполагается с cedet?)

anonymous
()
Ответ на: комментарий от anonymous

Только один символ можно. А мне нужна полная сигнатура. Доки читал.

Работать предполагается без CEDET, прикручиваю Google Go. На худой конец будем смотреть что с cedet, там вроде комплит человечный.

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

ограничение на один симовол принципиальное? пробовали делать по другому? можно просто переопределить часть функций в своем пакете, я часто так делаю с разными пакетами. Если хотите я даже могу попробовать

anonymous
()
Ответ на: комментарий от anonymous

Принципиальное, ругается иначе на Wrong type argument: characterp.

Лезть в исходники для меня довольно безумно, я только r5rs более-менее со спекой знаю, про CL и EL молчу.

Если посмотрите — буду очень благодарен.

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Auto complete - Version: 1.2 Ставил с emacs-wiki

anonymous
()
Ответ на: комментарий от tensai_cirno
(defun ac-candidates-1 (source)
  (let* ((do-cache (assq 'cache source))
         (function (assoc-default 'candidates source))
         (action (assoc-default 'action source))
         (document (assoc-default 'document source))
         (symbol (assoc-default 'symbol source))
         (ac-limit (or (assoc-default 'limit source) ac-limit))
         (face (or (assoc-default 'face source) (assoc-default 'candidate-face source)))
         (selection-face (assoc-default 'selection-face source))
         (cache (and do-cache (assq source ac-candidates-cache)))
         (candidates (cdr cache)))
    (unless cache
      (setq candidates (save-excursion
                         (cond
                          ((functionp function)
                           (funcall function))
                          (t
                           (eval function)))))
      ;; Convert (name value) format candidates into name with text properties.
      (setq candidates (mapcar (lambda (candidate)
                                 (if (consp candidate)
                                     (propertize (car candidate) 'value (cdr candidate))
                                   candidate))
                               candidates))
      (when do-cache
        (push (cons source candidates) ac-candidates-cache)))
    (setq candidates (funcall (or (assoc-default 'match source)
                                  ac-match-function)
                              ac-prefix candidates))
    ;; Remove extra items regarding to ac-limit
    (if (and (integerp ac-limit) (> ac-limit 1) (> (length candidates) ac-limit))
        (setcdr (nthcdr (1- ac-limit) candidates) nil))
    ;; Put candidate properties
    (setq candidates (mapcar (lambda (candidate)
                               (popup-item-propertize candidate
                                                      'action action
                                                      'symbol candidate
                                                      'document document
                                                      'popup-face face
                                                      'selection-face selection-face))
                             candidates))
    candidates))

Эта функция отвечает за формирование меню. Строка

'symbol candidate
- отвечает как раз за содержимое правой части меню. В данном примере справа будет дублироваться то что содержится слева(можете сделать eval на приведенном коде, и попробовать автодополнение в elisp исходнике). Можно сделать это поле зависимым от содержимого кандидата, то есть строка
'symbol candidate
превратится в строку вида
'symbol (resolve-type-signature candidate)
. Ну и понятное дело надо будет объявить функцию
(defun resolve-type-signature(var-name).... some code for finding type by given symbol name)
. Хотя в реальном коде все будет посложнее, надо ведь еще учитывать области видимости переменных. В общем, вам [bold]прийдется[/bold] копаться в исходниках, тем более если планируете писать свое дополнение.

Конфиг(но там нет ничего что могло бы вам помочь) : http://pastebin.com/D74uBiQm

anonymous
()
Ответ на: комментарий от anonymous

Ага, спасибо, правда в 1.3 уже появилось поле summary, и это делается через него. Списался с автором, тот довольно оперативно ответил. Но всё равно спасибо, разберу пример, чую ELisp еще пригодится ;)

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А не подскажешь, в чем может быть проблема? С подписями разобрался, проблемы с сортировкой. candidates даю ему отсортированными. Скилла на чтение исходника не хватает ;\

http://pastebin.com/SLx1RWuN

http://img340.imageshack.us/img340/2663/201012281620311280x800s.png

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno
(defun ac-go-format-autocomplete (buffer-contents)
  (sort
   (split-string buffer-contents "\n")
   '(lambda (a b) (string< (downcase a)
                           (downcase b)))))

сравнение идет после приведения к нижнему регистру(downcase) можешь попробовать убрать его, а также разделять a и b и сортировать без учета сигнатуры.

Если покажеш выхлоп gocode смогу больше помочь

recon88
()
Ответ на: комментарий от recon88

Как раз так и надо. Я кажется разобрался, auto-completion форсировал сортировку у себя, нашел где убить это.

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

если надо просто убить сортировку то будет выглядеть так:

(defun ac-go-format-autocomplete (buffer-contents)
   (split-string buffer-contents "\n"))
recon88
()
Ответ на: комментарий от recon88

Нене, ты не понял. Сортировку с даункейсами написал я (там весь файл мой). На скрине он сортирует по длине, однако я уже нашел код плагина, который за это отвечает. Но всё равно спасибо :)

tensai_cirno ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

1. Я правильно понимаю, что в этой строке:

(defun ac-comphist-sort (db collection prefix &optional threshold)
нужно вместо «db collection ...» поставить путь до разбираемых исходников (например, «/var/projects/java/»)?

2. etags и подобные здесь не используются, верно?

Просто хочу переделать твой скрипт для явы.

wingless
()
Ответ на: комментарий от tensai_cirno

[сарказм]
Спасибо за развёрнутый и очень информативный ответ.
[/сарказм]

Выложить скрипт, который не работает даже на Google Go, без конфига и
комментариев, вместе со скриншотом вида «а у меня всё работает» — это
5+.

Илита, твою ж [неразборчиво].

wingless
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.