(buffer-substring-no-properties) обработка обратной косой черты

#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)