Emacs 25.3.1使用kill-ring-save函数复制中文文本带BOM问题求助

这是一个困扰了很久的问题。

  • Emacs版本:Windows下的25.3.1版本
  • 问题描述:使用M-w快捷键(即kill-ring-save函数)复制buffer中的文本,如果文本带中文,则粘贴到其他地方后发现会带一个\ufeff的空白字符(即BOM前缀);如果文本不带中文,则不会添加BOM前缀。期望是:不管复制的是中文还是英文,都不要带BOM前缀。
  • 尝试解决:
    • 尝试方案1:修改buffer的文本编码为without-signature(即不带BOM签名)的编码。
    • 尝试方案2:查看kill-ring-save源码发现,会调用kill-new函数,kill-new接收一个字符串参数,这个字符串就是从buffer复制的文本字符串,于是想写一个advice,强行把字符串中的\ufeff替换为空字符串,写的advice如下:
(advice-add 'kill-new
            :around
            (lambda (orig-func &rest args)
              (setq str (car args))
              (setq replaced-str (replace-in-string str "\ufeff" ""))
              (apply orig-func (list replaced-str))
            '((name . "around@kill-new"))))

但是上面两个方案都没有解决问题,不知道还有什么解决方案,求助各位,感谢!

字符串首尾带有其它字符这个问题一般应该是用trim()函数删除吧,看了elisp(27.1)也有string-trim这个函数。不过你的是25.3.1不知道有没有,也许你升级下emacs版本就没有这个问题了

首先25.3.1是有string-trim函数的;其次,在上面的advice-add的lambda函数中(setq replaced-str (replace-in-string str "\ufeff" ""))一行也试过:(setq replaced-str (string-trim str)),然而也并没有用,问题依旧。

升级到最新版本也许能解决这个问题,但是还是对这个问题比较好奇,希望能找到答案 :wink:

通过emacs -Q启动Emacs,发现不加载.emacs.d的配置,不会有这个问题,说明不是Emacs 25.3.1原生的问题。

然后去排查了自己写的所有和字符编码相关的配置,问题原因已找到:之前为了解决另外一个Window下乱码的问题,在自己的配置中有3行这样的配置:

(set-next-selection-coding-system 'utf-16-le)
(set-selection-coding-system 'utf-16-le)
(set-clipboard-coding-system 'utf-16-le)

把上面3个编码中的utf-16-le都改为utf-8-unix即可解决问题。