让 Alfred 支持拼音
文章目录
- 效果图在这里
- 解决办法
- 首先 你要有以下几个工具或者库
- 准备好环境之后 创建以下脚本
- 执行脚本
- 原理
- 实现
- 获取程序名
- 转换为拼音
- 添加拼音信息
效果图在这里
解决办法
首先 你要有以下几个工具或者库
- python 安装方法 brew install python(brew怎么没这个命令…没有的同学请自行百度)ps:其实mac自带的python足够用了 我们只运行一个脚本而已
- pypinyin 安装方法 pip install pypinyin
- pyobjc 安装方法 pip install pyobjc
准备好环境之后 创建以下脚本
#! /usr/bin/python
# -*- coding: utf-8 -*-# @author weishu @2015/12/7import subprocess
import os
import re
import jsonfrom AppKit import NSWorkspace, NSBundle
from pypinyin import lazy_pinyin# copy from Alfred 2 preferences, if you have applications installed at other place, add it here.
APP_DIRECTORYS = [u'/Applications',u'/Applications/Xcode.app/Contents/Applications',u'/Developer/Applications',u'/Library/PreferencePannes',u'/opt/homebrew-cask/Caskroom',u'/System/Library/PreferencePannes',u'/usr/local/Cellar',u'~/Library/Caches/Metadata',u'~/Library/Mobile Documents',u'~/Library/PreferencePannes'
]def _is_application(workspace, abspath):''' is a `abspath` stand for a mac app'''return workspace.isFilePackageAtPath_(abspath)def _get_app_pinyin_name(app_name):return reduce(lambda x, y: x + y, lazy_pinyin(app_name, errors='ignore'))def _add_meta_data(app_pinyin_name, app_path):''' add meta data(comments) to the app, which can help Alfred or SpotLight find it'''print "processing %s" % app_pathtry:subprocess.check_call('xattr -w com.apple.metadata:kMDItemFinderComment %s "%s"' % (app_pinyin_name, app_path), shell=True)except:print "process %s failed, ignore." % app_pathdef _get_localized_name(abs_path):'''get the localized name of given app'''bundle = NSBundle.new()bundle.initWithPath_(abs_path)localizations = bundle.localizations()chinese = ('zh_CN', 'zh_Hans', 'zh-Hans', 'zh-CN')b = any(map(lambda x: x in localizations, chinese))if not b: return for ch in chinese:path = bundle.pathForResource_ofType_inDirectory_forLanguage_('InfoPlist', 'strings', None, ch)if not path: continue# the path must surround with "", there may be space charactersjson_str = subprocess.check_output(u'plutil -convert json -o - "%s"' % path, shell=True)# print json_strjson_res = json.loads(json_str, encoding='utf8')name = json_res.get('CFBundleName')if name: return namedef main():pattern = re.compile(r'^[\w\s.]+$')workspace = NSWorkspace.sharedWorkspace()for app_dir in APP_DIRECTORYS:if not os.path.exists(app_dir): continuefor root, dirs, files in os.walk(app_dir, topdown=True):remove_list = []for directory in dirs:full_path = os.path.join(root, directory)# print full_pathif not _is_application(workspace, full_path): continueremove_list.append(directory)try:localized_name = _get_localized_name(full_path)except:print "get localized name for %s failed. ignore" % full_path# continue# print "localized_name:", localized_name if localized_name else Noneapp_name = localized_name if localized_name else directory.rsplit(r'.')[0]if pattern.match(app_name):# print "app_name: %s not match" % app_namecontinuetry:_add_meta_data(_get_app_pinyin_name(app_name), full_path)except:# may be empty, just ignoreprint "add meta for %s failed" % full_path# if this directory is already a Application# do not traverse this; some app may be very large # and there won't be any other app inside itdirs[:] = [d for d in dirs if d not in remove_list]if __name__ == '__main__':main()
执行脚本
sudo python alfred-pinyin.py
that’s all
原理
Alfred检索程序不仅仅是检索名字,还收集了一些额外的信息;它利用了Mac文件系统的一个拓展信息的字段;如果你发现某些目录后面有@那么就是有拓展信息了:
drwxr-xr-x+ 3 root wheel 102 9 10 2014 Stickies.app/
drwxr-xr-x@ 3 weishu admin 102 3 26 2015 Sublime Text.app/
可以借助命令行工具xattr进行操作;具体使用可以man xattr.
所以,我们可以通过把拼音信息添加到文件的拓展信息里面去,这样Alfred就能借助这些信息帮助拼音检索了。
实现
获取程序名
程序名不仅仅是一个文件名这么简单,Mac软件有一个叫做localization的概念,大致就是国际化吧;程序结构把国际化的字段存放在不同的文件里面,在程序本地化之后自动load.
我们要使用的那个字段是CFBundleName
;存放在/<App>/Contents/Resources/<language>/InfoPlist.strings
这个文件里面;我们把这个名字读取出来即可。
尝试过使用objc
的接口NSBundle.localizedInfoDiction
来获取本地化的字段,无奈拿到的永远是英文字段;只好手工解析中文字段了(不会Objc );使用的命令行工具plutil:
def _get_localized_name(abs_path):'''get the localized name of given app'''bundle = NSBundle.new()bundle.initWithPath_(abs_path)localizations = bundle.localizations()chinese = ('zh_CN', 'zh_Hans')b = any(map(lambda x: x in localizations, chinese))if not b: return for ch in chinese:path = bundle.pathForResource_ofType_inDirectory_forLanguage_('InfoPlist', 'strings', None, ch)if not path: continue# the path must surround with "", there may be space charactersjson_str = subprocess.check_output(u'plutil -convert json -o - "%s"' % path, shell=True)# print json_strjson_res = json.loads(json_str, encoding='utf8')name = json_res.get('CFBundleName')if name: return name
转换为拼音
可以直接使用python的拼音转换库pypinyin,借助这个工具,一行代码搞定:
def _get_app_pinyin_name(app_name):reduce(lambda x, y: x + y, lazy_pinyin(app_name, errors='ignore'))
添加拼音信息
拼音信息被添加到文件的拓展信息里面,直接使用xattr添加即可:
def _add_meta_data(app_pinyin_name, app_path):''' add meta data(comments) to the app, which can help Alfred or SpotLight find it'''subprocess.check_call('xattr -w com.apple.metadata:kMDItemFinderComment %s %s' % (app_pinyin_name, app_path), shell=True)
好了,把这些代码整合起来,就能得到最终的结果了.
def main():pattern = re.compile(r'^[\w\s.]+$')workspace = NSWorkspace.sharedWorkspace()for app_dir in APP_DIRECTORYS:if not os.path.exists(app_dir): continuefor root, dirs, files in os.walk(app_dir, topdown=True):remove_list = []for directory in dirs:# print type(directory), root, directoryfull_path = os.path.join(root, directory)if not _is_application(workspace, full_path): continueremove_list.append(directory)localized_name = _get_localized_name(full_path)app_name = localized_name if localized_name else directory.rsplit(r'.')[0]if pattern.match(app_name): continue_add_meta_data(_get_app_pinyin_name(app_name), full_path)# if this directory is already a Application# do not traverse this; some app may be very large # and there won't be any other app inside itdirs[:] = [d for d in dirs if d not in remove_list]
git 地址:https://gist.github.com/tiann/35fb758c18036d7f8640
参考文章:http://www.jianshu.com/p/dee4d6a0ed4f
让 Alfred 支持拼音相关推荐
- 支持拼音检索的TextBox扩展控件-使用
我的上一个支持拼音检索的TextBox扩展控件,由于有些网友留言和发邮件问如何用, 如:菜鸟AAA等当时想到肯定大家都会用,就没上传示例程序. 原文为:http://www.cnblogs.com/w ...
- 自制Unity文件查找器,支持拼音搜索
前言 一个大型项目,配置表上千个是很正常的,这个时候想要搜索某个配置表,是有点蛋疼的事情. 自己写个配置查找器吧,效果如下: 优点: 搜索速度快: 支持拼音搜索: 支持快速打开: 缺点: 拼音只能挨个 ...
- 使用Element UI 开发页面遇到的问题之下拉菜单支持拼音缩写查询
下拉菜单支持拼音缩写查询 下拉菜单其实就是select选择器下拉菜单,功能就是可以支持拼音缩写查询 1.既然要用到拼音搜索,我们就需要一个拼音库,在这里我推荐一个第三方包:https://github ...
- 类似百度输入框自动联想功能遇到的问题:Opera浏览器不支持拼音输入法时的keyup事件
这个问题也许很多人都遇到过了,在百度能搜到很多遇到相同问题的人,但解决办法都是一个(下面是载自其他网页): [ 问题ZcT345站长站 在开启输入法的情况下,三个浏览器的具体问题如下:ZcT345站长 ...
- boot spring 简拼_超牛逼的下拉字典框架,支持拼音简拼搜索,代码项、代码值搜索,无限层级级联,多选、过滤自定义数据表等等...
Dic扩展模块 Dic数据字典模块是v-ci的核心之一,为解决大数据量下拉字典效率及操作问题,特推出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼 ...
- 自制仿360首页支持拼音输入全模糊搜索和自动换肤
360首页搜索效果如下 1.完成编写的schoolnet校园网主要目录结构如下 主要实现支持中文.拼音首字母.拼音全字母的智能搜索和换肤 页面效果如下 主要核心代码如下 1.head.jsp < ...
- java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍...
pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 创作目的 想为 java 设计一款便捷易用的拼音工具. 特性 极简的 api 设计 支持转换长文本 支持多音字 支持多种拼音标 ...
- java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j
pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 创作目的 想为 java 设计一款便捷易用的拼音工具. 特性 极简的 api 设计 支持转换长文本 支持多音字 支持多种拼音标 ...
- 在ie8上js实现简单的combobox功能(支持拼音检索)
最近在ie8碰到一个js问题,需要实现(ie8)使用拼音或者拼音首字母来检索select中的内容,原来的combobox只能支持汉字输入检索,现在需要进行改进,现在我将一步一步的实现方法记录下来,功能 ...
- select2.js插件新增支持拼音搜索
话不多说直奔主题 1.拼音搜索的原理: 将下拉框选项中的中文转换成汉语拼音,然后与输入的字母进行比较,如果包含则被检索出来. 2.效果: 3.在select2.js中找到matcher 方法,对此方法 ...
最新文章
- 微信小程序 统一支付 php,微信/微信小程序统一下单(PHP版)
- java 内存溢出-与gc
- 网页图表Highcharts实践教程之认识Highcharts
- 【收藏】Win10:路径长度超过260个字符
- Apache JMeter 3.2版新特性详述
- Windows下Anaconda3安装及使用教程
- 从零开始攻略PHP(8)——面向对象(下)
- 孩子数学总是考不好?做好这五点,下次成绩一定好
- 高级参数绑定(数组和List绑定)
- Delphi XE 10.1 Can't bind address: Address already in use. Exiting.
- knocout搭建静态html,Knockout 官方中文文档 - 爱整理
- Glusterfs分布式
- arduino 土壤温湿度传感器_三分钟告诉你Arduino是什么
- matlab中值滤波实现
- MATLAB——DEMATEL代码(转载)
- HardwareRenderer EGL error: EGL_BAD_SURFACE
- php 删除服务器指定目录图片
- numpy合并不同维度矩阵_玩数据必备Python库:Numpy使用详解
- word生成电子签名
- 网易5天python编程课_网易云课堂上自学编程?
热门文章
- matlab关于图像切割的一些总结:imcrop,getrect,ndgrid,函数
- React实战之React+Redux实现一个天气预报小项目
- delphi开发安卓中更改图标与APP名称
- php表格怎么加粉色,为什么EXCEL算出的数据表格变成粉色-这个粉红色在excel表中怎么设置出来,参数值~...
- 微信小程序---配置微信商户平台进行微信支付操作指南以及踩坑记录
- SQL注入之MYSQL注入
- android matrix 亮度,Android ColorMatrix 亮度矩阵 对比度矩阵 黑白矩阵 -电脑资料
- 关于MSXML3.dll与MSXML6.dll
- python 基础-----list查找重复值
- delphi xe 之路(14)使用FireMonkeyStyle