保留中のすべての括弧を閉じる


14

Lispコードを書くとき、私は時々ネストされた式に深くなっていて、私が欲しいのは、欠けている閉じ括弧をすべて挿入することです。現時点では、不一致の括弧が表示されるまでそれらを挿入していますが、効率的ではありません。
不足している括弧をすべて挿入するコマンドはありますか?

参考までに、私はsmartparensを使用して、一致する括弧を自動的に挿入しています。それでも、時々これを行う必要があるだけです。


2
FWIW、Franz Lisp(CLの前)には、]要求に応じて、すべての開いているかっこを閉じる、超右のかっことして動作する機能がありました。
ドリュー

2
私は過去に同じ方法論を使用しました。それ以来、pareditの使用を開始しました。これにより、問題が開始する前に停止します。唯一の注意点は、コードの貼り付けでは同じバランスの処理が行われないことです。
elarson

回答:


6

これは、閉じられていない括弧と他の一致したペアをすべて閉じる関数です。Emacsのsexp解析に依存しています。単一文字の一致ペアのみをサポートしているため、のようなもの{-はで閉じられ}ません-}。Lispでは、それは問題ではありません。

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

IIUC、これには、一致する括弧のセット内にポイントがないことが必要です。私は、OQがLisp式内の一部から機能する必要があるという印象を受けていました。
マラバルバ14年

@Malabarbaこれは、ポイントの後に既に一致する閉じ括弧があったかどうかに関係なく、以前に開いたすべての括弧を閉じます。それが私が質問を理解する方法ですが、この点については明らかに明らかではありません。あなたの解釈では、終了区切り文字はどこに挿入されますか?と例えば([-!-foo]、あなたが挿入しない])時点で、または)後にfoo]
ジル「SO-悪であるのをやめる」14年

私の理解から、もしあれば([-!-foo]、私は)後に挿入しfoo]ます。しかし、私はもちろん間違っている可能性があります。たぶん、@ rlazoは詳しく説明できます。
マラバルバ14年

私のユースケースでは、@ Gillesは正しいです。ポイントの後に区切り文字が閉じられているかどうかは気にしません。ポイントの前にあるすべてのものを閉じたいです。
rlazo

3

スライムがインストールされている場合、これを行うコマンドがあります。 slime-close-all-parens-in-sexp


うーん...だから、これは現在の行で閉じるように見えます。「現在のブロック」を閉じるアプローチがあればいいかもしれません。これは、ファイルの最後に移動し、閉じたものが見つからなくなるまでsexpを後方に移動することで実現できます。
午前

1

それを行うための非常に原始的な(そしてほぼ間違いなく)方法は

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

他の制限の中で、挿入が必要なすべての括弧は次のことを前提としています。

  • 締め切り
  • 現在の場所で必要

私はそれがあなたの特定のユースケースに役立つのに十分かもしれないと思う


閉じ括弧が多すぎると、これは無限ループに陥ります。
エミルヴィクストローム14年

@EmilVikströmうん、それは確かに私の最初に述べた制限と互換性がありません:)
シグマ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.