दीप एक स्ट्रिंग Elisp में?


9

मेरे पास एक उचित स्ट्रिंग है। मूल स्ट्रिंग में गुणों को संरक्षित करते हुए, अधिक गुण जोड़ने के लिए मैं इसकी एक गहरी प्रतिलिपि बनाना चाहता हूं। मैं (आसानी से) ऐसा कैसे कर सकता हूं?

उदाहरण

एक-एक का मूल्यांकन करें:

(setq test-str-1
      #(";; This `is' a test"
        0 3 (fontified nil face font-lock-comment-delimiter-face)
        3 9 (fontified nil face font-lock-comment-face)
        9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face))
        11 19 (fontified nil face font-lock-comment-face)))
(setq test-str-2 (concat test-str-1))
(add-face-text-property 0 (length test-str-2) 'foobar t test-str-2)

और परिणाम:

test-str-2
;; =>
#(";; This `is' a test" 0 3 (fontified nil face (font-lock-comment-delimiter-face foobar))
  3 9 (fontified nil face (font-lock-comment-face foobar))
  9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face foobar))
  11 19 (fontified nil face (font-lock-comment-face foobar)))
test-str-1
;; =>
#(";; This `is' a test" 0 3 (face font-lock-comment-delimiter-face fontified nil)
  3 9 (face font-lock-comment-face fontified nil)
  9 11 (face (font-lock-constant-face font-lock-comment-face foobar) ; <= foobar is here
        fontified nil)
  11 19 (face font-lock-comment-face fontified nil))

2
मैं इसे बग के रूप में रिपोर्ट करूंगा add-face-text-property। यह विध्वंसक रूप से सूची को संशोधित नहीं करना चाहिए, क्योंकि यह विफल हो जाता है जब उस सूची को दूसरों द्वारा संदर्भित किया जाता है।
लिंडनाइडर्स


बग की रिपोर्ट करने के लिए धन्यवाद। बहुत बुरा किसी ने अभी तक इसका जवाब नहीं दिया है। यह उपयोगिता समारोह (सी में कोडित) तय करने के लिए अच्छा होगा।
आकर्षित किया

जवाबों:


7

आप font-lock-append-text-propertyपाठ गुण जोड़ने के लिए फ़ंक्शन का उपयोग कर सकते हैं। यह मूल्य को विनाशकारी रूप से संशोधित नहीं करता है।

उदाहरण के लिए:

(setq test-str-1
      #(";; This `is' a test"
        0 3 (fontified nil face font-lock-comment-delimiter-face)
        3 9 (fontified nil face font-lock-comment-face)
        9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face))
        11 19 (fontified nil face font-lock-comment-face)))
(setq test-str-2 (concat test-str-1))
(font-lock-append-text-property 0 (length test-str-2) 'face '(foobar t) test-str-2)


test-str-1
#(";; This `is' a test"
  0 3 (face font-lock-comment-delimiter-face fontified nil)
  3 9 (face font-lock-comment-face fontified nil)
  9 11 (face (font-lock-constant-face font-lock-comment-face) fontified nil)
  11 19 (face font-lock-comment-face fontified nil))

test-str-2
#(";; This `is' a test"
  0 3 (fontified nil face (font-lock-comment-delimiter-face foobar t))
  3 9 (fontified nil face (font-lock-comment-face foobar t))
  9 11 (fontified nil face (font-lock-constant-face font-lock-comment-face foobar t))
  11 19 (fontified nil face (font-lock-comment-face foobar t)))

यहाँ, में test-str-1, अपने मूल मूल्य को बरकरार रखा है।


4

मैंने पाया कि आप पाठ गुणों पर पुनरावृत्ति कर सकते हैं, अंतर्निहित संपत्ति डेटा की प्रतिलिपि बना सकते हैं और नई प्रतियों के साथ मौजूदा गुणों को अधिलेखित कर सकते हैं।

(defun deep-copy-text-properties (str)
  (with-temp-buffer
    (insert str)
    (goto-char 1)
    (while (not (eobp))
      (set-text-properties (point)
                           (goto-char (next-char-property-change (point) (point-max)))
                           ;; copy-tree is the important part
                           (copy-tree (text-properties-at (1- (point))))))
    (buffer-string)))

मेरे परीक्षणों में, यह आपके readसमाधान से लगभग 20% तेज था । मैंने एक संस्करण भी लिखा था जिसमें एक अस्थायी बफर का उपयोग नहीं किया गया था और एक स्ट्रिंग के गुणों को संशोधित किया था जो कम कोड था लेकिन धीमा था।

C कोड को देखते हुए यह प्रॉपर्टी प्लांट्स को कॉपी करता है, copy_fterence के साथ जो सूची संरचना का पुनर्निर्माण करेगा लेकिन तत्वों को मूल्य से कॉपी नहीं करेगा, इसलिए आपके उदाहरण में अंकित मूल्य जैसे गुणों को संदर्भ और संशोधित द्वारा कॉपी किया गया है। बग या नहीं, मुझे नहीं पता


2

आप उपयोग कर सकते हैं (concat the-original-string)

उदाहरण के लिए:

(let ((s "TEXT"))
  (set-text-properties 2 3 '(:foreground "blue") s)
  (let ((q (concat s)))
    (add-text-properties 2 3 '(:background "red") q)
    (cons s q)))
;; Returns:
(#("TEXT" 2 3 (:foreground "blue")) . #("TEXT" 2 3 (:foreground "blue" :background "red")))

1
काम नहीं करता, मैं एक उदाहरण जोड़ूंगा।
अबो-अबो

1
चाल गुणों में एक नेस्टेड सूची है, जैसे मैं करता हूं। फिर concatकाम नहीं करता है।
अबो-अबो

@ abo-abo। ठीक है, अब मैं देखता हूं। मुझे लगता है कि आपके जोड़ा उदाहरण में हाजिर नहीं था। उस मामले में मेरे पास कोई जवाब नहीं है, लेकिन मुझे लगता है कि इस तरह के कार्य की वास्तविक आवश्यकता है। (एक संभावित समस्या यह है कि यह जानना असंभव है कि क्या कोई अज्ञात संपत्ति किसी तरह की साझा वस्तु को संदर्भित करने की उम्मीद कर सकती है।)
लिंडिक्सर

1

काम के आसपास (बहुत कुशल नहीं) मिला:

(setq test-str-2
      (read (prin1-to-string test-str-1)))

2
यदि प्रॉप्रिटी में #वर्ण समाहित है, तो कार्य-आस-पास विफल रहता है ।
अबो-अबो

क्या आपका मतलब है अगर # वर्ण प्रतीक नाम का हिस्सा है? या क्या ऐसे गुण हैं जो बफ़र या अन्य गैर-मुद्रण योग्य डेटा हैं? यदि यह पहली बार है, तो आपको एक बग दर्ज करना चाहिए।
मालाबार

गुणों में बफ़र
abo-abo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.