Smartparens Einzel- oder Paarzeichen einfügen?


8

F: Wie kann ich die smartparensEntscheidungsregeln für das Einfügen eines gepaarten oder einzelnen Zeichens anpassen?

smartparensscheint beim Einfügen von einfachen Anführungszeichen (z. B. in oder ) meistens klug zu sein . Daher wird standardmäßig ein Paar von s eingefügt und der Cursor dazwischen platziert, aber wenn es am Ende eines Wortes aufgerufen wird, wird nur ein einzelnes in Erwartung von Kontraktionen eingefügt. Also zB:text-modeorg-mode''

  • '=> '*'(wo *ist Punkt)
  • can + '=> can'*(damit ich weiter schreiben kann "kann nicht")

Es gibt jedoch einen Schluckauf, den ich beheben möchte. Ich verwende oft Abkürzungen, die in einem Punkt enden, möchte sie aber besitzergreifend machen. Zum Beispiel könnte ich "so" als Abkürzung für "jemand" schreiben, und daher wäre "so" "jemandes". Das Problem ist, dass nach einem Punkt smartparensein Paired eingefügt 'wird:

  • was ich will: s.o. + '=>s.o.'*
  • was ich bekomme: s.o. + '=>s.o.'*'

Mein spezifischer Streitpunkt ist smartparensdas Verhalten von ', aber ich kann mir vorstellen, dass dies auch bei anderen Charakteren ein allgemeineres Problem ist.

Also: Wie kann ich die smartparensEntscheidungsregel optimieren , um den Zeichensatz zu erweitern, wonach nur noch ein einziger eingefügt wird '?

PS: Amüsanterweise führt der Versuch, "Smartparens" in Emacs einzugeben, zu demselben irritierenden Verhalten.

Antworten:


2

Ja, mit Paarungsbedingungen:

;; 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)))

1
Der untere Teil sieht völlig unabhängig aus. Der obere Teil sieht so aus, als würde er nichts alleine machen. Könnten Sie bitte Ihre Antwort in etwas Funktionales verwandeln?
Wasamasa

Das ist wahr ... Kopieren und Einfügen schlägt fehl. Fest.
PythonNut

Vielen Dank für die Gedanken, my-sp-pair-functionscheint aber nicht die gewünschte Funktionalität zu bieten. Es gibt mir das gleiche Verhalten wie zuvor nach der Interpunktion (gepaarte Einfügung), aber jetzt führt es auch eine gepaarte Einfügung nach alphanumerischen Zeichen durch, wodurch die Kontraktionen gebrochen werden.
Dan

@ Dan, dies sollte eine allgemeine Lösung sein. Sie können zum Beispiel die Bedingung durch folgende ersetzen:(and (or (looking-at "[[:space:][:punct:]]") (sp-point-before-eol-p id action context)) (not (looking-back "[.`]")))
PythonNut

2

Sie können das Verhalten von smartparen mithilfe der Funktionen sp-pairund ändern sp-local-pair. Das smartparens Wiki erklärt diese Funktionen ausführlich.

Grundsätzlich können Sie Folgendes tun, um das Verhalten global anzupassen

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

ODER, um das Verhalten nur für einige Modi anzupassen

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

Wo desired-modeist der Modus, für den Sie das Verhalten anpassen möchten, und welche my-custom-predicateFunktion sollten Smartparens verwenden, um zu bestimmen, ob das Paar automatisch eingefügt werden soll.

Aus sp-pairder Dokumentzeichenfolge sollte das benutzerdefinierte Prädikat akzeptieren

Öffnungsbegrenzer (der das Paar eindeutig bestimmt), Aktion und Kontext. Das Kontextargument kann Werte haben:

  • Zeichenfolge - Wenn der Punkt innerhalb der Zeichenfolge liegt.
  • Kommentar - Wenn der Punkt im Kommentar enthalten ist.
  • Code - wenn der Punkt innerhalb des Codes liegt. Dieser Kontext wird nur in Programmiermodi erkannt, die die Zeichenfolgensemantik definieren.

Eine benutzerdefinierte Funktion, die :unlessin Ihrem speziellen Fall als Prädikat verwendet werden kann, lautet also wie folgt

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

Beachten Sie, dass ich nach dem regulären Ausdruck suche, <punctuation>'da der Punkt sein würde, an .'|dem das Prädikat ausgeführt wird.

Schließlich können Sie es in Smartparens einbinden, indem Sie dies tun

(sp-pair  "'" nil :unless'(predp))

Danke, das bringt mich auf den Weg dorthin, aber könnten Sie ein konkretes Beispiel geben? Ich habe verschiedene Formen der Prädikatfunktion ausprobiert (z. B. (defun predp () (sp--looking-back-p "[[:space:][:punct:]]"))), smartparensignoriere sie jedoch alle.
Dan

Hallo @Dan, ich habe der Antwort die Lösung für Ihr spezifisches Problem hinzugefügt. Sie haben die erforderlichen Argumente im Prädikat nicht akzeptiert, auch der verwendete reguläre Ausdruck war leicht falsch
Iqbal Ansari
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.