org mode 和 dired 中的中文怎么按拼音排序

主要是org-sort-entries 和 dired 中的文件名排序。

1 个赞

不清楚你那边的具体情况,以下是个人的一些整理,可能会误导,也希望会有点帮助吧 :blush:

org-sort 命令排序时(包括 org-sort-entriesorg-table-sort-linesorg-sort-list

a选择 [a]lpha 一项,会根据系统做 collation。从结果上看,在中文系统中是按字典顺序排序的。

其使用的函数是 string-collate-lessp

(sort '("阿" "八" "擦" "搭" "达" "打" "大" "得" "的"
        "滴" "迪" "底" "地" "嗲" "颠" "东" "都" "多"
        "婀" "发" "作" "阼" "怍" "柞" "座" "祚" "做")
      #'string-collate-lessp)

以上在 Windows 中返回

("阿" "八" "擦" "搭" "达" "打" "大" "得" "的"
 "滴" "迪" "底" "地" "嗲" "颠" "东" "都" "多"
 "婀" "发" "作" "阼" "怍" "柞" "祚" "座" "做")

在 Linux (虚拟机)中返回

("阿" "八" "擦" "搭" "达" "打" "大" "得" "的"
 "滴" "迪" "底" "地" "嗲" "颠" "东" "都" "多"
 "婀" "发" "柞" "作" "做" "座" "怍" "祚" "阼")

关键点是 locale 的设置。Windows 中应该是设置“区域和语言”选项为“中文(中国)”,对应简体中文。其它平台可以设置 LC_COLLATE"zh_CN.UTF-8" 之类的。

若系统的 locale 不方便改,string-collate-lessp 函数有一个可选参数 locale,默认值为 nil。在 Windows 平台中它要设为 "CHS"(对应简体中文),其它平台是 "zh_CN.UTF-8"。然后可以写个函数再用 org-sort[f]unc 选项调用。

注:Window 平台下有个变量 w32-collate-ignore-punctuation 可以设置。

还有文档中这一句也值得注意:

This behavior is system-dependent; e.g., punctuation and whitespace are never ignored on Cygwin, regardless of locale.


设置好 locale 以后,dired 中也是一样。按sdired-sort-toggle-or-edit)可以切换 sort by namesort by date,应该和终端中相应的 ls 命令显示一致。

dired 并没有用 string-collate-lessp 函数,所以

2 个赞

不了解 Emacs 的 string-collate-lesspls 用到的的 strcoll(3) 是怎么实现的,汉字按拼音排序应该不可能吧,考虑到汉字有多音字的情况。难道它们就随便(或者按照什么规则)取一个?

Dired 通过 dired-insert-directory 调用 ls 即glibc中的local数据已经包含对中文按拼音和笔画的排序

所以只要在 ~/.profile 里加入:

export LC_ALL=
export LANG="en_US.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="en_US.UTF-8"

就可以实现排序,但是这个补丁有些错误 locale-pinyin-0.1 https://wiki.woodpecker.org.cn/moin/MicroProj/2007-07-26

一个错误就是 轧 zha 被注成了 ga2 7 噶75 尜0 軋3 轧210 釓0 錷0 钆1 但是大部份排序还是对的