No empareje comillas en modo de par eléctrico

7

¿Cómo puedo llegar electric-pair-modea no emparejar comillas (simples o dobles)? Todavía quiero que empareje todo lo demás (corchetes, llaves, etc.), solo que no comillas.

Ben
fuente
¿Has intentado personalizar electric-pair-inhibit-predicate?
elethan
@elethan, ¿dónde encuentro esta electric-pair-inhibit-predicatevariable? Es desconocido para mis emacs 24.3.1
ggll
@ggll Estoy usando Emacs 25.1.1 y para mí está en elec-pair.el.
elethan
En origen de electric-pair-mode, electric-pair-pairsy electric-pair-text-pairsse utiliza para la personalización, pero electric-pair-text-syntax-tabletiene prioridad. Un gancho que establece localmente estas variables debería ser suficiente para que esto funcione. Comprobaré si ese es el caso más tarde y publicaré una respuesta.
DoMiNeLa10

Respuestas:

5

Agregue lo siguiente a su archivo de inicio de emacs:

(setq electric-pair-inhibit-predicate
      (lambda (c)
        (if (char-equal c ?\") t (electric-pair-default-inhibit c))))

Referencia de mi blog: https://www.topbug.net/blog/2016/09/29/emacs-disable-certain-pairs-for-electric-pair-mode/

xuhdev
fuente
1
Esto no funciona para mi. Las comillas dobles todavía están emparejadas.
Ben
@Ben ¿Qué versión de emacs tienes? Agregue esa información a su pregunta. Pruebe el código de esta respuesta con emacs -Q(emacs comenzó con la opción de línea de comando -Q). Quizás algún otro paquete interfiere. El código funciona para mí con GNU Emacs 25.3.1 (x86_64-unknown-cygwin, GTK + Versión 3.22.20) de 2017-09-11.
Tobias
Estoy agregando una respuesta porque aún no puedo comentar. @xuhdev tiene la respuesta correcta, pero por razones que realmente no entiendo en mi sistema cuando evalúo: (setq electric-pair-inhibit-predicate (lambda (c) (if (char-equal c? \ ") t (electric) -pair-default-inhibit c)))) Obtengo (lambda (c) (if (char-equal c 34) t (electric-pair-default-default-inhibit c))). Así que prueba Mx personalizar-variable, elige electric -pair-inhibit-predicate, y luego elija de la función del menú de valores y escriba en el cuadro: (lambda (c) (if (char-equal c? \ ") t (electric-pair-default-inhibit c)) ) De esta manera funciona para mis configuraciones en emac
D. Dimakakos
No publique una pseudo respuesta en lugar de un comentario. Cuando ganes un poco de puntos de "reputación" podrás comentar. Si se pregunta por qué ?\"termina imprimiéndose como 34, es porque el "carácter es el mismo que el entero 34. En Emacs, los caracteres son enteros positivos de cierto rango.
Dibujó el
Este debe ser un problema de la versión electric.el. Estoy usando GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu) of 2016-01-13.
Ben
3

Parece que no puedes. Las diversas personalizaciones solo le permiten agregar pares.

Si está dispuesto a usar un paquete diferente para hacer su emparejamiento, puede probar smartparens . Puede establecer comillas para que no se emparejen de la siguiente manera:

(sp-pair "'" nil :actions :rem)
(sp-pair "\"" nil :actions :rem)
zck
fuente
Tenga en cuenta que los smartparens carecen de algunas características sutiles del par eléctrico que no son obvias de inmediato. Si puede superar eso (o modificarlos usted mismo), puede valer la pena cambiar de todos modos. Smartparents tiene otras características útiles y es mucho más flexible.
jcaw
¿Podría mencionar una característica sutil de par eléctrico que falta en smartparens, @JackCC?
Omar
Ha pasado un tiempo desde que cambié, por lo que pueden estar mal, pero fuera de mi cabeza: si tiene una llave de cierre inmediatamente después del cursor (o con un espacio en blanco entre ellas), al escribir la llave de apertura electric-pairse respetará el cierre existente abrazadera. En smartparens, siempre se crea una nueva llave de cierre a menos que esté en modo estricto (que tiene otros efectos secundarios fuertes). Por ejemplo: |)-> (|)en electric-pairversus |)-> (|))en smartparens. El símbolo de la tubería |representa el cursor.
jcaw
Del mismo modo, si está dentro electric-pairy tiene una llave de cierre cuatro líneas hacia abajo con solo un espacio en blanco entre su cursor y la llave de cierre y escribe esa llave de cierre, reemplazará la llave de abajo, haciendo que quede al ras con el cursor. Eso no sucede a smartparensmenos que esté en modo estricto. Este es un buen acceso directo al editar algo como lisp (o incluso algo como Python, sinceramente) porque reduce la sobrecarga cognitiva de formatear las expresiones s. Sin embargo, puede hacer que los frenos de equilibrio sean más confusos.
jcaw
Creo que electric-pairtambién hereda sus pares de la tabla de sintaxis del modo actual, mientras smartparensque hay que programar explícitamente en cada par. Aunque podría estar equivocado sobre eso.
jcaw
2

Actualización: la respuesta de @ xuhdev es preferible ya que no interfiere con el código de Emacs.

Puede valer la pena una solicitud de función que tenga que personalizar. Por el momento, parece trivial modificar el código en cuestión.

Luego cargue su propia variante de la función de par eléctrico posterior a la inserción automática

Abra elec-pair.el y copie desde allí

(defun electric-pair-post-self-insert-function ()
[ ... ] )

Luego busque en el cuerpo cualquier

(memq syntax '(?\( ?\) ?\" ?\$))

y eliminar el ?\"de allí, es decir

(memq syntax '(?\( ?\) ?\$))

pero no eliminar? \ "en otros lugares (!)

y recargar, es decir, evaluar la función modificada.

Para recargar en la próxima sesión, colóquelo en un archivo "my-changed-stuff.el" y cárguelo desde su archivo init.

Andreas Röhler
fuente
Esta es la única solución que funcionó para emacs 24.3.1.
Ben