এলিস্পে কোনও স্ট্রিং ডিপ কপি করবেন?


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। এটি তালিকাটিকে ধ্বংসাত্মকভাবে পরিবর্তন করতে হবে না, কারণ সেই তালিকাটি অন্যদের দ্বারা উল্লেখ করা হলে এটি ব্যর্থ হয়।
লিন্ডাইড্যান্সার


বাগ রিপোর্ট করার জন্য ধন্যবাদ। খুব খারাপ কেউ এখনও এর প্রতিক্রিয়া জানায় নি। এই ইউটিলিটি ফাংশনটি (সি তে কোডড) স্থির করা ভাল হবে।
11:25

উত্তর:


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% দ্রুত ছিল । আমি এমন একটি সংস্করণও লিখেছিলাম যা কোনও টেম্প বাফার ব্যবহার করে না এবং স্ট্রিংয়ের বৈশিষ্ট্যগুলিকে সংশোধন করে যা কম কোড তবে ধীর ছিল।

সি কোডটি দেখে এটি সম্পত্তি প্লাস্টিকগুলি অনুলিপি করে অনুলিপি করে যা copy_sequence দিয়ে তালিকার কাঠামোটি পুনর্নির্মাণ করবে তবে উপাদানগুলির দ্বারা মান অনুসারে অনুলিপি করবে না, সুতরাং আপনার উদাহরণের মুখের মতো বৈশিষ্ট্যগুলির একটি তালিকা মান রয়েছে যা রেফারেন্সের মাধ্যমে অনুলিপি করা হয় এবং পরিবর্তিত হয়। বাগ বা না, আমি জানি না


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
কাজ করে না, আমি একটি উদাহরণ যুক্ত করব।
আবো-আবো 12

1
কৌশলটি হ'ল আমি যেমন করি তেমন বৈশিষ্ট্যগুলিতে নেস্টেড তালিকা থাকা। তাহলে concatকাজ হয় না।
আবু-আবো

@ ABO-ABO। ঠিক আছে, এখন আমি দেখছি। আমি আপনার যোগ উদাহরণে এটি স্পষ্ট না। সেক্ষেত্রে আমার কোনও উত্তর নেই তবে আমি মনে করি যে এই জাতীয় ফাংশনের আসল প্রয়োজন আছে। (একটি সম্ভাব্য সমস্যা হ'ল এটি জানা অসম্ভব যে কোনও অজানা সম্পত্তি কোনও ধরণের শেয়ার্ড অবজেক্টের উল্লেখ করতে পারে কিনা))
লিন্ডাইড্যান্সার

1

একটি (খুব দক্ষ নয়) কাজের আশেপাশে পাওয়া গেছে:

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

2
প্রোপার্টিগুলিতে #চরিত্রটি থাকে তবে কাজের চারপাশে ব্যর্থ হয় ।
অ্যাবো-অ্যাবো 14

আপনি যদি বোঝাতে চান # অক্ষরটি প্রতীক নামের অংশ? বা বুফার বা অন্যান্য মুদ্রণযোগ্য ডেটা হিসাবে চিহ্নিত বৈশিষ্ট্যগুলি কী বোঝায়? এটি যদি প্রথম হয় তবে আপনার একটি বাগ ফাইল করা উচিত।
মালাবারবা

বৈশিষ্ট্যগুলিতে বাফারগুলি
abo-abo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.