Осмысление выбора режима завершения Emacs

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

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

4 ответа

Решение

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

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

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

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

Wrt Сосульки -

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M- / запускает команду dabbrev-expand, которая представляет собой интерактивную автозагрузку функции Lisp в `dabbrev.el'. Это связано с M-/.

(dabbrev-expand ARG) Развернуть предыдущее слово "динамически". Расширяется до самого последнего предшествующего слова, для которого это префикс. Если подходящего предшествующего слова не найдено, учитываются слова, следующие за точкой. Если подходящее слово еще не найдено, посмотрите в буферах, принятых функцией, указанной в переменной `dabbrev-friend-buffer-function'. Положительный префиксный аргумент, N, говорит, что нужно принять N-ную * отличную * возможность. Отрицательный аргумент говорит о поиске вперед. Если курсор не сдвинулся с конца предыдущего раскрытия и аргумент не задан, замените ранее сделанное раскрытие на следующее возможное раскрытие, еще не опробованное. Переменная `dabbrev-backward-only'может использоваться для ограничения направления поиска назад, если задано не ноль. Смотрите также `dabbrev-abbrev-char-regexp'и CM- /.

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

Другие вопросы по тегам