سؤال
Emacs اللثغة قد replace-string
ولكن لا يوجد لديه replace-char
.أريد أن تحل محل "مطبعي" مجعد ونقلت (Emacs رمز هذا الحرف هو عشري 53979) مع العادية ASCII ونقلت وأنا يمكن أن تفعل ذلك مع:
(replace-string (make-string 1 ?\x53979) "'")
أعتقد أنه سيكون أفضل مع replace-char
.
ما هي أفضل طريقة للقيام بذلك ؟
المحلول
لماذا لا نستخدم فقط
(replace-string "\x53979" "'")
أو
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
على النحو الموصى به في وثائق محل-السلسلة ؟
نصائح أخرى
هذه هي الطريقة التي يمكنني استبدال الأحرف في elisp:
(subst-char-in-string ?' ?’ "John's")
يعطي:
"John’s"
لاحظ أن هذه الدالة لا تقبل شخصيات السلسلة.الأول و الثاني يجب أن يكون حجة حرفي حرف (إما باستخدام ?
التدوين أو string-to-char
).
أيضا لاحظ أن هذه الوظيفة يمكن أن تكون مدمرة إذا الاختياري inplace
حجة غير النيل.
الذي سيكون بالتأكيد أفضل مع استبدال-شار.أي طريقة لتحسين قانون بلدي ؟
هو في الواقع بطيئة إلى نقطة حيث أنه من الأمور ؟ بلدي elisp عادة ما يبعث على السخرية غير فعالة و لا إشعار.(أنا فقط استخدام أدوات محرر على الرغم من YMMV إذا كنت بناء المقبلة MS بحثا عن العيش مع ذلك.)
أيضا, قراءة المستندات:
This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
(while (search-forward "’" nil t)
(replace-match "'" nil t))
وهذا الجواب هو على الأرجح ترخيص GPL الآن.
ماذا عن هذا
(defun my-replace-smart-quotes (beg end)
"replaces ’ (the curly typographical quote, unicode hexa 2019) to ' (ordinary ascii quote)."
(interactive "r")
(save-excursion
(format-replace-strings '(("\x2019" . "'")) nil beg end)))
مرة واحدة لديك في الخاص بك dotemacs ، يمكنك لصق elisp سبيل المثال رموز (من مدونات وغيرها) إلى الصفر المخزن المؤقت ثم اضغط على الفور ج-م-\ (إلى المسافة البادئة بشكل صحيح) ثم M-x بلدي-استبدال-الذكية-نقلت (لإصلاح ونقلت الذكية) و أخيرا C-x C-e (تشغيله).
أجد أن مجعد اقتباس دائما سداسي 2019, هل أنت متأكد من أنه 53979 في قضيتك ؟ يمكنك التحقق من الأحرف في المخزن المؤقت مع C-u-C x =.
أعتقد أنك يمكن أن يكتب "'" في مكان "\x2019" في تعريف بلدي-استبدال-الذكية ونقلت يكون على ما يرام.انها مجرد أن تكون على الجانب الآمن.