Как заменить \ строку строкой без обратной косой черты в режиме сокращения emacs?

Мой вопрос мотивирован написанием TeX в emacs, но не имеет отношения к самой системе TeX.

Моя цель - настроить сокращения в emacs для замены некоторых макросов (TeX) их символами юникода, например \ alpha на α автоматически, пока я набираю TeX в emacs.

Я планировал добиться этого с помощью системы сокращений. Хотя следующая аббревиатура работает нормально (заменяет test на \ test):

("test" "\\test" nil 0)

Сокращения, которые могут делать то, что я хочу, а именно:

("\\alpha" "A" nil 0)

or

("\\\\beta" "B" nil 0)

не применяются, когда я набираю \ alpha или \ beta.

(Я мог бы обойти это, заменив саму «альфа» и удалив один предыдущий символ, но я хотел бы сохранить возможность ввода альфа без обратной косой черты и не применять это правило сокращения.)

Какова правильная форма аббревиатуры, заменяющей \ alpha на α?


person M. B.    schedule 14.08.2013    source источник


Ответы (2)


Вам необходимо изменить свойство :regexp вашей таблицы сокращений.

(abbrev-table-put <your-abbrev-table> :regexp "\\(\\\\[a-z0-9@]+\\)")

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

Но почему бы вам не использовать метод ввода для вставки символов Юникода?

person angus    schedule 14.08.2013
comment
По крайней мере, метод ввода TeX, описанный ниже, слишком желателен для замены, что мешает вам легко вводить \ over, \ varepsilon или другие макросы TeX, которые на самом деле не являются частью метода ввода. Моя цель состояла в том, чтобы найти решение, в котором я мог бы набирать TeX, как всегда, с заменой, происходящей без моего активного участия. - person M. B.; 14.08.2013
comment
Я понимаю. Я использую rfc1345, он действительно полный и систематический; Я рекомендую вам попробовать. В любом случае изменение регулярного выражения работает с одной оговоркой (см. Отредактированный ответ). - person angus; 15.08.2013

Это уже существует. Используйте функцию set-input-method и выберите TeX.

person Nicolas Dudebout    schedule 14.08.2013
comment
Хотя это и не является ответом на сам вопрос, это позволяет мне обойти вопрос и напрямую достичь моей цели. Спасибо. - person M. B.; 14.08.2013
comment
Что касается вашего решения, можно ли предложить emacs неактивную версию системы методов ввода? Например, если у меня есть сокращение для \\ alpha и набирается \\ alphar, ничего не заменяется. Однако, если я наберу \ varepsilon в методе ввода TeX, я получу ǎrepsilon, потому что он агрессивно совпадает с \ va, который находится в его базе данных. - person M. B.; 14.08.2013
comment
Я никогда особо не играл с сокращениями - person Nicolas Dudebout; 14.08.2013