lisp 코드를 작성할 때 때때로 중첩 표현식에 깊이 빠져 있으며 누락 된 닫는 괄호를 모두 삽입하기 만하면됩니다. 지금은 일치하지 않는 paren을 얻을 때까지 그냥 삽입하고 있지만 매우 효율적이지 않습니다.
빠진 괄호를 모두 삽입하는 명령이 있습니까?
참고로, smartparens를 사용하여 일치하는 parens를 자동으로 삽입하고 있습니다. 그럼에도 불구하고 때로는이 작업을 수행해야합니다.
lisp 코드를 작성할 때 때때로 중첩 표현식에 깊이 빠져 있으며 누락 된 닫는 괄호를 모두 삽입하기 만하면됩니다. 지금은 일치하지 않는 paren을 얻을 때까지 그냥 삽입하고 있지만 매우 효율적이지 않습니다.
빠진 괄호를 모두 삽입하는 명령이 있습니까?
참고로, smartparens를 사용하여 일치하는 parens를 자동으로 삽입하고 있습니다. 그럼에도 불구하고 때로는이 작업을 수행해야합니다.
답변:
닫히지 않은 괄호와 일치하는 쌍을 모두 닫는 함수가 있습니다. 그것은 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))))
([-!-foo]
, ])
지점 또는 )
이후에 삽입 foo]
합니까?
([-!-foo]
, 나는 )
후에 삽입 할 것 foo]
입니다. 그러나 물론 틀릴 수 있습니다. 어쩌면 @rlazo는 정교 할 수 있습니다.
그렇게하는 매우 원시적 인 (거의 확실하게 잘못된) 방법은
(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 ")")))
다른 제한 사항 중에서 삽입이 필요한 모든 괄호는 다음과 같다고 가정합니다.
특정 사용 사례에 유용 할 수있을 것 같습니다.
]
요청에 따라 모든 열린 패런을 닫아 슈퍼 오른쪽 패런으로 작동 하는 기능이있었습니다 .