在Emacs中突出显示和替换不可打印的unicode字符

在Emacs中突出显示和替换不可打印的unicode字符,unicode,emacs,Unicode,Emacs,我有一个UTF-8文件,其中包含一些Unicode字符,如从左向右覆盖(U+202D),我想从文件中删除这些字符。在Emacs中,默认情况下它们是隐藏的(这应该是正确的行为?)。如何使这种“异国情调”unicode字符可见(同时不改变“常规”unicode字符(如德语umlauts)的显示)?之后如何替换它们(例如,使用replace string。C-X 8 Ret不适用于isearch/replace string) 在Vim中,这非常简单:这些字符按默认值以十六进制表示(这是错误还是缺少功

我有一个UTF-8文件,其中包含一些Unicode字符,如从左向右覆盖(U+202D),我想从文件中删除这些字符。在Emacs中,默认情况下它们是隐藏的(这应该是正确的行为?)。如何使这种“异国情调”unicode字符可见(同时不改变“常规”unicode字符(如德语umlauts)的显示)?之后如何替换它们(例如,使用
replace string
C-X 8 Ret
不适用于isearch/
replace string


在Vim中,这非常简单:这些字符按默认值以十六进制表示(这是错误还是缺少功能?)显示,您可以使用
:%s/\%u202d//g
轻松删除它们。这在Emacs中应该是可能的?

您可以执行
M-x查找文件的操作,然后您将看到这些字符

然后,您可以使用常用的
字符串替换

将其删除。这样如何:

键入M-:
(kill new“\u202d”)
,将要匹配的U+202d字符放在kill环的顶部。然后,您可以使用C-y(例如
queryreplace
)或M-y(例如
isearch forward
)将该字符串拉入各种搜索命令中

(编辑后添加:)

您也可以只以非交互方式调用命令,这不会出现与交互调用相同的键盘输入困难。例如,键入M-:然后:

(replace-string "\u202d" "")

这与Vim版本有些相似。一个区别是,它只执行从光标位置到文件底部(或缩小区域)的替换,因此在运行命令替换所有匹配项之前,您需要先到文件顶部(或缩小区域)。

我也有这个问题,这对于提交来说尤其烦人,因为当人们注意到错误时,修复日志消息可能为时已晚。因此,我修改了键入
C-x C-C
时使用的函数,以检查是否有不可打印的字符,即匹配
“[^\n[:print:][]”“
,如果有,将光标放在上面,输出消息,并且不终止缓冲区。然后,根据上下文,可以手动删除该字符,将其替换为可打印的字符或其他任何字符

用于检测(以及将光标定位在不可打印字符之后)的代码为:

注:

  • 不需要保存当前光标位置,因为在这里,缓冲区将被终止,或者光标将被故意放在不可打印的字符上
  • 您可能需要稍微修改regexp。例如,制表符是一个不可打印的字符,我也这么认为,但您可能也想接受它
  • 关于regexp中的
    [:print:][/code>字符类,您依赖于C库。一些可打印的字符可能被视为不可打印,比如最近的一些表情符号(但不是每个人都关心)
  • 当且仅当存在不可打印字符时,
    向前搜索
    返回值将被视为真。这正是我们想要的
下面是我用于Subversion提交的代码片段(这是在我的
.emacs
中更复杂的代码之间)


条件下
,即我仅对用于Subversion提交的文件名应用此规则。
(向后字符)
可以使用或不使用,这取决于您希望光标位于不可打印字符上方还是紧跟在不可打印字符之后。

对于使用
切换启用多字节字符的字符,我得到了相同的结果,但问题是,我不希望看到所有字符,只希望看到“外来”字符。不过,我不知道如何替换它们(我不能在替换字符串中输入它们)。这很有效,谢谢。但这非常不方便,特别是因为在isearch或replace中找到的字符不会突出显示。也许还有其他的可能性。。
(progn
  (goto-char (point-min))
  (re-search-forward "[^\n[:print:]]" nil t))
(defvar my-svn-commit-frx "/svn-commit\\.\\([0-9]+\\.\\)?tmp\\'")
    ((and (buffer-file-name)
          (string-match my-svn-commit-frx (buffer-file-name))
          (progn
            (goto-char (point-min))
            (re-search-forward "[^\n[:print:]]" nil t)))
     (backward-char)
     (message "The buffer contains a non-printable character."))