¿Los smartparens insertan caracteres individuales versus pares?

8

P: ¿cómo puedo modificar smartparenslas reglas de decisión de cuándo insertar un carácter emparejado o único?

smartparensparece ser principalmente inteligente al insertar comillas simples (por ejemplo, en text-modeo org-mode). Por lo tanto, por defecto inserta un par de 'sy coloca el cursor entre ellas, pero, cuando se invoca al final de una palabra, solo inserta una sola ' en previsión de las contracciones. Entonces, por ejemplo:

  • '=> '*'(donde *es el punto)
  • can + '=> can'*(para que pueda seguir escribiendo "no puedo")

Sin embargo, hay un problema que estoy tratando de solucionar. A menudo uso abreviaturas que terminan en un período, pero me gustaría hacerlas posesivas. Por ejemplo, podría escribir "so" como abreviatura de "alguien" y, por lo tanto, "so's" sería "alguien". El problema es que smartparensinserta un par 'después de un período:

  • lo que quiero: s.o. + '=>s.o.'*
  • lo que obtengo: s.o. + '=>s.o.'*'

Mi objeción específica es con smartparensel comportamiento de ', pero puedo imaginar que este es un problema más general con otros personajes también.

Entonces: ¿cómo puedo ajustar smartparensla regla de decisión para expandir el conjunto de caracteres después de lo cual solo inserta uno '?

PD: de forma divertida, tratar de escribir "smartparens" en emacs da el mismo comportamiento irritante.

Dan
fuente

Respuestas:

2

Sí, con condicionales de emparejamiento:

;; a sample from my .emacs.d
(defun my-sp-pair-function (id action context)
  (if (eq action 'insert)
    ;; t to pair, nil to not pair
    (or (looking-at "[[:space:][:punct:]]")
      (sp-point-before-eol-p id action context))
    t))

(with-eval-after-load 'smartparens
    (sp-pair "(" ")" :when '(my-sp-pair-function) :wrap "C-)")
    (sp-pair "{" "}" :when '(my-sp-pair-function) :wrap "C-}")
    (sp-pair "[" "]" :when '(my-sp-pair-function) :wrap "C-]")
    (sp-pair "\"" "\"" :when '(my-sp-pair-function) :wrap "C-\"")
    (sp-pair "'" "'" :when '(my-sp-pair-function)))
PythonNut
fuente
1
La parte inferior parece totalmente ajena. Parece que la parte superior no hará nada por sí sola. ¿Podría por favor convertir su respuesta en algo funcional?
wasamasa
Eso es cierto ... copiar-pegar falla. Fijo.
PythonNut
Gracias por los pensamientos, pero my-sp-pair-functionno parece estar proporcionando la funcionalidad deseada. Me está dando el mismo comportamiento que antes después de la puntuación (inserción emparejada), pero ahora también hace una inserción emparejada después de caracteres alfanuméricos, rompiendo las contracciones.
Dan
@ Dan, se suponía que era una solución general. Puede, por ejemplo, reemplazar la condición con esto:(and (or (looking-at "[[:space:][:punct:]]") (sp-point-before-eol-p id action context)) (not (looking-back "[.`]")))
PythonNut
2

Puede modificar el comportamiento de smartparen utilizando las funciones sp-pairy sp-local-pair. El wiki de smartparens explica estas funciones en detalle.

Básicamente puede hacer algo como seguir para personalizar el comportamiento globalmente

(sp-pair "\"" nil :unless '(my-custom-predicate))

O para personalizar el comportamiento solo para algunos modos

(sp-local-pair desired-modes "\"" nil :unless '(my-custom-predicate))

dónde desired-modees el modo para el que desea personalizar el comportamiento y my-custom-predicatees la función que deben usar los smartparens para determinar si debe insertar el par automáticamente.

A partir sp-pairde la cadena de documentación, el predicado personalizado debe aceptar

delimitador de apertura (que determina de forma exclusiva el par), acción y contexto. El argumento de contexto puede tener valores:

  • cadena: si el punto está dentro de la cadena.
  • comentario: si el punto está dentro del comentario.
  • código: si el punto está dentro del código. Este contexto solo se reconoce en los modos de programación que definen la semántica de cadenas.

Entonces, una función personalizada que se puede usar como :unlesspredicado en su caso específico sería algo como lo siguiente

(defun predp (id action context)
  (sp--looking-back-p "[[:punct:]]'"))

Tenga en cuenta que estoy buscando la expresión regular <punctuation>'ya que el punto sería .'|cuando se ejecuta el predicado.

Finalmente, puedes conectarlo a smartparens haciendo

(sp-pair  "'" nil :unless'(predp))
Iqbal Ansari
fuente
Gracias, eso me lleva a una parte del camino, pero ¿podría dar un ejemplo concreto? He probado varias formas de la función predicado (por ejemplo, (defun predp () (sp--looking-back-p "[[:space:][:punct:]]"))), pero las smartparensignora todas.
Dan
Hola @Dan, he agregado la solución para tu problema específico a la respuesta. No estaba aceptando los argumentos requeridos en el predicado, también la expresión regular utilizada estaba ligeramente apagada
Iqbal Ansari