(buffer-substring-no-properties) 反斜杠处理

(buffer-substring-no-properties) backslash handling

下午好。文中,记录

@samp{\}

,代码

(buffer-substring-no-properties (+ nach 4) (- (point) 4))

这里是捕获这个区域,在

的输出
"@samp{\}"

函数。问题是如何获得未转义的正斜杠。谢谢

"@samp{\}"代表字符串@samp{\}。和原文没什么区别

当您要求 Emacs 打印 buffer-substring-no-properties 的 return 值时,您看到的是字符串的 打印表示形式 -- 这相当于双引号 字符串的阅读语法 (就像您在代码中编写的那样)——其中一个反斜杠必须用另一个反斜杠转义。

参考elisp手册:

  • C-hig (elisp)Printed Representation
  • C-hig (elisp)Syntax for Strings
  • C-hig (elisp)Nonprinting Characters

对代码的进一步更改给出了结果,即不是对读取行记录的更正,而是将不幸行 "@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]:[=20

(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 (cdr (assoc (downcase (match-string 0)) спсОбктв)) t t)