Эквивалент abbrev-mode, но для функций? - PullRequest
0 голосов
/ 20 марта 2012

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

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

Так что вместо расширения аббревиатуры с помощью abbrev-mode она будет запускать функцию по моему выбору.

Конечно, он должен быть совместим с abbrev-mode, который я использую все время.

Как я могу получить это поведение?

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Одним из подходов может быть использование pre-abbrev-expand-hook. Я сам не пользуюсь режимом аббревиатуры, но это звучит так, как будто вы могли бы повторно использовать механизм режима аббревиатуры таким образом, и просто определить некоторые «сокращения», которые расширяются до самих себя (или до нуля?), А затем вы ловите их в этот крючок и предпринимайте любые действия, которые вы хотите.

Библиотека expand, очевидно, связана, и она обеспечивает expand-expand-hook, что может быть другой альтернативой?

edit: Whoops; pre-abbrev-expand-hook устарел с 23.1

abbrev-expand-functions является правильной переменной для использования:

Обертка вокруг `expand-abbrev '. Функции в этом специальном хуке вызываются с одним аргументом: функция, которая выполняет расширение аббревиатуры. Должно вернуться символ сокращения, если расширение имело место.

См. M-x find-function RET expand-abbrev RET для кода, и вы также захотите прочитать C-h f with-wrapper-hook RET, чтобы понять, как используется этот хук.

3 голосов
/ 21 марта 2012

EDIT: Ваш пересмотренный вопрос добавляет некоторые ключевые детали, на которые не ответил мой ответ. Филс предоставил один из способов решения этой проблемы. Другой будет использовать yasnippet . Вы можете включить произвольный код lisp в свои шаблоны сниппета, чтобы вы могли сделать что-то вроде этого:

# -*- mode: snippet -*-
# name: foobars
# key: fbf
# binding: direct-keybinding
# --
 `(foo-bar-for-the-win)`

Вы должны убедиться, что ваша функция ничего не возвращает, или она будет вставлена ​​в буфер. Я не использую режим abbrev, поэтому я не знаю, приведет ли это к конфликтам. Для запуска yas / snippet нужно немного поэкспериментировать, но это довольно удобно, как только вы его настроите.

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

(define-key your-mode-map " " 'your-choice-function)

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

2 голосов
/ 21 марта 2012

Каждая аббревиатура состоит из нескольких элементов. Среди основных элементов - имя (например, «fbf»), расширение (любая строка, которая вам нравится) и хук (функция, которая вызывается). В вашем случае это звучит так, как будто вы хотите, чтобы расширение было пустой строкой, и просто укажите ваш foo-bar-for-the-win в качестве хука.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...