helm-mode打开文件支持中文搜索
helm-mode打开文件支持中文搜索
*/-->
code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}
helm-mode打开文件支持中文搜索
Table of Contents
由于helm的很多功能比较好用,于是把所有的ido全部用helm替代了。但是,其中少了使用拼音首字母进行搜索的功能,于是自己捣鼓着弄出来。
1 效果

2 pinyin-search
首先,这个功能是基于pinyin-search里面的函数来创建pinyin字母到汉字的正则表达式创建。
(setq helm-pinyin-search-p t)
(when helm-pinyin-search-p
(require 'pinyin-search))
3 helm-find-files中的拼音搜索
将原来的创建搜索的正则表达式由纯英文的改为中英文混合:
helm–mapconcat-pattern:
he => [^h]*h[^e]*e
helm–mapconcat-pinyin-pattern:
he => [^h哈]*[h哈][^e额]*[e额]
(defsubst helm--mapconcat-pinyin-pattern (pattern)
"Transform string PATTERN in regexp for further fuzzy matching.
e.g helm.el$
=> \"[^h哈]*[h哈][^e额]*[e额][^l]*l[^m]*m[^.]*[.][^e]*e[^l]*l$\"
^helm.el$
=> \"helm[.]el$\"."
(let ((ls (split-string-and-unquote pattern "")))
(if (string= "^" (car ls))
;; Exact match.
(mapconcat (lambda (c)
(if (and (string= c "$")
(string-match "$\\'" pattern))
c (regexp-quote c)))
(cdr ls) "")
;; Fuzzy match.
(mapconcat (lambda (c)
(if (and (string= c "$")
(string-match "$\\'" pattern))
c (let ((pinyin-pattern (pinyinlib-build-regexp-string c)))
(if (< (length pinyin-pattern) 3)
c
(format "[^%s]*%s" (substring pinyin-pattern 1 -1) pinyin-pattern)))))
ls ""))))
再把查找文件函数里面的helm–mapconcat-pattern替换为helm–mapconcat-pinyin-pattern:
(defun helm-ff--transform-pattern-for-completion (pattern)
"Maybe return PATTERN with it's basename modified as a regexp.
This happen only when `helm-ff-fuzzy-matching' is enabled.
This provide a similar behavior as `ido-enable-flex-matching'.
See also `helm--mapconcat-pinyin-pattern'
If PATTERN is an url returns it unmodified.
When PATTERN contain a space fallback to multi-match.
If basename contain one or more space fallback to multi-match.
If PATTERN is a valid directory name,return PATTERN unchanged."
;; handle bad filenames containing a backslash.
(setq pattern (helm-ff-handle-backslash pattern))
(let ((bn (helm-basename pattern))
(bd (or (helm-basedir pattern) ""))
;; Trigger tramp connection with file-directory-p.
(dir-p (file-directory-p pattern))
(tramp-p (cl-loop for (m . f) in tramp-methods
thereis (string-match m pattern))))
;; Always regexp-quote base directory name to handle
;; crap dirnames such e.g bookmark+
(cond
((or (and dir-p tramp-p (string-match ":\\'" pattern))
(string= pattern "")
(and dir-p (<= (length bn) 2))
;; Fix Issue #541 when BD have a subdir similar
;; to BN, don't switch to match plugin
;; which will match both.
(and dir-p (string-match (regexp-quote bn) bd)))
;; Use full PATTERN on e.g "/ssh:host:".
(regexp-quote pattern))
;; Prefixing BN with a space call multi-match completion.
;; This allow showing all files/dirs matching BN (Issue #518).
;; FIXME: some multi-match methods may not work here.
(dir-p (concat (regexp-quote bd) " " (regexp-quote bn)))
((or (not (helm-ff-fuzzy-matching-p))
(string-match "\\s-" bn)) ; Fall back to multi-match.
(concat (regexp-quote bd) bn))
((or (string-match "[*][.]?.*" bn) ; Allow entering wilcard.
(string-match "/$" pattern) ; Allow mkdir.
(string-match helm-ff-url-regexp pattern)
(and (string= helm-ff-default-directory "/") tramp-p))
;; Don't treat wildcards ("*") as regexp char.
;; (e.g ./foo/*.el => ./foo/[*].el)
(concat (regexp-quote bd)
(replace-regexp-in-string "[*]" "[*]" bn)))
(t (concat (regexp-quote bd)
(if (>= (length bn) 2) ; wait 2nd char before concating.
(progn
;; (print (helm--mapconcat-pinyin-pattern bn))
(helm--mapconcat-pinyin-pattern bn))
(concat ".*" (regexp-quote bn))))))))
将下面文件名的正则表达式修改成中英文混合就可以实现了。
4 helm-multi-files和helm-projectile中的拼音搜索
这两个模式里面的搜索不一样,因为包含全路径。
4.1 match
用来判断模式pattern和string是否匹配。
4.2 search是用于真正的搜索过滤的函数
用来搜索和过滤candidates。
(cl-defun helm-mm-3-match (str &optional (pattern helm-pattern))
"Check if PATTERN match STR.
When PATTERN contain a space, it is splitted and matching is done
with the several resulting regexps against STR.
e.g \"bar foo\" will match \"foobar\" and \"barfoo\".
Argument PATTERN, a string, is transformed in a list of
cons cell with `helm-mm-3-get-patterns' if it contain a space.
e.g \"foo bar\"=>((identity . \"foo\") (identity . \"bar\")).
Then each predicate of cons cell(s) is called with regexp of same
cons cell against STR (a candidate).
i.e (identity (string-match \"foo\" \"foo bar\")) => t."
(let ((pat (helm-mm-3-get-patterns pattern)))
(let ((source-name (assoc-default 'name (helm-get-current-source))))
;; (print (concat "8 " source-name))
(if (string= source-name "Recentf")
(cl-loop for (predicate . regexp) in pat
always (funcall predicate
(condition-case _err
;; FIXME: Probably do nothing when
;; using fuzzy leaving the job
;; to the fuzzy fn.
(string-match
(concat "\\(" regexp "\\)\\|\\(" (pinyin-search--pinyin-to-regexp regexp) "\\)") str)
(invalid-regexp nil))))
(cl-loop for (predicate . regexp) in pat
always (funcall predicate
(condition-case _err
;; FIXME: Probably do nothing when
;; using fuzzy leaving the job
;; to the fuzzy fn.
(string-match regexp str)
(invalid-regexp nil))))))))
helm-mode打开文件支持中文搜索的更多相关文章
- Raneto部署知识库平台&支持中文搜索
目录 环境 更新软件包 部署 Raneto 知识库平台 安装 Node 环境 安装 node 管理工具 查看 node 列表 安装需要的Node版本 使用 淘宝NPM源 git 使用代理设置,大陆地区 ...
- 解决 Ubuntu 下 gedit编辑器打开文件出现中文乱码问题
解决 Ubuntu 中 gedit编辑器打开文件出现中文乱码问题 1. 问题分析 在 windows 系统下,.txt 文件默认编码方式为 gb18030 格式的中文编码,而 gedit 默认的编码方 ...
- Android 解压zip文件(支持中文)
过了n多天后,当再次使用原先博客上写的那篇: Android 压缩解压zip文件 去做zip包的解压的时候,出现了原来没有发现的很多问题.首先是中文汉字问题,使用java的zip包不能很好的解决解压问 ...
- Dicom文件支持中文字符
Dicom文件的默认字符集编码为ISO-IR6,这种字符集是不支持中文的,当使用Dicom工具修改病人姓名后,名字会成乱码而无法正常显示,如下图: 知道了原因就知道解决办法了,修改Dicom的字符集( ...
- Ubuntu 14.04中gedit打开文件出现中文乱码问题
http://blog.csdn.net/cywosp/article/details/32325449/ 在中文支持配置还不完整的Ubuntu 14.04中,使用gedit打开带有中文字符的文件有时 ...
- zhuan:点滴记录——Ubuntu 14.04中gedit打开文件出现中文乱码问题
在中文支持配置还不完整的Ubuntu 14.04中,使用gedit打开带有中文字符的文件有时会出现乱码的情况,这是由于gedit对字符编码匹配不正确导致的,解决方法如下: 在终端中输入如下命令,然后重 ...
- vscode打开文件,中文显示乱码(已解决)
之前使用vscode打开keil的文件后,发现显示乱码,网上查找资料发现大多是这种方法:将files.autoGuessEncoding改为true,但是并没有用. 发现第二种方法为:在vscode中 ...
- C#导出csv文件 支持中文的解决方案
#region 导出CSV下载 string exportFileName = "Export" + DateTime.Now.ToString("yyyyMMddHHm ...
- Raneto中文搜索支持
背景 因业务部门需要在线软件使用说明文档,但我们资源不足,故我想找一个开源的知识库,发现 Raneto不错,决定使用. 官方文档相当清晰,部署完成,发布一些文章,启动项目,交由业务同事测试使用,于是我 ...
随机推荐
- SSH服务搭建、账号密码登录远程Linux虚拟机、基于密钥的安全验证(Windows_Xshell,Linux)
问题1:如果是两台虚拟机ping不同且其中一个虚拟机是克隆的另一个,需要更改一下MAC地址,关机状态下 一> "编辑虚拟机设置" 一>" 网络适配器" ...
- .eslintrc.js相关配置
module.exports = { root: true, //此项是用来指定javaScript语言类型和风格,sourceType用来指定js导入的方式,默认是script,此处设置为modul ...
- Python 学习笔记14 类 - 使用类和实例
当我们熟悉和掌握了怎么样创建类和实例以后,我们编程中的大多数工作都讲关注在类的简历和实例对象使用,修改和维护上. 结合实例我们来进一步的学习类和实例的使用: 我们新建一个汽车的类: #-*- codi ...
- [Python]判断序列是否为空的正确姿势
本篇文章起源于StackOverflow上一个热度非常高的问题: 我该如何判断一个Python列表是否为空? @Ray Vega (提问者) 举例说明,现在我得到了如下代码: a = [] 我如何该检 ...
- dataframe字段过长被截断
总之能,情况就是这样. 看看df类型: 64位明显不够用啊. 网上找到了segmentfault有这个问题,上面说试试 pd.set_option('display.width', 200) ,再百度 ...
- kubernetes(k8s)容器集群管理
Kubernetes介绍 Kubernetes是google在2014年6月开源的一个容器集群管理系统,使用go语言开发,Kubernetes也称k8s. k8s是google内部一个叫borg的容器 ...
- 【记录】Mybatis-Generator 数据层代码生成器,自动生成dao类,mapper,pojo类
Mybatis-Generator 工具来帮我们自动创建pojo类.mapper文件以及dao类并且会帮我们配置好它们的依赖关系. 官方文档地址:http://mybatis.org/generato ...
- 【记录】elasticsearch 注解
先记录地址,之后再整理 参考地址:https://blog.csdn.net/qq_28364999/article/details/81109666 https://blog.csdn.net/dy ...
- 针对类别的5中softmax_cross_entropy loss计算
# ---------------------------- #! Copyright(C) 2019 # All right reserved. # 文件名称:xxx.py # 摘 要:五种方式实现 ...
- java 三元运算符
/* 一元运算符:只需要一个数据就可以进行操作的运算符 如:取反! 自增++ 自减 -- 二元运算符:需要两个数据才可以进行操作的运算符 如:加法+ 赋值= 三元运算符: 需要三个数据才可以进行操作的 ...