使用Dictionary.app’;在OSX上以编程方式使用s同义词库函数(最好通过Ruby)

使用Dictionary.app’;在OSX上以编程方式使用s同义词库函数(最好通过Ruby),ruby,macos,scripting,dictionary,Ruby,Macos,Scripting,Dictionary,我需要编写一个Ruby方法,它接受一个单词,通过OS10.5的Dictionary.app的同义词库函数运行它,然后返回其他单词 如果Ruby方法最终调用命令行,那就好了;我只需要能够从Ruby编程实现它 在浏览了Ruby OSA之后,我意识到可以通过一些字典服务来访问字典[,但我并不真正了解它 有人看到一个简单的解决方案吗 我还准备制作一个Automator工作流并从命令行调用它,但由于某种原因,我无法从shell中正确地为“Get Definition”函数提供一个单词(它一直说找不到该单词

我需要编写一个Ruby方法,它接受一个单词,通过OS10.5的Dictionary.app的同义词库函数运行它,然后返回其他单词

如果Ruby方法最终调用命令行,那就好了;我只需要能够从Ruby编程实现它

在浏览了Ruby OSA之后,我意识到可以通过一些字典服务来访问字典[,但我并不真正了解它

有人看到一个简单的解决方案吗


我还准备制作一个Automator工作流并从命令行调用它,但由于某种原因,我无法从shell中正确地为“Get Definition”函数提供一个单词(它一直说找不到该单词,但在手动查找时它工作正常)。

不幸的是,这是唯一的编程接口(字典服务)不支持设置字典

但是,它确实会参考字典首选项来使用指定的第一个字典,因此您可能会以非常难看的方式重置首选项,以便同义词库是唯一可用的字典

这确实令人恶心,如果被吸入,很可能会破裂,但它应该有效:

/* compile with:

   gcc -o thesaurus -framework CoreServices -framework Foundation thesaurus.m
*/

#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>

int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  NSMutableDictionary *dictionaryPrefs =
    [[userDefaults persistentDomainForName:@"com.apple.DictionaryServices"] mutableCopy];

  NSArray *activeDictionaries = [dictionaryPrefs objectForKey:@"DCSActiveDictionaries"];

  [dictionaryPrefs setObject:
    [NSArray arrayWithObject:@"/Library/Dictionaries/Oxford American Writer's Thesaurus.dictionary"]
                      forKey:@"DCSActiveDictionaries"];
  [userDefaults setPersistentDomain:dictionaryPrefs forName:@"com.apple.DictionaryServices"];

  NSString *word = [NSString stringWithUTF8String:argv[1]];
  puts([(NSString *)DCSCopyTextDefinition(NULL, (CFStringRef)word,
                                          CFRangeMake(0, [word length])) UTF8String]);

  [dictionaryPrefs setObject:activeDictionaries forKey: @"DCSActiveDictionaries"];
  [userDefaults setPersistentDomain:dictionaryPrefs forName:@"com.apple.DictionaryServices"];
}

我已经将代码更新为适用于10.7和10.8。这都归功于尼古拉斯·莱利;没有他我就无法编写它

我对其进行了轻微修改,允许您选择字典进行查找,使用方式如下:
$dictionary$PATH_TO_DICT$word

#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>

NSUserDefaults* GetUserDefaults() {
  return [NSUserDefaults standardUserDefaults];
}

NSMutableDictionary* GetGlobalDomain() {
  NSUserDefaults *userDefaults = GetUserDefaults();
  NSMutableDictionary *dictionaryPrefs =
    [[userDefaults persistentDomainForName:@"Apple Global Domain"] mutableCopy];
  return dictionaryPrefs;
}

NSMutableDictionary* GetDictionaryPreferences() {
   return [[GetGlobalDomain() objectForKey:@"com.apple.DictionaryServices"] mutableCopy];
}

NSArray* GetCurrentDictionaryList() {
  return [GetDictionaryPreferences() objectForKey:@"DCSActiveDictionaries"];
}

void SetUserDictPreferences(NSArray* array) {
  NSMutableDictionary *currentPref = GetDictionaryPreferences();
  [currentPref setObject:array forKey:@"DCSActiveDictionaries"];
  NSDictionary *immutPref = [NSDictionary dictionaryWithDictionary:currentPref];
  NSMutableDictionary *g = GetGlobalDomain();
  [g setObject:immutPref forKey:@"com.apple.DictionaryServices"];
  NSUserDefaults *defaults = GetUserDefaults();
  [defaults setPersistentDomain:g forName:@"Apple Global Domain"];
}


int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSArray *currentPrefs = GetCurrentDictionaryList();

  NSString *dict = [NSString stringWithUTF8String:argv[1]];
  NSString *word = [NSString stringWithUTF8String:argv[2]];
  SetUserDictPreferences([NSArray arrayWithObject:dict]);
  puts([(NSString *)DCSCopyTextDefinition(NULL, (CFStringRef)word,
                                          CFRangeMake(0, [word length])) UTF8String]);

  SetUserDictPreferences(currentPrefs);
}
#导入
#包括
NSUserDefaults*GetUserDefaults(){
返回[NSUserDefaults standardUserDefaults];
}
NSMutableDictionary*GetGlobalDomain(){
NSUserDefaults*userDefaults=GetUserDefaults();
NSMutableDictionary*dictionaryPrefs=
[[userDefaults persistentDomainForName:@“Apple Global Domain”]mutableCopy];
返回字典引用;
}
NSMutableDictionary*GetDictionaryPreferences(){
返回[[GetGlobalDomain()objectForKey:@“com.apple.DictionaryServices”]mutableCopy];
}
NSArray*GetCurrentDictionaryList(){
返回[GetDictionaryPreferences()objectForKey:@“DCSActiveDictionaries”];
}
void SetUserDictPreferences(NSArray*数组){
NSMutableDictionary*currentPref=GetDictionaryPreferences();
[currentPref setObject:array forKey:@“DCSActiveDictionaries”];
NSDictionary*immutPref=[NSDictionary Dictionary WithDictionary:currentPref];
NSMutableDictionary*g=GetGlobalDomain();
[g setObject:ImmutRef-forKey:@“com.apple.DictionaryServices”];
NSUserDefaults*defaults=GetUserDefaults();
[默认设置PersistentDomain:g forName:@“苹果全局域”];
}
int main(int argc,char*argv[]){
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSArray*currentPrefs=GetCurrentDictionaryList();
NSString*dict=[NSString stringWithUTF8String:argv[1]];
NSString*word=[NSString stringWithUTF8String:argv[2]];
SetUserDictPreferences([NSArray arrayWithObject:dict]);
将([(NSString*)DCSCopyTextDefinition(NULL,(CFStringRef)字,
CFRangeMake(0,[字长])UTF8String];
SetUserDictPreferences(currentPrefs);
}

Hey感谢您发布这篇文章——我刚刚编译并尝试在Mountain Lion上使用它,它返回的是字典而不是同义词表条目。您知道如何将其应用于Mountain Lion吗?或者现在可能有一个更干净的解决方案?很遗憾,dictionary Services API自10.5以来并没有改变(请提交一个bug!)但是
DCSActiveDictionaries
移动到了10.7中
com.apple.DictionaryServices
键下的
NSGlobalDomain
。我编译了,但生成的二进制文件总是只打印
(null)
。我有xcodebuild-版本Xcode 4.4.1 Build版本4F1003和gcc版本4.2.1请阅读我的评论-你不能像10.7或10.8中那样使用我的代码,你需要像我描述的那样修改它。(不,我不会为你编写代码。)Mattt Thompson写了一篇NSHipster文章,详细介绍了这个主题:
#import <Foundation/Foundation.h>
#include <CoreServices/CoreServices.h>

NSUserDefaults* GetUserDefaults() {
  return [NSUserDefaults standardUserDefaults];
}

NSMutableDictionary* GetGlobalDomain() {
  NSUserDefaults *userDefaults = GetUserDefaults();
  NSMutableDictionary *dictionaryPrefs =
    [[userDefaults persistentDomainForName:@"Apple Global Domain"] mutableCopy];
  return dictionaryPrefs;
}

NSMutableDictionary* GetDictionaryPreferences() {
   return [[GetGlobalDomain() objectForKey:@"com.apple.DictionaryServices"] mutableCopy];
}

NSArray* GetCurrentDictionaryList() {
  return [GetDictionaryPreferences() objectForKey:@"DCSActiveDictionaries"];
}

void SetUserDictPreferences(NSArray* array) {
  NSMutableDictionary *currentPref = GetDictionaryPreferences();
  [currentPref setObject:array forKey:@"DCSActiveDictionaries"];
  NSDictionary *immutPref = [NSDictionary dictionaryWithDictionary:currentPref];
  NSMutableDictionary *g = GetGlobalDomain();
  [g setObject:immutPref forKey:@"com.apple.DictionaryServices"];
  NSUserDefaults *defaults = GetUserDefaults();
  [defaults setPersistentDomain:g forName:@"Apple Global Domain"];
}


int main(int argc, char *argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSArray *currentPrefs = GetCurrentDictionaryList();

  NSString *dict = [NSString stringWithUTF8String:argv[1]];
  NSString *word = [NSString stringWithUTF8String:argv[2]];
  SetUserDictPreferences([NSArray arrayWithObject:dict]);
  puts([(NSString *)DCSCopyTextDefinition(NULL, (CFStringRef)word,
                                          CFRangeMake(0, [word length])) UTF8String]);

  SetUserDictPreferences(currentPrefs);
}