smartparensは、単一の対の文字を挿入しますか?


8

Q:smartparensペアの文字または単一の文字を挿入するタイミングに関するの決定ルールをどのように調整できますか?

smartparens単一引用符を挿入する場合(例:または)は、ほとんどがスマートに見えます。したがって、デフォルトではsのペアを挿入し、それらの間にカーソルを置きますが、単語の終わりに呼び出された場合 、収縮を見越して1つだけを挿入します。したがって、たとえば:text-modeorg-mode''

  • '=> '*'*ポイントはどこですか)
  • can + '=> can'*(「できません」と書き続けることができるので)

しかし、私が直そうとしているしゃっくりがあります。私はしばしばピリオドで終わる省略形を使用しますが、それらを所有格にしたいと思います。たとえば、「so」は「someone」の省略形として書くので、「so's」は「someone's」になります。問題はsmartparens、ピリオドの'後にペアを挿入することです:

  • 私が欲しいもの:s.o. + '=>s.o.'*
  • 私が得るもの:s.o. + '=>s.o.'*'

私の具体的なsmartparens問題は'、の動作に関するものですが、これは他のキャラクターについてもより一般的な問題であると想像できます。

だから、どうすればsmartparens文字のセットを拡張してその後に1つだけ挿入するように、の決定ルールを微調整でき'ますか?

PS:面白いことに、emacsで「smartparens」を入力しようとすると、同じ刺激的な動作が得られます。

回答:


2

はい、条件付きペアで:

;; 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
下部はまったく無関係に見えます。上部はそれ自体では何もしないように見えます。答えを機能的なものに変えていただけませんか?
wasamasa 2015年

それは本当です...コピーと貼り付けは失敗します。修繕。
PythonNut 2015年

ご意見をお寄せいただきありがとうございmy-sp-pair-functionます。目的の機能が提供されていないようです。これにより、句読点の後(ペア挿入)の前と同じ動作が得られますが、英数字の後でもペア挿入が行われ、縮小が解除されます。
ダン

@ダン、これは一般的なソリューションであることを意味していました。あなたは、例えばこのように条件を置き換えることができます(and (or (looking-at "[[:space:][:punct:]]") (sp-point-before-eol-p id action context)) (not (looking-back "[.`]")))
PythonNut

2

関数sp-pairとを使用して、smartparenの動作を変更できsp-local-pairます。smartparens wikiはこれらの機能を詳細に説明しています。

基本的には、次のようにして動作をグローバルにカスタマイズできます

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

または一部のモードのみの動作をカスタマイズする

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

どこdesired-modeあなたが行動をカスタマイズするためのモードであり、my-custom-predicatesmartparensは、それが自動的にペアを挿入する必要があるかどうかを判断するために使用する必要がある機能です。

sp-pairのドキュメント文字列から、カスタム述語が受け入れる必要があります

開始区切り文字(ペアを一意に決定する)、アクション、およびコンテキスト。コンテキスト引数には次の値を指定できます。

  • 文字列-ポイントが文字列内にある場合。
  • コメント-ポイントがコメント内にある場合。
  • コード-ポイントがコード内にある場合。このコンテキストは、文字列のセマンティクスを定義するプログラミングモードでのみ認識されます。

したがって、:unless特定のケースで述語として使用できるカスタム関数は、次のようになります。

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

述語が実行さ<punctuation>'れている.'|ときにポイントになるので、私は正規表現をチェックしていることに注意してください。

最後に、あなたはそれをsmartparensにフックすることができます

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

おかげで、その道の一部になりましたが、具体的な例を挙げていただけますか?私は、述語関数(例えば、様々な形態の試してみた(defun predp () (sp--looking-back-p "[[:space:][:punct:]]")))が、smartparensそれらをすべて無視します。
ダン

こんにちは@Dan、私はあなたの特定の問題に対する解決策を答えに追加しました。あなたは述語で必要な引数を受け入れていませんでした、そしてまた使用された正規表現は少しずれていました
Iqbal Ansari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.