From 104b5b1d5c994742a8fe7e2d57e54ddacd9b1b46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 21 Dec 2025 02:25:20 +0000 Subject: [PATCH] Update documentation to use quoted format for define-tp and define-tp-group - Update README.md with new quoted format examples - Update README_CN.md with new quoted format examples - Simplify format descriptions (merged Format 2 and 3 into one) Co-authored-by: Kinneyzhang <38454496+Kinneyzhang@users.noreply.github.com> --- README.md | 408 ++++++++++++++++++++++++--------------------------- README_CN.md | 406 ++++++++++++++++++++++++-------------------------- 2 files changed, 389 insertions(+), 425 deletions(-) diff --git a/README.md b/README.md index 3f5ede4..4b97758 100644 --- a/README.md +++ b/README.md @@ -195,8 +195,8 @@ Native APIs only have simple set and get. tp.el provides three clear operation s ```elisp ;; Property layer usage example -(tp-define-layer highlight (face (:background "yellow"))) -(tp-define-layer error (face (:foreground "red"))) +(tp-define-layer 'highlight '(face (:background "yellow"))) +(tp-define-layer 'error '(face (:foreground "red"))) ;; Stack multiple property layers (tp-push-layer 1 10 'highlight) @@ -239,8 +239,8 @@ Native APIs require manual searching and looping. tp.el provides convenient patt ;; Define a layer with reactive properties (defvar my-color "red") ;; Reactive variable -(tp-define-layer my-highlight - :props (face (:foreground $my-color))) +(tp-define-layer 'my-highlight + :props '(face (:foreground $my-color))) ;; Apply the layer (tp-push-layer 1 10 'my-highlight) @@ -249,8 +249,8 @@ Native APIs require manual searching and looping. tp.el provides convenient patt (setq my-color "blue") ;; All text with my-highlight layer updates to blue! ;; Advanced example with :data, :compute, and :watch -(tp-define-layer full-name-layer - :props (help-echo $full-name face (:foreground $name-color)) +(tp-define-layer 'full-name-layer + :props '(help-echo $full-name face (:foreground $name-color)) :data ((first-name . "John") (last-name . "Doe")) ;; With initial values :compute ((full-name (lambda () (concat first-name " " last-name)))) :watch ((first-name (lambda (new old layer) @@ -435,8 +435,8 @@ LAYER-NAME can be a symbol representing a layer defined by `tp-define-layer` or ;; => (1 . 10) ;; Use a defined layer name -(tp-define-layer warning-style - (face (:foreground "orange" :weight bold))) +(tp-define-layer 'warning-style + '(face (:foreground "orange" :weight bold))) (with-temp-buffer (insert "Hello World") (tp-set 1 10 'warning-style)) @@ -460,8 +460,8 @@ LAYER-NAME can be a symbol representing a layer defined by `tp-define-layer` or ;; => #("Hello" 0 5 (face bold mouse-face highlight)) ;; Use a defined layer name on entire string -(tp-define-layer my-style - :props (face (:foreground $my-color)) +(tp-define-layer 'my-style + :props '(face (:foreground $my-color)) :data ((my-color . "blue"))) (tp-set " " 'my-style) ;; => #(" " 0 1 (tp-name my-style face (:foreground "blue") ...)) @@ -497,8 +497,8 @@ LAYER-NAME can be a symbol representing a layer defined by `tp-define-layer` or ;; => #("Hello" 0 5 (face italic)) ;; Use a defined layer name -(tp-define-layer error-style - (face (:foreground "red" :weight bold))) +(tp-define-layer 'error-style + '(face (:foreground "red" :weight bold))) (with-temp-buffer (insert "Hello World") (tp-reset 1 10 'error-style)) @@ -545,8 +545,8 @@ LAYER-NAME can be a symbol representing a layer defined by `tp-define-layer` or ;; => (shadow bold) ;; Use a defined layer name -(tp-define-layer highlight-style - (face (:background "yellow"))) +(tp-define-layer 'highlight-style + '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-set 1 10 '(face bold)) @@ -850,8 +850,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => #("Hello world" 0 5 (face bold) 6 11 (face bold)) ;; Use a defined layer name -(tp-define-layer todo-style - (face (:foreground "orange" :weight bold))) +(tp-define-layer 'todo-style + '(face (:foreground "orange" :weight bold))) (with-temp-buffer (insert "TODO: fix this. TODO: also this.") (tp-match-set "TODO" 'todo-style)) @@ -891,8 +891,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => ((1 . 5) (12 . 17)) ;; Use a defined layer name -(tp-define-layer alert-style - (face (:background "red" :foreground "white"))) +(tp-define-layer 'alert-style + '(face (:background "red" :foreground "white"))) (with-temp-buffer (insert "TODO: fix this") (tp-match-reset "TODO" 'alert-style)) @@ -932,8 +932,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => ((1 . 5) (12 . 17)) ;; Use a defined layer name -(tp-define-layer underline-style - (face (:underline (:color "blue" :style wave)))) +(tp-define-layer 'underline-style + '(face (:underline (:color "blue" :style wave)))) (with-temp-buffer (insert "TODO: fix this") (tp-match-add "TODO" 'underline-style)) @@ -974,8 +974,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => #("abc 123 XYZ" 4 7 (face bold) 8 11 (face bold)) ;; Use a defined layer name -(tp-define-layer number-style - (face (:foreground "green"))) +(tp-define-layer 'number-style + '(face (:foreground "green"))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-set "[0-9]+" 'number-style)) @@ -1016,8 +1016,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => (face italic) ;; Use a defined layer name -(tp-define-layer code-number - (face (:foreground "cyan"))) +(tp-define-layer 'code-number + '(face (:foreground "cyan"))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-reset "[0-9]+" 'code-number)) @@ -1058,8 +1058,8 @@ OBJECT is a buffer or string; nil means current buffer. ;; => (face italic help-echo "number") ;; Use a defined layer name -(tp-define-layer bold-underline - (face (:weight bold :underline t))) +(tp-define-layer 'bold-underline + '(face (:weight bold :underline t))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-add "[0-9]+" 'bold-underline)) @@ -1319,33 +1319,26 @@ The **property layer system** is tp.el's innovative feature that allows stacking Define a single text property layer. Supports multiple formats: -**Format 1 - Direct plist (legacy, no reactive features):** +**Format 1 - Direct plist (no reactive features):** ```elisp -(tp-define-layer layer-name - (face (:background "cyan") line-prefix ">>")) +(tp-define-layer 'layer-name + '(face (:background "cyan") line-prefix ">>")) ``` -**Format 2 - With :props keyword:** +**Format 2 - With :props, :data, :watch, and/or :compute (Vue 3 style reactivity):** ```elisp -(tp-define-layer layer-name - :props (face (:background "cyan") line-prefix ">>")) -``` - -**Format 3 - With :props, :data, :watch, and/or :compute (Vue 3 style reactivity):** - -```elisp -(tp-define-layer layer-name +(tp-define-layer 'layer-name ;; props: $-prefixed symbols are reactive variables; auto-defined if not bound - :props (face (:foreground $my-color) help-echo $full-name) + :props '(face (:foreground $my-color) help-echo $full-name) ;; data: additional reactive variables not used in props; can include initial values - :data ((first-name . "John") (last-name . "Doe")) + :data '((first-name . "John") (last-name . "Doe")) ;; compute: list of (VAR-NAME FUNCTION) - compute reactive variable values - :compute ((full-name (lambda () (concat first-name " " last-name)))) + :compute '((full-name (lambda () (concat first-name " " last-name)))) ;; watch: list of (VAR-NAME CALLBACK) - side effects when vars change - :watch ((my-color (lambda (new old layer) - (message "Color changed from %s to %s" old new))))) + :watch '((my-color (lambda (new old layer) + (message "Color changed from %s to %s" old new))))) ``` **Reactive Variables:** @@ -1366,25 +1359,17 @@ If a layer with the same name already exists, it will be overwritten with the ne ;; Define individual layers using Format 1 (direct plist) (progn (setq tp-layer-alist nil) ; Reset for clean example - (tp-define-layer highlight - (face (:background "yellow" :foreground "black"))) + (tp-define-layer 'highlight + '(face (:background "yellow" :foreground "black"))) (tp-layer-props 'highlight)) ;; => (face (:background "yellow" :foreground "black") tp-name highlight) -;; Define a layer using Format 2 (:props keyword) -(progn - (tp-define-layer error - :props (face (:background "red" :foreground "white") - help-echo "Error!")) - (tp-layer-props 'error)) -;; => (face (:background "red" :foreground "white") help-echo "Error!" tp-name error) - -;; Define a reactive layer (Format 3) +;; Define a reactive layer (progn (tp-layer-reset) (defvar theme-color "blue") - (tp-define-layer themed-layer - :props (face (:foreground $theme-color))) + (tp-define-layer 'themed-layer + :props '(face (:foreground $theme-color))) ;; Apply the layer (with-temp-buffer (insert "Hello World") @@ -1396,8 +1381,8 @@ If a layer with the same name already exists, it will be overwritten with the ne ;; Redefine an existing layer (overwrites the old definition) (progn - (tp-define-layer test-layer (face bold)) - (tp-define-layer test-layer (face italic)) ; Overwrites + (tp-define-layer 'test-layer '(face bold)) + (tp-define-layer 'test-layer '(face italic)) ; Overwrites (tp-layer-props 'test-layer)) ;; => (face italic tp-name test-layer) ``` @@ -1406,57 +1391,57 @@ If a layer with the same name already exists, it will be overwritten with the ne #### `tp-define-layer-group` - Define Layer Group -Define a group of multiple layers. Supports four formats for each element: +Define a group of multiple layers. Supports multiple formats for each element: **Format 1 - Anonymous layers (named as GROUP-NAME-0, GROUP-NAME-1, etc.):** ```elisp -(tp-define-layer-group tp-test-moons - (display "🌑" face (:height 1.0)) - (display "🌘" face (:height 1.5)) - (display "🌗" face (:height 2.0))) +(tp-define-layer-group 'tp-test-moons + '(display "🌑" face (:height 1.0)) + '(display "🌘" face (:height 1.5)) + '(display "🌗" face (:height 2.0))) ;; Creates layers: tp-test-moons-0, tp-test-moons-1, tp-test-moons-2 ``` **Format 2 - Named layers with cons-cell (named as GROUP-NAME-suffix):** ```elisp -(tp-define-layer-group tp-test-moons - ("新月" . (display "🌑" face (:height 1.0))) - ("残月" . (display "🌘" face (:height 1.5))) - ("下弦月" . (display "🌗" face (:height 2.0)))) +(tp-define-layer-group 'tp-test-moons + '("新月" . (display "🌑" face (:height 1.0))) + '("残月" . (display "🌘" face (:height 1.5))) + '("下弦月" . (display "🌗" face (:height 2.0)))) ;; Creates layers: tp-test-moons-新月, tp-test-moons-残月, tp-test-moons-下弦月 ``` **Format 3 - Named layers with :props keyword (named as GROUP-NAME-suffix):** ```elisp -(tp-define-layer-group tp-test-moons - ("新月" :props (display "🌑" face (:height 1.0))) - ("残月" :props (display "🌘" face (:height 1.5))) - ("下弦月" :props (display "🌗" face (:height 2.0)))) +(tp-define-layer-group 'tp-test-moons + '("新月" :props (display "🌑" face (:height 1.0))) + '("残月" :props (display "🌘" face (:height 1.5))) + '("下弦月" :props (display "🌗" face (:height 2.0)))) ;; Creates layers: tp-test-moons-新月, tp-test-moons-残月, tp-test-moons-下弦月 ``` **Format 4 - Named layers with :props, :data, :watch, and/or :compute (Vue 3 style reactivity):** ```elisp -(tp-define-layer-group reactive-group - ("reactive" :props (face (:foreground $my-color) help-echo $full-name) - :data ((first-name . "John") (last-name . "Doe")) - :compute ((full-name (lambda () (concat first-name " " last-name)))) - :watch ((my-color (lambda (new old layer) (message "Changed!")))))) +(tp-define-layer-group 'reactive-group + '("reactive" :props (face (:foreground $my-color) help-echo $full-name) + :data ((first-name . "John") (last-name . "Doe")) + :compute ((full-name (lambda () (concat first-name " " last-name)))) + :watch ((my-color (lambda (new old layer) (message "Changed!")))))) ;; Creates layer: reactive-group-reactive with full reactive support ``` You can also reference already-defined layers in a group: ```elisp -(tp-define-layer existing-layer (face bold)) -(tp-define-layer-group my-group - existing-layer ; Reference existing layer - (face (:background "red") line-prefix ">>") ; Anonymous layer - ("named" . (face italic))) ; Named layer +(tp-define-layer 'existing-layer '(face bold)) +(tp-define-layer-group 'my-group + 'existing-layer ; Reference existing layer + '(face (:background "red") line-prefix ">>") ; Anonymous layer + '("named" . (face italic))) ; Named layer ``` If a layer group with the same name already exists, it will be overwritten. @@ -1469,16 +1454,13 @@ The first layer in the definition is the top layer (visible by default). (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer highlight - (face (:background "yellow" :foreground "black"))) - (tp-define-layer error - (face (:background "red" :foreground "white"))) - (tp-define-layer info - (face (:background "blue" :foreground "white"))) - (tp-define-layer-group status-colors - highlight - error - info) + (tp-define-layer 'highlight + '(face (:background "yellow" :foreground "black"))) + (tp-define-layer 'error + '(face (:background "red" :foreground "white"))) + (tp-define-layer 'info + '(face (:background "blue" :foreground "white"))) + (tp-define-layer-group 'status-colors 'highlight 'error 'info) (length (tp-group-props 'status-colors))) ;; => 3 @@ -1486,11 +1468,11 @@ The first layer in the definition is the top layer (visible by default). (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer-group moon-phases - ("new" . (display "🌑")) - ("waxing-crescent" . (display "🌒")) - ("first-quarter" . (display "🌓")) - ("full" . (display "🌕"))) + (tp-define-layer-group 'moon-phases + '("new" . (display "🌑")) + '("waxing-crescent" . (display "🌒")) + '("first-quarter" . (display "🌓")) + '("full" . (display "🌕"))) (tp-layer-props 'moon-phases-full)) ;; => (display "🌕" tp-name moon-phases-full) ``` @@ -1512,7 +1494,7 @@ Get properties for a layer or all layers in a group. ;; Get layer properties (progn (setq tp-layer-alist nil) - (tp-define-layer my-layer (face bold help-echo "tip")) + (tp-define-layer 'my-layer '(face bold help-echo "tip")) (tp-layer-props 'my-layer)) ;; => (face bold help-echo "tip" tp-name my-layer) @@ -1520,9 +1502,9 @@ Get properties for a layer or all layers in a group. (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer-group my-group layer1 layer2) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer-group 'my-group 'layer1 'layer2) (length (tp-group-props 'my-group))) ;; => 2 ``` @@ -1544,7 +1526,7 @@ Remove layer or group definition. ;; Undefine a layer (progn (setq tp-layer-alist nil) - (tp-define-layer temp-layer (face bold)) + (tp-define-layer 'temp-layer '(face bold)) (tp-undefine-layer 'temp-layer) (tp-layer-props 'temp-layer)) ;; => nil @@ -1553,8 +1535,8 @@ Remove layer or group definition. (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer l1 (face bold)) - (tp-define-layer my-group l1) + (tp-define-layer 'l1 '(face bold)) + (tp-define-layer-group 'my-group 'l1) (tp-undefine-group 'my-group) (assoc 'my-group tp-layer-groups)) ;; => nil @@ -1574,7 +1556,7 @@ Clear all layer and group definitions, including all reactive dependencies and w ```elisp (progn - (tp-define-layer test-layer (face bold)) + (tp-define-layer 'test-layer '(face bold)) (tp-layer-reset) (list tp-layer-alist tp-layer-groups)) ;; => (nil nil) @@ -1598,8 +1580,8 @@ This is useful when you want to remove all reactive bindings but keep the layer ;; Define a reactive layer (progn (defvar my-reactive-color "red") - (tp-define-layer reactive-layer - :props (face (:foreground $my-reactive-color))) + (tp-define-layer 'reactive-layer + :props '(face (:foreground $my-reactive-color))) ;; Clear reactive bindings only (tp-reactive-reset) ;; Layer still exists, but changing my-reactive-color no longer updates it @@ -1633,8 +1615,8 @@ Set layer(s) at a specific index position in the layer stack. ;; Put base layer at top (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1644,8 +1626,8 @@ Set layer(s) at a specific index position in the layer stack. ;; Put highlight at index 1 (below top) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1656,8 +1638,8 @@ Set layer(s) at a specific index position in the layer stack. ;; Put layer at bottom (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer info (face (:foreground "blue"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'info '(face (:foreground "blue"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1686,8 +1668,8 @@ Push a layer to the top of the stack (equivalent to `tp-put-layer ... 0`). ;; Push base layer first (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1697,8 +1679,8 @@ Push a layer to the top of the stack (equivalent to `tp-put-layer ... 0`). ;; Push highlight on top (now visible) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1729,8 +1711,8 @@ Delete a layer from anywhere in the stack by name or index. ;; Remove by name (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) - (tp-define-layer base (face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) + (tp-define-layer 'base '(face default)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1742,8 +1724,8 @@ Delete a layer from anywhere in the stack by name or index. ;; Remove top layer (idx=0) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1755,8 +1737,8 @@ Delete a layer from anywhere in the stack by name or index. ;; Remove bottom layer (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1785,8 +1767,8 @@ Remove the top layer (equivalent to `tp-delete-layer ... 0`). ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1825,9 +1807,9 @@ This is the generic layer movement function used internally by `tp-raise-layer`, ;; Move layer at index 2 to index 0 (top) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer layer3 (face underline)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer 'layer3 '(face underline)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1841,8 +1823,8 @@ This is the generic layer movement function used internally by `tp-raise-layer`, ;; Move layer by name to bottom (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1855,8 +1837,8 @@ This is the generic layer movement function used internally by `tp-raise-layer`, ;; Move on string (let ((str (copy-sequence "Hello"))) (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (tp-push-layer str 'layer1) (tp-push-layer str 'layer2) ;; layer2 is on top @@ -1885,9 +1867,9 @@ Raise a layer by N positions. Positive N moves toward top, negative moves toward ;; Move layer1 up by 2 positions (to top) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer layer3 (face underline)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer 'layer3 '(face underline)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1901,8 +1883,8 @@ Raise a layer by N positions. Positive N moves toward top, negative moves toward ;; Move layer at idx 0 down by 1 position (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1933,8 +1915,8 @@ Rotate layers - top goes to bottom, next becomes visible. ;; Stack: highlight (top) -> base (bottom) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1966,8 +1948,8 @@ Move a specific layer to the top (make it visible). ;; Make 'base the top layer (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1998,8 +1980,8 @@ Swap positions of two layers. ;; Switch layer1 and layer2 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2033,8 +2015,8 @@ Merge specified layers into a new layer. Earlier layers in the list take precede ;; Merge layer1 and layer2 into merged-layer (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2046,8 +2028,8 @@ Merge specified layers into a new layer. Earlier layers in the list take precede ;; Merge by index (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2077,8 +2059,8 @@ Flatten all layers into a single layer with the given name. ;; Flatten all layers into 'flat-layer (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2090,7 +2072,7 @@ Flatten all layers into a single layer with the given name. ;; Flatten with nil name (unnamed layer) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) + (tp-define-layer 'layer1 '(face bold)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2116,8 +2098,8 @@ Get list of all layer names in region. ```elisp (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) - (tp-define-layer base (face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) + (tp-define-layer 'base '(face default)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -2141,8 +2123,8 @@ Count layers in region. ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2166,7 +2148,7 @@ Check if layer exists in region. ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) + (tp-define-layer 'layer1 '(face bold)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2190,8 +2172,8 @@ Get name of the top (visible) layer. ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2224,8 +2206,8 @@ Add or merge properties to specific layers in a region or string. ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face (:foreground "red"))) - (tp-define-layer layer2 (face (:foreground "blue"))) + (tp-define-layer 'layer1 '(face (:foreground "red"))) + (tp-define-layer 'layer2 '(face (:foreground "blue"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2258,8 +2240,8 @@ Add or merge properties to all layers in a region or string. ```elisp (let ((str (copy-sequence "Hello World"))) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (tp-push-layer 0 5 'layer1 str) (tp-push-layer 0 5 'layer2 str) ;; Add underline to all layers @@ -2338,7 +2320,7 @@ Return layer properties for LAYER-NAME in region from START to END. ```elisp (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World Test") (tp-push-layer 1 6 'highlight) @@ -2409,13 +2391,13 @@ Return t if OBJECT has no text properties. (progn (tp-layer-reset) ;; Define layers for different highlighting purposes - (tp-define-layer code-base - (face font-lock-keyword-face)) - (tp-define-layer code-error - (face (:underline (:color "red" :style wave)) + (tp-define-layer 'code-base + '(face font-lock-keyword-face)) + (tp-define-layer 'code-error + '(face (:underline (:color "red" :style wave)) help-echo "Syntax error")) - (tp-define-layer code-debug - (face (:background "dark blue"))) + (tp-define-layer 'code-debug + '(face (:background "dark blue"))) (with-temp-buffer (insert (make-string 100 ?x)) ; Create 100-char buffer ;; Apply base highlighting @@ -2440,10 +2422,10 @@ Return t if OBJECT has no text properties. (progn (tp-layer-reset) ;; Define status layers as a group - (tp-define-layer status-todo (face (:foreground "gray"))) - (tp-define-layer status-progress (face (:foreground "yellow"))) - (tp-define-layer status-done (face (:foreground "green"))) - (tp-define-layer-group task-status status-todo status-progress status-done) + (tp-define-layer 'status-todo '(face (:foreground "gray"))) + (tp-define-layer 'status-progress '(face (:foreground "yellow"))) + (tp-define-layer 'status-done '(face (:foreground "green"))) + (tp-define-layer-group 'task-status 'status-todo 'status-progress 'status-done) ;; Check group is defined (length (tp-group-props 'task-status))) ;; => 3 @@ -2461,8 +2443,8 @@ Return t if OBJECT has no text properties. ;; Define temporary highlight layer (progn (tp-layer-reset) - (tp-define-layer temp-highlight - (face (:background "yellow"))) + (tp-define-layer 'temp-highlight + '(face (:background "yellow"))) (tp-layer-props 'temp-highlight)) ;; => (face (:background "yellow") tp-name temp-highlight) @@ -2496,8 +2478,8 @@ Traditional text property manipulation requires manually updating all affected t ;; Reactive approach (automatic updates) (defvar my-color "red") -(tp-define-layer my-layer - :props (face (:foreground $my-color))) +(tp-define-layer 'my-layer + :props '(face (:foreground $my-color))) (tp-push-layer 1 10 'my-layer) ;; Just change the variable - all text updates automatically! (setq my-color "blue") ; All regions with my-layer update instantly! @@ -2518,8 +2500,8 @@ Traditional text property manipulation requires manually updating all affected t ```elisp (defvar highlight-color "yellow") -(tp-define-layer my-highlight - :props (face (:background $highlight-color))) +(tp-define-layer 'my-highlight + :props '(face (:background $highlight-color))) (with-temp-buffer (insert "Hello World") @@ -2537,8 +2519,8 @@ Traditional text property manipulation requires manually updating all affected t (defvar fg-color "white") (defvar bg-color "black") -(tp-define-layer themed-text - :props (face (:foreground $fg-color :background $bg-color))) +(tp-define-layer 'themed-text + :props '(face (:foreground $fg-color :background $bg-color))) ;; Changing either variable updates the text (setq fg-color "yellow") ; Updates foreground @@ -2550,10 +2532,10 @@ Traditional text property manipulation requires manually updating all affected t The `:data` keyword defines additional reactive variables that aren't directly used in `:props` but can trigger computed value updates or be watched: ```elisp -(tp-define-layer user-info - :props (help-echo $full-name) - :data (first-name last-name) ; Not used directly in props - :compute ((full-name (lambda () (concat first-name " " last-name))))) +(tp-define-layer 'user-info + :props '(help-echo $full-name) + :data '(first-name last-name) ; Not used directly in props + :compute '((full-name (lambda () (concat first-name " " last-name))))) ``` **With Initial Values:** @@ -2561,10 +2543,10 @@ The `:data` keyword defines additional reactive variables that aren't directly u You can specify initial values using cons cells: ```elisp -(tp-define-layer user-info - :props (help-echo $full-name) - :data ((first-name . "John") (last-name . "Doe")) - :compute ((full-name (lambda () (concat first-name " " last-name))))) +(tp-define-layer 'user-info + :props '(help-echo $full-name) + :data '((first-name . "John") (last-name . "Doe")) + :compute '((full-name (lambda () (concat first-name " " last-name))))) ;; first-name is now "John", last-name is now "Doe" ``` @@ -2574,14 +2556,14 @@ You can specify initial values using cons cells: The `:compute` keyword creates derived values that are automatically recalculated when their dependencies change: ```elisp -(tp-define-layer progress-display - :props (display $progress-text face (:foreground $progress-color)) - :data ((current . 0) (total . 100)) - :compute ((progress-text (lambda () (format "%d%%" (/ (* current 100) total)))) - (progress-color (lambda () - (cond ((< current 30) "red") - ((< current 70) "yellow") - (t "green")))))) +(tp-define-layer 'progress-display + :props '(display $progress-text face (:foreground $progress-color)) + :data '((current . 0) (total . 100)) + :compute '((progress-text (lambda () (format "%d%%" (/ (* current 100) total)))) + (progress-color (lambda () + (cond ((< current 30) "red") + ((< current 70) "yellow") + (t "green")))))) ;; Update progress (setq current 50) @@ -2593,8 +2575,8 @@ The `:compute` keyword creates derived values that are automatically recalculate The `:watch` keyword lets you execute callbacks when reactive variables change: ```elisp -(tp-define-layer monitored-layer - :props (face (:foreground $status-color)) +(tp-define-layer 'monitored-layer + :props '(face (:foreground $status-color)) :watch ((status-color (lambda (new-val old-val layer-name) (message "Layer %s: color changed from %s to %s" @@ -2626,8 +2608,8 @@ You can use reactive variables even without `tp-define-layer`. When you use `$`- All text property APIs (`tp-set`, `tp-match-set`, `tp-regexp-set`, etc.) now accept layer names directly: ```elisp -(tp-define-layer warning-style - :props (face (:foreground "orange" :weight bold))) +(tp-define-layer 'warning-style + :props '(face (:foreground "orange" :weight bold))) ;; Use layer name instead of plist (tp-set 1 10 'warning-style) @@ -2639,16 +2621,16 @@ All text property APIs (`tp-set`, `tp-match-set`, `tp-regexp-set`, etc.) now acc ### Reactive Layer Groups -Layer groups can also use reactive features in Format 4: +Layer groups can also use reactive features: ```elisp -(tp-define-layer-group status-indicators - ("success" :props (face (:foreground $success-color)) - :data ((success-color . "green"))) - ("warning" :props (face (:foreground $warning-color)) - :data ((warning-color . "orange"))) - ("error" :props (face (:foreground $error-color)) - :data ((error-color . "red")))) +(tp-define-layer-group 'status-indicators + '("success" :props (face (:foreground $success-color)) + :data ((success-color . "green"))) + '("warning" :props (face (:foreground $warning-color)) + :data ((warning-color . "orange"))) + '("error" :props (face (:foreground $error-color)) + :data ((error-color . "red")))) ``` ### Resetting Reactive State @@ -2670,14 +2652,14 @@ To clear all reactive dependencies and watchers: (defvar theme-accent "cyan") ;; Define theme-aware layers -(tp-define-layer code-keyword - :props (face (:foreground $theme-accent :weight bold))) +(tp-define-layer 'code-keyword + :props '(face (:foreground $theme-accent :weight bold))) -(tp-define-layer code-comment - :props (face (:foreground "gray" :slant italic))) +(tp-define-layer 'code-comment + :props '(face (:foreground "gray" :slant italic))) -(tp-define-layer code-string - :props (face (:foreground "green"))) +(tp-define-layer 'code-string + :props '(face (:foreground "green"))) ;; Apply layers to code (tp-match-set '("defun" "defvar" "let" "if" "when") 'code-keyword) diff --git a/README_CN.md b/README_CN.md index efed1c4..916d0ff 100644 --- a/README_CN.md +++ b/README_CN.md @@ -194,8 +194,8 @@ ```elisp ;; 属性层使用示例 -(tp-define-layer highlight (face (:background "yellow"))) -(tp-define-layer error (face (:foreground "red"))) +(tp-define-layer 'highlight '(face (:background "yellow"))) +(tp-define-layer 'error '(face (:foreground "red"))) ;; 堆叠多个属性层 (tp-push-layer 1 10 'highlight) @@ -238,8 +238,8 @@ ;; 定义一个带响应式属性的层 (defvar my-color "red") ;; 响应式变量 -(tp-define-layer my-highlight - :props (face (:foreground $my-color))) +(tp-define-layer 'my-highlight + :props '(face (:foreground $my-color))) ;; 应用该层 (tp-push-layer 1 10 'my-highlight) @@ -248,11 +248,11 @@ (setq my-color "blue") ;; 所有 my-highlight 层的文本自动变成蓝色! ;; 高级示例:使用 :data、:compute 和 :watch -(tp-define-layer full-name-layer - :props (help-echo $full-name face (:foreground $name-color)) - :data ((first-name . "John") (last-name . "Doe")) ;; 带初始值 - :compute ((full-name (lambda () (concat first-name " " last-name)))) - :watch ((first-name (lambda (new old layer) +(tp-define-layer 'full-name-layer + :props '(help-echo $full-name face (:foreground $name-color)) + :data '((first-name . "John") (last-name . "Doe")) ;; 带初始值 + :compute '((full-name (lambda () (concat first-name " " last-name)))) + :watch '((first-name (lambda (new old layer) (message "名字从 %s 改为 %s" old new))))) ``` @@ -451,9 +451,9 @@ LAYER-NAME 可以是通过 `tp-define-layer` 定义的层名称或通过 `tp-def ;; => #("Hello" 0 5 (face bold mouse-face highlight)) ;; 在整个字符串上使用已定义的层名称 -(tp-define-layer my-style - :props (face (:foreground $my-color)) - :data ((my-color . "blue"))) +(tp-define-layer 'my-style + :props '(face (:foreground $my-color)) + :data '((my-color . "blue"))) (tp-set " " 'my-style) ;; => #(" " 0 1 (tp-name my-style face (:foreground "blue") ...)) ``` @@ -488,8 +488,8 @@ LAYER-NAME 可以是通过 `tp-define-layer` 定义的层名称或通过 `tp-def ;; => #("Hello" 0 5 (face italic)) ;; 使用已定义的层名称 -(tp-define-layer error-style - (face (:foreground "red" :weight bold))) +(tp-define-layer 'error-style + '(face (:foreground "red" :weight bold))) (with-temp-buffer (insert "Hello World") (tp-reset 1 10 'error-style)) @@ -536,8 +536,8 @@ LAYER-NAME 可以是通过 `tp-define-layer` 定义的层名称或通过 `tp-def ;; => (shadow bold) ;; 使用已定义的层名称 -(tp-define-layer highlight-style - (face (:background "yellow"))) +(tp-define-layer 'highlight-style + '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-set 1 10 '(face bold)) @@ -841,8 +841,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => #("Hello world" 0 5 (face bold) 6 11 (face bold)) ;; 使用已定义的层名称 -(tp-define-layer todo-style - (face (:foreground "orange" :weight bold))) +(tp-define-layer 'todo-style + '(face (:foreground "orange" :weight bold))) (with-temp-buffer (insert "TODO: fix this. TODO: also this.") (tp-match-set "TODO" 'todo-style)) @@ -882,8 +882,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => ((1 . 5) (12 . 17)) ;; 使用已定义的层名称 -(tp-define-layer alert-style - (face (:background "red" :foreground "white"))) +(tp-define-layer 'alert-style + '(face (:background "red" :foreground "white"))) (with-temp-buffer (insert "TODO: fix this") (tp-match-reset "TODO" 'alert-style)) @@ -923,8 +923,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => ((1 . 5) (12 . 17)) ;; 使用已定义的层名称 -(tp-define-layer underline-style - (face (:underline (:color "blue" :style wave)))) +(tp-define-layer 'underline-style + '(face (:underline (:color "blue" :style wave)))) (with-temp-buffer (insert "TODO: fix this") (tp-match-add "TODO" 'underline-style)) @@ -965,8 +965,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => #("abc 123 XYZ" 4 7 (face bold) 8 11 (face bold)) ;; 使用已定义的层名称 -(tp-define-layer number-style - (face (:foreground "green"))) +(tp-define-layer 'number-style + '(face (:foreground "green"))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-set "[0-9]+" 'number-style)) @@ -1007,8 +1007,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => (face italic) ;; 使用已定义的层名称 -(tp-define-layer code-number - (face (:foreground "cyan"))) +(tp-define-layer 'code-number + '(face (:foreground "cyan"))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-reset "[0-9]+" 'code-number)) @@ -1049,8 +1049,8 @@ OBJECT 是缓冲区或字符串;nil 表示当前缓冲区。 ;; => (face italic help-echo "number") ;; 使用已定义的层名称 -(tp-define-layer bold-underline - (face (:weight bold :underline t))) +(tp-define-layer 'bold-underline + '(face (:weight bold :underline t))) (with-temp-buffer (insert "abc 123 def 456") (tp-regexp-add "[0-9]+" 'bold-underline)) @@ -1308,33 +1308,26 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 定义单个文本属性层。支持多种格式: -**格式一 - 直接定义文本属性(传统方式,不支持响应式特性):** +**格式一 - 直接定义文本属性(不支持响应式特性):** ```elisp -(tp-define-layer layer-name - (face (:background "cyan") line-prefix ">>")) +(tp-define-layer 'layer-name + '(face (:background "cyan") line-prefix ">>")) ``` -**格式二 - 使用 :props 关键字:** +**格式二 - 使用 :props、:data、:watch 和/或 :compute(Vue 3 风格响应式):** ```elisp -(tp-define-layer layer-name - :props (face (:background "cyan") line-prefix ">>")) -``` - -**格式三 - 使用 :props、:data、:watch 和/或 :compute(Vue 3 风格响应式):** - -```elisp -(tp-define-layer layer-name +(tp-define-layer 'layer-name ;; props: $前缀的符号是响应式变量;如果未绑定会自动定义 - :props (face (:foreground $my-color) help-echo $full-name) + :props '(face (:foreground $my-color) help-echo $full-name) ;; data: 不在 props 中使用的额外响应式变量;可以包含初始值 - :data ((first-name . "John") (last-name . "Doe")) + :data '((first-name . "John") (last-name . "Doe")) ;; compute: (变量名 函数) 列表 - 计算响应式变量的值 - :compute ((full-name (lambda () (concat first-name " " last-name)))) + :compute '((full-name (lambda () (concat first-name " " last-name)))) ;; watch: (变量名 回调函数) 列表 - 变量变化时的副作用 - :watch ((my-color (lambda (new old layer) - (message "颜色从 %s 改为 %s" old new))))) + :watch '((my-color (lambda (new old layer) + (message "颜色从 %s 改为 %s" old new))))) ``` **响应式变量:** @@ -1355,25 +1348,17 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 使用格式一(直接 plist)定义单个属性层 (progn (setq tp-layer-alist nil) ; 重置以确保干净的示例 - (tp-define-layer highlight - (face (:background "yellow" :foreground "black"))) + (tp-define-layer 'highlight + '(face (:background "yellow" :foreground "black"))) (tp-layer-props 'highlight)) ;; => (face (:background "yellow" :foreground "black") tp-name highlight) -;; 使用格式二(:props 关键字)定义属性层 -(progn - (tp-define-layer error - :props (face (:background "red" :foreground "white") - help-echo "错误!")) - (tp-layer-props 'error)) -;; => (face (:background "red" :foreground "white") help-echo "错误!" tp-name error) - -;; 定义响应式属性层(格式三) +;; 定义响应式属性层 (progn (tp-layer-reset) (defvar theme-color "blue") - (tp-define-layer themed-layer - :props (face (:foreground $theme-color))) + (tp-define-layer 'themed-layer + :props '(face (:foreground $theme-color))) ;; 应用该层 (with-temp-buffer (insert "Hello World") @@ -1385,8 +1370,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 重新定义已存在的属性层(覆盖旧定义) (progn - (tp-define-layer test-layer (face bold)) - (tp-define-layer test-layer (face italic)) ; 覆盖 + (tp-define-layer 'test-layer '(face bold)) + (tp-define-layer 'test-layer '(face italic)) ; 覆盖 (tp-layer-props 'test-layer)) ;; => (face italic tp-name test-layer) ``` @@ -1395,57 +1380,57 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 #### `tp-define-layer-group` - 定义属性层组 -定义包含多个属性层的层组。每个元素支持四种格式: +定义包含多个属性层的层组。每个元素支持多种格式: **格式一 - 匿名层(命名为 GROUP-NAME-0, GROUP-NAME-1 等):** ```elisp -(tp-define-layer-group tp-test-moons - (display "🌑" face (:height 1.0)) - (display "🌘" face (:height 1.5)) - (display "🌗" face (:height 2.0))) +(tp-define-layer-group 'tp-test-moons + '(display "🌑" face (:height 1.0)) + '(display "🌘" face (:height 1.5)) + '(display "🌗" face (:height 2.0))) ;; 创建层: tp-test-moons-0, tp-test-moons-1, tp-test-moons-2 ``` **格式二 - 使用 cons-cell 命名层(命名为 GROUP-NAME-suffix):** ```elisp -(tp-define-layer-group tp-test-moons - ("新月" . (display "🌑" face (:height 1.0))) - ("残月" . (display "🌘" face (:height 1.5))) - ("下弦月" . (display "🌗" face (:height 2.0)))) +(tp-define-layer-group 'tp-test-moons + '("新月" . (display "🌑" face (:height 1.0))) + '("残月" . (display "🌘" face (:height 1.5))) + '("下弦月" . (display "🌗" face (:height 2.0)))) ;; 创建层: tp-test-moons-新月, tp-test-moons-残月, tp-test-moons-下弦月 ``` **格式三 - 使用 :props 关键字命名层(命名为 GROUP-NAME-suffix):** ```elisp -(tp-define-layer-group tp-test-moons - ("新月" :props (display "🌑" face (:height 1.0))) - ("残月" :props (display "🌘" face (:height 1.5))) - ("下弦月" :props (display "🌗" face (:height 2.0)))) +(tp-define-layer-group 'tp-test-moons + '("新月" :props (display "🌑" face (:height 1.0))) + '("残月" :props (display "🌘" face (:height 1.5))) + '("下弦月" :props (display "🌗" face (:height 2.0)))) ;; 创建层: tp-test-moons-新月, tp-test-moons-残月, tp-test-moons-下弦月 ``` **格式四 - 使用 :props、:data、:watch 和/或 :compute 的命名层(Vue 3 风格响应式):** ```elisp -(tp-define-layer-group reactive-group - ("reactive" :props (face (:foreground $my-color) help-echo $full-name) - :data ((first-name . "John") (last-name . "Doe")) - :compute ((full-name (lambda () (concat first-name " " last-name)))) - :watch ((my-color (lambda (new old layer) (message "改变了!")))))) +(tp-define-layer-group 'reactive-group + '("reactive" :props (face (:foreground $my-color) help-echo $full-name) + :data ((first-name . "John") (last-name . "Doe")) + :compute ((full-name (lambda () (concat first-name " " last-name)))) + :watch ((my-color (lambda (new old layer) (message "改变了!")))))) ;; 创建层: reactive-group-reactive,具有完整的响应式支持 ``` 你也可以在层组中引用已定义的层: ```elisp -(tp-define-layer existing-layer (face bold)) -(tp-define-layer-group my-group - existing-layer ; 引用已存在的属性层 - (face (:background "red") line-prefix ">>") ; 匿名属性层 - ("named" . (face italic))) ; 命名属性层 +(tp-define-layer 'existing-layer '(face bold)) +(tp-define-layer-group 'my-group + 'existing-layer ; 引用已存在的属性层 + '(face (:background "red") line-prefix ">>") ; 匿名属性层 + '("named" . (face italic))) ; 命名属性层 ``` 如果同名的层组已存在,新定义将覆盖旧定义。 @@ -1458,16 +1443,13 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer highlight - (face (:background "yellow" :foreground "black"))) - (tp-define-layer error - (face (:background "red" :foreground "white"))) - (tp-define-layer info - (face (:background "blue" :foreground "white"))) - (tp-define-layer-group status-colors - highlight - error - info) + (tp-define-layer 'highlight + '(face (:background "yellow" :foreground "black"))) + (tp-define-layer 'error + '(face (:background "red" :foreground "white"))) + (tp-define-layer 'info + '(face (:background "blue" :foreground "white"))) + (tp-define-layer-group 'status-colors 'highlight 'error 'info) (length (tp-group-props 'status-colors))) ;; => 3 @@ -1475,11 +1457,11 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer-group moon-phases - ("new" . (display "🌑")) - ("waxing-crescent" . (display "🌒")) - ("first-quarter" . (display "🌓")) - ("full" . (display "🌕"))) + (tp-define-layer-group 'moon-phases + '("new" . (display "🌑")) + '("waxing-crescent" . (display "🌒")) + '("first-quarter" . (display "🌓")) + '("full" . (display "🌕"))) (tp-layer-props 'moon-phases-full)) ;; => (display "🌕" tp-name moon-phases-full) ``` @@ -1501,7 +1483,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 获取属性层属性 (progn (setq tp-layer-alist nil) - (tp-define-layer my-layer (face bold help-echo "tip")) + (tp-define-layer 'my-layer '(face bold help-echo "tip")) (tp-layer-props 'my-layer)) ;; => (face bold help-echo "tip" tp-name my-layer) @@ -1509,9 +1491,9 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer-group my-group layer1 layer2) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer-group 'my-group 'layer1 'layer2) (length (tp-group-props 'my-group))) ;; => 2 ``` @@ -1533,7 +1515,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 取消定义属性层 (progn (setq tp-layer-alist nil) - (tp-define-layer temp-layer (face bold)) + (tp-define-layer 'temp-layer '(face bold)) (tp-undefine-layer 'temp-layer) (tp-layer-props 'temp-layer)) ;; => nil @@ -1542,8 +1524,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (setq tp-layer-alist nil) (setq tp-layer-groups nil) - (tp-define-layer l1 (face bold)) - (tp-define-layer my-group l1) + (tp-define-layer 'l1 '(face bold)) + (tp-define-layer-group 'my-group 'l1) (tp-undefine-group 'my-group) (assoc 'my-group tp-layer-groups)) ;; => nil @@ -1563,7 +1545,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn - (tp-define-layer test-layer (face bold)) + (tp-define-layer 'test-layer '(face bold)) (tp-layer-reset) (list tp-layer-alist tp-layer-groups)) ;; => (nil nil) @@ -1587,8 +1569,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 定义一个响应式层 (progn (defvar my-reactive-color "red") - (tp-define-layer reactive-layer - :props (face (:foreground $my-reactive-color))) + (tp-define-layer 'reactive-layer + :props '(face (:foreground $my-reactive-color))) ;; 仅清除响应式绑定 (tp-reactive-reset) ;; 层仍然存在,但改变 my-reactive-color 不再更新它 @@ -1622,8 +1604,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 base 属性层放在顶部 (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1633,8 +1615,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 highlight 放在索引 1(顶部下面) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1645,8 +1627,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将属性层放在底部 (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer info (face (:foreground "blue"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'info '(face (:foreground "blue"))) (with-temp-buffer (insert "Hello World") (tp-put-layer 1 10 'base 0) @@ -1675,8 +1657,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 首先推入 base 属性层 (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1686,8 +1668,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 highlight 推到顶部(现在可见) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1718,8 +1700,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 按名称删除 (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) - (tp-define-layer base (face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) + (tp-define-layer 'base '(face default)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1731,8 +1713,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 删除顶层(idx=0) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1744,8 +1726,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 删除底层 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1774,8 +1756,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1814,9 +1796,9 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将索引 2 的层移动到索引 0(顶部) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer layer3 (face underline)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer 'layer3 '(face underline)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1830,8 +1812,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 按名称移动层到底部 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1844,8 +1826,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 在字符串上移动 (let ((str (copy-sequence "Hello"))) (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (tp-push-layer str 'layer1) (tp-push-layer str 'layer2) ;; layer2 在顶部 @@ -1874,9 +1856,9 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 layer1 上移 2 个位置(到顶部) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) - (tp-define-layer layer3 (face underline)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) + (tp-define-layer 'layer3 '(face underline)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1890,8 +1872,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将索引 0 的属性层下移 1 个位置 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -1922,8 +1904,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 堆栈: highlight (顶) -> base (底) (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1955,8 +1937,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 'base 设为顶层 (progn (tp-layer-reset) - (tp-define-layer base (face default)) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'base '(face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -1987,8 +1969,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 交换 layer1 和 layer2 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2022,8 +2004,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将 layer1 和 layer2 合并为 merged-layer (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2035,8 +2017,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 按索引合并 (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2066,8 +2048,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 将所有属性层扁平化为 'flat-layer (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (help-echo "tip")) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(help-echo "tip")) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2079,7 +2061,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 使用 nil 名称扁平化(无名属性层) (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) + (tp-define-layer 'layer1 '(face bold)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2105,8 +2087,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) - (tp-define-layer base (face default)) + (tp-define-layer 'highlight '(face (:background "yellow"))) + (tp-define-layer 'base '(face default)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'base) @@ -2130,8 +2112,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2155,7 +2137,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) + (tp-define-layer 'layer1 '(face bold)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2179,8 +2161,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2213,8 +2195,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer layer1 (face (:foreground "red"))) - (tp-define-layer layer2 (face (:foreground "blue"))) + (tp-define-layer 'layer1 '(face (:foreground "red"))) + (tp-define-layer 'layer2 '(face (:foreground "blue"))) (with-temp-buffer (insert "Hello World") (tp-push-layer 1 10 'layer1) @@ -2247,8 +2229,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (let ((str (copy-sequence "Hello World"))) - (tp-define-layer layer1 (face bold)) - (tp-define-layer layer2 (face italic)) + (tp-define-layer 'layer1 '(face bold)) + (tp-define-layer 'layer2 '(face italic)) (tp-push-layer 0 5 'layer1 str) (tp-push-layer 0 5 'layer2 str) ;; 向所有层添加下划线 @@ -2327,7 +2309,7 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (progn (tp-layer-reset) - (tp-define-layer highlight (face (:background "yellow"))) + (tp-define-layer 'highlight '(face (:background "yellow"))) (with-temp-buffer (insert "Hello World Test") (tp-push-layer 1 6 'highlight) @@ -2398,13 +2380,13 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (tp-layer-reset) ;; 为不同高亮目的定义属性层 - (tp-define-layer code-base - (face font-lock-keyword-face)) - (tp-define-layer code-error - (face (:underline (:color "red" :style wave)) + (tp-define-layer 'code-base + '(face font-lock-keyword-face)) + (tp-define-layer 'code-error + '(face (:underline (:color "red" :style wave)) help-echo "语法错误")) - (tp-define-layer code-debug - (face (:background "dark blue"))) + (tp-define-layer 'code-debug + '(face (:background "dark blue"))) (with-temp-buffer (insert (make-string 100 ?x)) ; 创建 100 字符缓冲区 ;; 应用基础高亮 @@ -2429,10 +2411,10 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (progn (tp-layer-reset) ;; 将状态属性层定义为一个组 - (tp-define-layer status-todo (face (:foreground "gray"))) - (tp-define-layer status-progress (face (:foreground "yellow"))) - (tp-define-layer status-done (face (:foreground "green"))) - (tp-define-layer-group task-status status-todo status-progress status-done) + (tp-define-layer 'status-todo '(face (:foreground "gray"))) + (tp-define-layer 'status-progress '(face (:foreground "yellow"))) + (tp-define-layer 'status-done '(face (:foreground "green"))) + (tp-define-layer-group 'task-status 'status-todo 'status-progress 'status-done) ;; 检查组是否已定义 (length (tp-group-props 'task-status))) ;; => 3 @@ -2450,8 +2432,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 定义临时高亮属性层 (progn (tp-layer-reset) - (tp-define-layer temp-highlight - (face (:background "yellow"))) + (tp-define-layer 'temp-highlight + '(face (:background "yellow"))) (tp-layer-props 'temp-highlight)) ;; => (face (:background "yellow") tp-name temp-highlight) @@ -2485,8 +2467,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ;; 响应式方式(自动更新) (defvar my-color "red") -(tp-define-layer my-layer - :props (face (:foreground $my-color))) +(tp-define-layer 'my-layer + :props '(face (:foreground $my-color))) (tp-push-layer 1 10 'my-layer) ;; 只需改变变量 - 所有文本自动更新! (setq my-color "blue") ;; 所有使用 my-layer 的区域立即更新! @@ -2507,8 +2489,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ```elisp (defvar highlight-color "yellow") -(tp-define-layer my-highlight - :props (face (:background $highlight-color))) +(tp-define-layer 'my-highlight + :props '(face (:background $highlight-color))) (with-temp-buffer (insert "Hello World") @@ -2526,8 +2508,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (defvar fg-color "white") (defvar bg-color "black") -(tp-define-layer themed-text - :props (face (:foreground $fg-color :background $bg-color))) +(tp-define-layer 'themed-text + :props '(face (:foreground $fg-color :background $bg-color))) ;; 改变任一变量都会更新文本 (setq fg-color "yellow") ;; 更新前景色 @@ -2539,10 +2521,10 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 `:data` 关键字定义不直接用于 `:props` 但可以触发计算值更新或被监听的额外响应式变量: ```elisp -(tp-define-layer user-info - :props (help-echo $full-name) - :data (first-name last-name) ;; 不直接用于 props - :compute ((full-name (lambda () (concat first-name " " last-name))))) +(tp-define-layer 'user-info + :props '(help-echo $full-name) + :data '(first-name last-name) ;; 不直接用于 props + :compute '((full-name (lambda () (concat first-name " " last-name))))) ``` **带初始值:** @@ -2550,10 +2532,10 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 你可以使用 cons cell 指定初始值: ```elisp -(tp-define-layer user-info - :props (help-echo $full-name) - :data ((first-name . "张") (last-name . "三")) - :compute ((full-name (lambda () (concat first-name last-name))))) +(tp-define-layer 'user-info + :props '(help-echo $full-name) + :data '((first-name . "张") (last-name . "三")) + :compute '((full-name (lambda () (concat first-name last-name))))) ;; first-name 现在是 "张",last-name 现在是 "三" ``` @@ -2563,10 +2545,10 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 `:compute` 关键字创建派生值,当它们的依赖项改变时会自动重新计算: ```elisp -(tp-define-layer progress-display - :props (display $progress-text face (:foreground $progress-color)) - :data ((current . 0) (total . 100)) - :compute ((progress-text (lambda () (format "%d%%" (/ (* current 100) total)))) +(tp-define-layer 'progress-display + :props '(display $progress-text face (:foreground $progress-color)) + :data '((current . 0) (total . 100)) + :compute '((progress-text (lambda () (format "%d%%" (/ (* current 100) total)))) (progress-color (lambda () (cond ((< current 30) "red") ((< current 70) "yellow") @@ -2582,9 +2564,9 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 `:watch` 关键字让你在响应式变量改变时执行回调: ```elisp -(tp-define-layer monitored-layer - :props (face (:foreground $status-color)) - :watch ((status-color +(tp-define-layer 'monitored-layer + :props '(face (:foreground $status-color)) + :watch '((status-color (lambda (new-val old-val layer-name) (message "层 %s: 颜色从 %s 改为 %s" layer-name old-val new-val))))) @@ -2615,8 +2597,8 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 所有文本属性 API(`tp-set`、`tp-match-set`、`tp-regexp-set` 等)现在可以直接接受层名: ```elisp -(tp-define-layer warning-style - :props (face (:foreground "orange" :weight bold))) +(tp-define-layer 'warning-style + :props '(face (:foreground "orange" :weight bold))) ;; 使用层名代替 plist (tp-set 1 10 'warning-style) @@ -2628,16 +2610,16 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 ### 响应式层组 -层组也可以使用格式四的响应式特性: +层组也可以使用响应式特性: ```elisp -(tp-define-layer-group status-indicators - ("success" :props (face (:foreground $success-color)) - :data ((success-color . "green"))) - ("warning" :props (face (:foreground $warning-color)) - :data ((warning-color . "orange"))) - ("error" :props (face (:foreground $error-color)) - :data ((error-color . "red")))) +(tp-define-layer-group 'status-indicators + '("success" :props (face (:foreground $success-color)) + :data ((success-color . "green"))) + '("warning" :props (face (:foreground $warning-color)) + :data ((warning-color . "orange"))) + '("error" :props (face (:foreground $error-color)) + :data ((error-color . "red")))) ``` ### 重置响应式状态 @@ -2659,14 +2641,14 @@ Emacs 的 `text-property-search-forward` 和 `text-property-search-backward` 的 (defvar theme-accent "cyan") ;; 定义主题感知层 -(tp-define-layer code-keyword - :props (face (:foreground $theme-accent :weight bold))) +(tp-define-layer 'code-keyword + :props '(face (:foreground $theme-accent :weight bold))) -(tp-define-layer code-comment - :props (face (:foreground "gray" :slant italic))) +(tp-define-layer 'code-comment + :props '(face (:foreground "gray" :slant italic))) -(tp-define-layer code-string - :props (face (:foreground "green"))) +(tp-define-layer 'code-string + :props '(face (:foreground "green"))) ;; 将层应用到代码 (tp-match-set '("defun" "defvar" "let" "if" "when") 'code-keyword)