Регулярное выражение как триггер

Одним из действующих правил кода является добавление одного пробела внутри квадратных скобок и круглых скобок. Итак, list[ index ], а не list[index]. Добавление этих пробелов может раздражать, поэтому я попытался написать фрагмент:

# name: Bracket
# key: [
# --
[ ${1:exp} ]

Это работает, когда открывающей квадратной скобке предшествует пробел или начало строки, но не когда перед ней стоит идентификатор. Я думаю, что один из способов сделать это - сделать триггер регулярным выражением:

# key: "[:ascii:]"[

Или что-то типа того. Это вообще возможно? Или есть какой-то другой умный способ заставить это работать? Я пишу это для python, но я думаю, что это не имеет значения.

Спасибо!


person Arturo E    schedule 04.01.2013    source источник
comment
Просто дикая догадка, может ли удаление пробела в key: [ что-нибудь сделать? (Итак, сделайте это: key:[)?   -  person Cerbrus    schedule 04.01.2013


Ответы (3)


Решение второстепенного режима

Мне тоже приходилось иметь дело с таким стандартом кодирования. Мое первоначальное решение было идентично @Francesco на основе автопары.

Однако в некоторых случаях я действительно хотел удалить этот отступ, поэтому сделал этот второстепенный режим более гибким. Я определенно рекомендую использовать его вместе с каким-нибудь инструментом для вставки парных разделителей (мой любимый — автопара).

См.: разделитель

Использование yasnippet

Продолжая свой первоначальный путь использования yasnippet... (кстати, autopair и yasnippet написаны João Távora, оба очень мощные и гибкие. респект этому парню!)

Даже если вы распознали «[» как клавишу, вам все равно придется нажимать триггерную клавишу, чтобы развернуть фрагмент. От этого можно довольно быстро устать.

Yasnippet также позволяет напрямую привязывать фрагменты к ключам, так что это будет работать:

# -*- mode: snippet -*-
# name: beginsquare
# binding: [
# --
[ $0 ]
person event_jr    schedule 04.01.2013
comment
Разве это не дубликат моего ответа? Кроме связующей части. - person PascalVKooten; 04.01.2013
comment
Большое спасибо за ваш ответ. Я использую delim-pad + autopair в течение последних нескольких дней, и все работает отлично! - person Arturo E; 10.01.2013

Я не знаю о YASnippet, но то, что вы хотите, может быть легко достигнуто с помощью autopair (который можно установить через систему упаковки):

(defun autopair-space-after-bracket (action pair pos-before)
  (when (and (eq action 'opening)
             (eq pair ?\]))
    (insert "  ")
    (backward-char)))

(setq autopair-handle-action-fns (list #'autopair-default-handle-action
                                       #'autopair-space-after-bracket))

Используя это и начиная со следующей ситуации (| отмечает позицию точки):

list|

затем вставка [ дает:

list[ | ]

person François Févotte    schedule 04.01.2013
comment
Учитывая ситуацию, я также считаю, что это должно/можно быть выполнено с помощью автопары, и это было бы более логично, чем скобка (где вы должны нажать TAB). - person PascalVKooten; 04.01.2013
comment
Я согласен с использованием для этого чего-то другого, кроме YASnippet, и это определенно кажется проще сделать с автопарой, чем с электрической парой. - person Dan LaManna; 04.01.2013

Причина, по которой это не работает, заключается в том, что вы пытаетесь расширить list[, а не [, когда что-то находится перед этой квадратной скобкой. Ясниппет "не твой парень", я бы сказал, за создание расширения на [. В конце я покажу вам более распространенное использование yasnippet.

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

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

list[ $0 ]

Привяжите его либо к list, либо еще короче к l, в зависимости от того, что вас устраивает.

Лично я бы выбрал комбинацию autopair и yasnippet, они оба великолепны. Удачи!

Копировать вставить:

# name: List
# key: list
# --
list[ $0 ]
person PascalVKooten    schedule 04.01.2013