Осмысление выбора режима завершения Emacs - PullRequest
27 голосов
/ 20 января 2010

Похоже, есть много альтернативных механизмов автозаполнения Emacs. Без исчерпывающего поиска на ум приходит следующее: ido, автозаполнение, сосульки, в завершении буфера, заполнение минибуфера и стандартное завершение из коробки. И тогда есть завершение кода. Многое из этого. И многое из этого зависит от языка. Было бы очень полезно иметь гуру Emacs или трех, чтобы обобщить преимущества основных игроков как в автозаполнении кода, так и без кода. И поскольку это переполнение стека, само собой разумеется, что было бы хорошо определить режимы автозаполнения, которые лучше всего работают для IDE-подобных механизмов Emacs.

Обновление : я только что открыл страницу завершения Emacs Wiki , которая усиливает мой основной вопрос: что из этого выбора: что хорошо, что менее хорошо, и если бы вы могли играть только с -3 что бы вы порекомендовали?

Ответы [ 4 ]

8 голосов
/ 22 августа 2011

Wrt Сосульки -

По большей части, Icicles составляет минибуфер завершения. Есть несколько случаев, когда он предлагает что-то для завершения в буфере (например, кода), но в основном это касается завершения минибуфера.

Когда большинство людей думает о завершении минибуфера, они думают о завершении имени файла, завершении имени буфера и имени команды. Но есть много больше к этому.

Как программист Emacs-Lisp, вы можете использовать завершение везде, где вы хотите предоставить пользователям выбор в интерактивном режиме. Это довольно общее!

Завершение действительно о сопоставлении с образцом для определения наборов , которыми вы затем можете манипулировать.

Большинство людей считают, что единственная цель завершения минибуфера - выбрать одно имя (файл, буфер, команда, переменная, ...). Но сила завершения в действительности заключается в том, чтобы фильтровать и, возможно, сортировать полный набор имен файлов, имен буферов и т. Д. Различными способами, а затем позволять пользователям что-то делать с или с полученным набором (необязательно один объект).

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

Это не столько цель Ido или других пакетов завершения, за возможным исключением Helm (Anything) .

В отличие от Helm (Anything) , который дает объекту имена над типами объектов и действиями в качестве его начальной точки, в Сосульки вы обычно вызываете команда сделать что-то с одним или несколькими объектами данного типа (например, буферы), и затем вы сузите набор этих объектов, обычно путем сопоставления имен. В Сосульках часто бывает так, что вы можете воздействовать на эти объекты несколькими, но связанными способами в рамках одной команды.

В Шлем (Все, что угодно) , как правило, ваш ввод сначала сопоставляется по имени объекта со всей вселенной объектов всех типов, а затем вы сужаетесь, чтобы выбрать какую-то операцию. (s), чтобы выполнить.

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

Если вы делаете завершение кода , тогда вы обычно просто хотите завершить имя в точке . Главное, что интересно в дополнении кода, это определение подходящих кандидатов. Для этого текстовый (например, кодовый) контекст, как правило, очень важен. Чтобы предложить разумный выбор, функция завершения должна анализировать контекст (код), включая любой охватывающий контекст (например, код проекта).

С другой стороны, завершение минибуфера можно использовать для любого выбора и действия, включая множественный выбор с несколькими действиями. Здесь интересны все части: какие кандидаты предложить, что с ними можно сделать и т. Д.

Не знаю, помогает ли это, но в любом случае это мой выбор.

7 голосов
/ 21 января 2010

Я обычно использую два пакета завершения (кроме встроенного завершения TAB в буферах минибуфера и коминт).

pabbrev.el - который предоставляет подсказку у курсора (нажмите TAB ) для принятия. Выбор сделан, смотря на частоту слов. Мне нравится это из-за визуальной индикации того, что должно быть завершено, но в основном это работает только для одного завершения.

hippie-expand - который обычно связан с M - / вместо dabbrev, потому что он делает все, что делает dabbrev и многое другое. Это хорошо работает, когда вам может понадобиться перебрать некоторые альтернативы, или если вы хотите заполнить имя файла или что-то еще.

Мне нравятся оба, потому что они не требуют движения мыши и работают быстро.

4 голосов
/ 20 января 2010

Вы можете посмотреть на пакет в режиме компании или на автозаполнение, в котором могут использоваться разные источники завершения, включая CEDET, и они также позволяют определять новые источники завершения ... Для некоторых языков программирования вы можете использовать CEDET напрямую ...

4 голосов
/ 20 января 2010

Я использую стандартное завершение табуляции в минибуфере для имен файлов, M-x команд и других вещей.

Я также часто использую клавишу M-/ (dabbrev-expand) для динамического завершения любого слова в любом из ваших буферов Emacs. Это фантастика, особенно для длинных имен переменных. Вот документация:

M-/ runs the command dabbrev-expand, which is an interactive
autoloaded Lisp function in `dabbrev.el'.

It is bound to M-/.

(dabbrev-expand ARG)

Expand previous word "dynamically".

Expands to the most recent, preceding word for which this is a prefix.
If no suitable preceding word is found, words following point are
considered.  If still no suitable word is found, then look in the
buffers accepted by the function pointed out by variable
`dabbrev-friend-buffer-function'.

A positive prefix argument, N, says to take the Nth backward *distinct*
possibility.  A negative argument says search forward.

If the cursor has not moved from the end of the previous expansion and
no argument is given, replace the previously-made expansion
with the next possible expansion not yet tried.

The variable `dabbrev-backward-only' may be used to limit the
direction of search to backward if set non-nil.

See also `dabbrev-abbrev-char-regexp' and C-M-/.
...