Tôi đang cố gắng tạo một hàm đặt / căn chỉnh / thụt lề dấu ngoặc nhọn theo định dạng kiểu Allman (để mã hóa bằng C).
Nói chung, tôi là người hâm mộ giao diện của Smartparens dành cho người dùng để tùy chỉnh chức năng. Tôi đã viết một loạt các chức năng khác bằng giao diện Smartparens vì vậy sẽ có một ưu tiên mạnh mẽ là không chuyển đổi các gói tại thời điểm này. Điều đó nói rằng, tôi mở cho việc triển khai gói bất khả tri (ví dụ, có thể defadvice
có liên quan ở đây không?).
Về vấn đề trong tầm tay. Mục tiêu cuối cùng là gì? Giả sử chúng ta đang mã hóa và chúng ta đạt đến trạng thái được trình bày dưới đây. Biểu tượng ống đại diện cho con trỏ; Tôi đã gõ tiêu đề chức năng và dấu ngoặc mở {
và Smartparens đã tự động thêm dấu ngoặc đóng }
. Tại thời điểm này, tôi muốn nó đến mức nhấn RET
...
int main {|}
... dẫn đến những điều sau đây:
int main
{
|
}
Tôi đã có thể viết hàm dẫn đến hành vi này nhưng nó chỉ hoạt động ở cấp độ thụt đầu tiên (ví dụ: đối với chức năng chính của chúng tôi trong ví dụ trên). Tôi không thể làm cho nó hoạt động cho các mức thụt tiếp theo (xem gif):
Các mã có liên quan dưới đây. Chức năng này không đẹp nhưng tôi nghĩ nó sẽ hoạt động ... Dòng cuối cùng là giao diện cho Smartparens.
Bất kỳ đề xuất?
(defun my-create-newline-and-enter-sexp (&rest _ignored)
"Open a new brace or bracket expression, with relevant newlines and indent. "
(interactive)
(progn
(backward-char 2) (newline) (forward-char) (newline)
(indent-according-to-mode)
(previous-line 2) (indent-according-to-mode)
(next-line) (next-line) (indent-according-to-mode)))
(sp-local-pair 'c-mode "{" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))