解决rg中文搜索gbk编码问题的工具rgpre

rg在windows上搜索中文难免会遇到gbk编码的文件, 可以通过rg -Egbk 来解决,但rg不支持同时多个编码搜索,rgpre就是试图解决这个问题的工具。通过rg --pre rgpre来执行搜索,rgpre会先读取文件内容然后输出到console供rg搜索,rgpre会自动识别文件编码,这是参考了grepwin的代码实现的,对于ansi也就是windows上notepad写中文未指定的编码,它默认为gbk,其它如utf16le, utf16be,utf8也能正确识别,其它都转给encoding_rs处理(跟ripgrep一样的处理)。 由于–pre多了一步输出到console,速度肯定是有所影响的,不过我们只需要在搜索中文时才加上–pre rgpre,helm和rg.el可以如下设置:

(defun chinese-char-p (char)
    (if (string-match "\\cC\\{1\\}" (string char))
    t
    nil)
)
(defun chinese-word-chinese-string-p (string)
    "Return t if STRING is a Chinese string."
    (cl-find-if 'chinese-char-p (string-to-list string))
)

;; helm
(defadvice helm-grep-ag-prepare-cmd-line (around my-helm-grep-ag-prepare-cmd-line activate)
(if (chinese-word-chinese-string-p (ad-get-arg 0))
    (let ((helm-grep-ag-command (concat helm-grep-ag-command " --pre rgpre")))
    ad-do-it)
    ad-do-it)
)

;; rg.el
(defadvice rg-build-command (around my-rg-build-command activate)
    (if (chinese-word-chinese-string-p (ad-get-arg 0))
    (let ((rg-command-line-flags (list "--pre rgpre")))
    ad-do-it
    )
    ad-do-it)
)
4 个赞

大多数编辑器的输出就是 utf-8 的,想不多哪里会输出 gbk 编码的文件。 :rofl: