#elisp
#elisp
Вопрос:
Добрый день. В тексте запись
@samp{}
, код
(buffer-substring-no-properties ( nach 4) (- (point) 4))
захватывается здесь эта область, на выходе
"@samp{\}"
функция. Вопрос в том, как получить не экранированную косую черту. Спасибо
Комментарии:
1. Косая черта отсутствует.
Ответ №1:
"@samp{\}"
представляет строку @samp{}
. Это не отличается от исходного текста.
Когда вы просите Emacs напечатать возвращаемое значение buffer-substring-no-properties
, вы видите печатное представление строки, что эквивалентно синтаксису чтения строк в двойных кавычках (как вы бы написали это в коде), в котором одна обратная косая черта должна быть экранирована другой.
Обратитесь к руководству elisp:
- C-hig
(elisp)Printed Representation
- C-hig
(elisp)Syntax for Strings
- C-hig
(elisp)Nonprinting Characters
Комментарии:
1. Спасибо за ваш ответ и время, потраченное на это, я допустил ошибку, опубликовав только небольшую часть своего кода. Я также прочитал руководство, хотя узлы «Непечатаемые символы» и «Синтаксис для строк» отсутствуют в моем руководстве. Всегда внимательно читайте руководство! Вероятно, мой ответ будет не по теме, но все же. Еще раз спасибо.
2. Рад, что вы это поняли. Что-то не так с вашей установкой, если у вас нет этих информационных узлов — эти имена датируются как минимум 22.1. Вы всегда можете прочитать руководство по последней версии онлайн ( синтаксис для строк и непечатаемых символов ), но в целом лучше всего использовать встроенные руководства для версии Emacs, которую вы фактически используете.
Ответ №2:
Изменения дальше по коду дали результат, а именно не исправление записи прочитанной строки, а изменение вставки злополучной строки "@samp {\}"
обратно в текст. Функция представлена
(defun zamenaOBJ (спсОбктв)
"Зменить obzx оригиналом"
(goto-char 1)
(while (re-search-forward "[Bb]jkt\([[:digit:]]\) " nil t 1)
(replace-match (cdr (assoc (downcase (match-string 0)) спсОбктв)) t)))
Вот данные на момент ошибки (что было получено
(buffer-substring-no-properties)
и сохраняется в ассоциативном списке
(cdr (assoc (downcase (match-string 0)) спсОбктв))
"@samp{\}"
Сама ошибка
(replace-match (cdr (assoc (downcase (match-string 0)) спсОбктв)) t)
Invalid use of ‘’ in replacement text
Если бы это было написано так:
(replace-match (prin1-to-string (cdr (assoc (downcase (match-string 0)) спсОбктв)) t))
все замены по тексту были окружены двойной кавычкой, если же указывался аргумент noescape в t для prin1-to-string:
(replace-match (prin1-to-string (cdr (assoc (downcase (match-string 0)) спсОбктв)) t) t)
или
(replace-match (princ (cdr (assoc (downcase (match-string 0)) спсОбктв)) t))
ошибка вернулась снова
Решаемая путем добавления второго аргумента литерала replace-match
(replace-match (cdr (assoc (downcase (match-string 0)) спсОбктв)) t t)