Koppeln Sie keine Anführungszeichen im Elektro-Paar-Modus


7

Wie kann ich electric-pair-modezu nicht Paar Anführungszeichen (einfach oder doppelt)? Ich möchte immer noch, dass alles andere (Klammern, Klammern usw.) gepaart wird, nur keine Anführungszeichen.


Haben Sie versucht, anzupassen electric-pair-inhibit-predicate?
Elethan

@elethan wo finde ich diese electric-pair-inhibit-predicateVariable? Es ist meinen Emacs 24.3.1
ggll

@ggll Ich benutze Emacs 25.1.1 und für mich ist es in elec-pair.el.
Elethan

In Quelle electric-pair-mode, electric-pair-pairsund electric-pair-text-pairsist individuell gestaltet werden verwendet, aber electric-pair-text-syntax-tablehat Vorrang. Ein Hook, der diese Variablen lokal setzt, sollte ausreichen, damit dies funktioniert. Ich werde später prüfen, ob dies der Fall ist, und eine Antwort posten.
DoMiNeLa10

Antworten:


5

Fügen Sie Ihrer Emacs-Init-Datei Folgendes hinzu:

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

Referenz aus meinem Blog-Beitrag: https://www.topbug.net/blog/2016/09/29/emacs-disable-certain-pairs-for-electric-pair-mode/


1
Das funktioniert bei mir nicht. Doppelte Anführungszeichen werden weiterhin gepaart.
Ben

@ Ben Welche Emacs-Version hast du? Bitte fügen Sie diese Informationen Ihrer Frage hinzu. Bitte versuchen Sie den Code aus dieser Antwort mit emacs -Q(Emacs gestartet mit Befehlszeilenoption -Q). Vielleicht stört ein anderes Paket. Der Code funktioniert für mich mit GNU Emacs 25.3.1 (x86_64-unknown-cygwin, GTK + Version 3.22.20) vom 11.09.2017.
Tobias

Ich füge eine Antwort hinzu, da ich noch keinen Kommentar abgeben kann. @xuhdev hat die richtige Antwort, aber aus Gründen, die ich in meinem System nicht wirklich verstehe, wenn ich bewerte: (setq elektrisches Paar-Hemmungs-Prädikat (Lambda (c) (if (char-gleich c? \ ") t (elektrisch) -Pair-Default-Inhibit c)))) Ich erhalte (Lambda (c) (wenn (char-gleich c 34) t (Electric-Pair-Default-Inhibit c))). Versuchen Sie also Mx Customize-Variable, wählen Sie Electric -Paar-Inhibit-Prädikat, und wählen Sie dann aus der Wert-Menü-Funktion und schreiben Sie in das Feld: (Lambda (c) (if (char-gleich c? \ ") t (Electric-Pair-Default-Inhibit c)) ) Auf diese Weise funktioniert es für meine Konfigurationen bei emac
D. Dimakakos

Bitte posten Sie keine Pseudo-Antwort anstelle eines Kommentars. Wenn Sie ein paar "Reputations" -Punkte erhalten, können Sie Kommentare abgeben. Wenn Sie sich fragen, warum ?\"am Ende als gedruckt wird 34, liegt dies daran, dass das "Zeichen mit der Ganzzahl identisch ist 34. In Emacs sind Zeichen positive ganze Zahlen eines bestimmten Bereichs.
Drew

Dies muss ein Problem mit der electric.el-Version sein. Ich benutze GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu) of 2016-01-13.
Ben

3

Es scheint, dass Sie nicht können. Mit den verschiedenen Anpassungen können Sie nur Paare hinzufügen.

Wenn Sie bereit sind, ein anderes Paket für Ihre Paarung zu verwenden, können Sie smartparens ausprobieren . Sie können Anführungszeichen so festlegen, dass sie nicht wie folgt gekoppelt werden:

(sp-pair "'" nil :actions :rem)
(sp-pair "\"" nil :actions :rem)

Beachten Sie, dass Smartparens einige subtile Merkmale von Electric-Pair fehlen, die nicht sofort offensichtlich sind. Wenn Sie darüber hinwegkommen (oder sie selbst modifizieren können), kann es sich trotzdem lohnen, zu wechseln. Smartparents hat andere nützliche Funktionen und ist viel flexibler.
Jcaw

Könnten Sie eine subtile Funktion für elektrische Paare erwähnen, die bei smartparens fehlt, @JackCC?
Omar

Es ist schon eine Weile her, seit ich gewechselt habe, daher sind diese möglicherweise falsch, aber auf den ersten electric-pairBlick : Wenn Sie eine schließende Klammer unmittelbar hinter dem Cursor haben (oder mit Leerzeichen dazwischen), wird durch Eingeben der öffnenden Klammer das vorhandene Schließen berücksichtigt Klammer. In smartparenswird immer eine neue schließende Klammer erstellt, es sei denn, Sie befinden sich im strengen Modus (der andere starke Nebenwirkungen hat). Zum Beispiel: |)-> (|)in electric-pairversus |)-> (|))in smartparens. Das Pipe-Symbol |repräsentiert den Cursor.
Jcaw

Wenn Sie sich in electric-paireiner schließenden Klammer befinden, die vier Zeilen tiefer liegt und nur Leerzeichen zwischen Ihrem Cursor und der schließenden Klammer enthält, und diese schließende Klammer eingeben, wird die darunter liegende Klammer ersetzt, sodass sie bündig mit dem Cursor abschließt. Das passiert nur, smartparenswenn Sie sich im strengen Modus befinden. Dies ist eine nette Abkürzung, wenn Sie etwas wie lisp (oder ehrlich gesagt sogar etwas wie Python) bearbeiten, da dies den kognitiven Aufwand für die Formatierung von S-Ausdrücken verringert. Es kann jedoch das Auswuchten von Zahnspangen verwirrender machen.
Jcaw

Ich glaube, electric-pairerbt auch seine Paare von der Syntaxtabelle des aktuellen Modus, während smartparensSie in jedem Paar explizit programmieren müssen. Da könnte ich mich allerdings irren.
Jcaw

2

Update: Die Antwort von @ xuhdev ist vorzuziehen, da sie den Emacs-Code nicht beeinträchtigt.

Könnte eine Feature-Anfrage wert sein, die anpassbar ist. Im Moment erscheint es trivial, den fraglichen Code zu ändern.

Laden Sie anschließend Ihre eigene Variante der Elektro-Paar-Post-Self-Insert-Funktion

Öffnen Sie elec-pair.el und kopieren Sie von dort

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

Dann schau in den Körper nach irgendwelchen

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

und löschen Sie die ?\"von dort, dh

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

aber nicht löschen? \ "an anderen Stellen (!)

und neu laden, dh die geänderte Funktion auswerten.

Um es bei der nächsten Sitzung neu zu laden, legen Sie es in eine Datei "my-changed-stuff.el" und laden Sie diese aus Ihrer Init-Datei.


Dies ist die einzige Lösung, die für Emacs 24.3.1 funktioniert hat.
Ben
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.