文章目录

  • 效果图在这里
  • 解决办法
    • 首先 你要有以下几个工具或者库
    • 准备好环境之后 创建以下脚本
    • 执行脚本
  • 原理
  • 实现
    • 获取程序名
    • 转换为拼音
    • 添加拼音信息

效果图在这里

解决办法

首先 你要有以下几个工具或者库

  • 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 支持拼音相关推荐

  1. 支持拼音检索的TextBox扩展控件-使用

    我的上一个支持拼音检索的TextBox扩展控件,由于有些网友留言和发邮件问如何用, 如:菜鸟AAA等当时想到肯定大家都会用,就没上传示例程序. 原文为:http://www.cnblogs.com/w ...

  2. 自制Unity文件查找器,支持拼音搜索

    前言 一个大型项目,配置表上千个是很正常的,这个时候想要搜索某个配置表,是有点蛋疼的事情. 自己写个配置查找器吧,效果如下: 优点: 搜索速度快: 支持拼音搜索: 支持快速打开: 缺点: 拼音只能挨个 ...

  3. 使用Element UI 开发页面遇到的问题之下拉菜单支持拼音缩写查询

    下拉菜单支持拼音缩写查询 下拉菜单其实就是select选择器下拉菜单,功能就是可以支持拼音缩写查询 1.既然要用到拼音搜索,我们就需要一个拼音库,在这里我推荐一个第三方包:https://github ...

  4. 类似百度输入框自动联想功能遇到的问题:Opera浏览器不支持拼音输入法时的keyup事件

    这个问题也许很多人都遇到过了,在百度能搜到很多遇到相同问题的人,但解决办法都是一个(下面是载自其他网页): [ 问题ZcT345站长站 在开启输入法的情况下,三个浏览器的具体问题如下:ZcT345站长 ...

  5. boot spring 简拼_超牛逼的下拉字典框架,支持拼音简拼搜索,代码项、代码值搜索,无限层级级联,多选、过滤自定义数据表等等...

    Dic扩展模块 Dic数据字典模块是v-ci的核心之一,为解决大数据量下拉字典效率及操作问题,特推出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼 ...

  6. 自制仿360首页支持拼音输入全模糊搜索和自动换肤

    360首页搜索效果如下 1.完成编写的schoolnet校园网主要目录结构如下 主要实现支持中文.拼音首字母.拼音全字母的智能搜索和换肤 页面效果如下 主要核心代码如下 1.head.jsp < ...

  7. java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍...

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 创作目的 想为 java 设计一款便捷易用的拼音工具. 特性 极简的 api 设计 支持转换长文本 支持多音字 支持多种拼音标 ...

  8. java分词支持拼音_java 支持分词的高性能拼音转换工具,速度是 pinyin4j

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 创作目的 想为 java 设计一款便捷易用的拼音工具. 特性 极简的 api 设计 支持转换长文本 支持多音字 支持多种拼音标 ...

  9. 在ie8上js实现简单的combobox功能(支持拼音检索)

    最近在ie8碰到一个js问题,需要实现(ie8)使用拼音或者拼音首字母来检索select中的内容,原来的combobox只能支持汉字输入检索,现在需要进行改进,现在我将一步一步的实现方法记录下来,功能 ...

  10. select2.js插件新增支持拼音搜索

    话不多说直奔主题 1.拼音搜索的原理: 将下拉框选项中的中文转换成汉语拼音,然后与输入的字母进行比较,如果包含则被检索出来. 2.效果: 3.在select2.js中找到matcher 方法,对此方法 ...

最新文章

  1. 微信小程序 统一支付 php,微信/微信小程序统一下单(PHP版)
  2. java 内存溢出-与gc
  3. 网页图表Highcharts实践教程之认识Highcharts
  4. 【收藏】Win10:路径长度超过260个字符
  5. Apache JMeter 3.2版新特性详述
  6. Windows下Anaconda3安装及使用教程
  7. 从零开始攻略PHP(8)——面向对象(下)
  8. 孩子数学总是考不好?做好这五点,下次成绩一定好
  9. 高级参数绑定(数组和List绑定)
  10. Delphi XE 10.1 Can't bind address: Address already in use. Exiting.
  11. knocout搭建静态html,Knockout 官方中文文档 - 爱整理
  12. Glusterfs分布式
  13. arduino 土壤温湿度传感器_三分钟告诉你Arduino是什么
  14. matlab中值滤波实现
  15. MATLAB——DEMATEL代码(转载)
  16. HardwareRenderer EGL error: EGL_BAD_SURFACE
  17. php 删除服务器指定目录图片
  18. numpy合并不同维度矩阵_玩数据必备Python库:Numpy使用详解
  19. word生成电子签名
  20. 网易5天python编程课_网易云课堂上自学编程?

热门文章

  1. matlab关于图像切割的一些总结:imcrop,getrect,ndgrid,函数
  2. React实战之React+Redux实现一个天气预报小项目
  3. delphi开发安卓中更改图标与APP名称
  4. php表格怎么加粉色,为什么EXCEL算出的数据表格变成粉色-这个粉红色在excel表中怎么设置出来,参数值~...
  5. 微信小程序---配置微信商户平台进行微信支付操作指南以及踩坑记录
  6. SQL注入之MYSQL注入
  7. android matrix 亮度,Android ColorMatrix 亮度矩阵 对比度矩阵 黑白矩阵 -电脑资料
  8. 关于MSXML3.dll与MSXML6.dll
  9. python 基础-----list查找重复值
  10. delphi xe 之路(14)使用FireMonkeyStyle