31 votes

rechercher un mot dans Dictionary.app en Terminal

Existe-t-il un script bash ou applescript permettant de rechercher un mot en /Applications/Dictionary.app à partir d'une fenêtre Terminal ?

open -a /Applications/Dictionary.app/ --args word

ignore --args, dit "tapez un mot à rechercher".

Améliorations du dictionnaire Mac suggère Control Command D Cependant, je cherche à lancer l'application complète, et pas seulement le petit popover.

0 votes

Au lieu du bouton "plus", il suffit de cliquer sur le nom du dictionnaire dans la fenêtre contextuelle pour ouvrir la recherche dans l'application du dictionnaire.

0 votes

32voto

gentmatt Points 46446

Vous pouvez utiliser...

open dict://my_word

...qui ouvrira l'application Dictionnaire et cherchera la chaîne de caractères my_word . Si vous voulez utiliser plusieurs mots, utilisez quelque chose comme open dict://"Big Bang Theory" .

Il n'y a pas de sortie dans le terminal cependant.

1 votes

Merci. Y a-t-il une liste de magicprefix ouverts :... quelque part ?

0 votes

@Denis Je ne connais pas de source qui recueille spécifiquement les options de commande non documentées pour open . Mais de manière générale, hints.macworld.com est une source bien connue de joyaux cachés. J'ai également connu une autre source qui collecte des informations non documentées. defaults write des commandes, mais je ne peux pas m'en souvenir et Google ne m'a pas aidé non plus...

0 votes

J'ai fait un bref résumé de open sur SuperUser il y a un moment superuser.com/questions/4368/os-x-equivalent-de-Windows-run-box/

24voto

Frank Grimm Points 939

En utilisant les liaisons Python Objective-C, vous pourriez créer un petit script Python script pour l'obtenir à partir du dictionnaire OS X intégré. Voici un post qui détaille ce script"

#!/usr/bin/python3

import sys
from CoreServices import DictionaryServices

def main():
    try:
        searchword = sys.argv[1]
    except IndexError:
        errmsg = 'You did not enter any terms to look up in the Dictionary.'
        print(errmsg)
        sys.exit()
    wordrange = (0, len(searchword))
    dictresult = DictionaryServices.DCSCopyTextDefinition(None, searchword, wordrange)
    if not dictresult:
        errmsg = "'%s' not found in Dictionary." % (searchword)
        print(errmsg)
    else:
        print(dictresult)

if __name__ == '__main__':
    main()

Sauvegarder cela dans dict.py et ensuite, il suffit d'exécuter python dict.py dictation

enter image description here

Consultez l'article pour plus d'instructions sur la façon de le rendre accessible sur l'ensemble de votre terminal.

0 votes

J'ai ajouté quelques remplacements de chaînes de caractères pour simuler des sauts de ligne cela semble fonctionner correctement, même si je ne l'ai pas testé de manière approfondie : gist.github.com/lambdamusic/bdd56b25a5f547599f7f

12voto

Alex Fainshtein Points 773

J'ai trouvé une solution en utilisant Swift 4.

#!/usr/bin/swift
import Foundation

if (CommandLine.argc < 2) {
    print("Usage: dictionary word")
}else{
    let argument = CommandLine.arguments[1]
    let result = DCSCopyTextDefinition(nil, argument as CFString, CFRangeMake(0, argument.count))?.takeRetainedValue() as String?
    print(result ?? "")
}
  1. sauvegardez-le en tant que dict.swift
  2. ajouter une permission en chmod +x dict.swift
  3. dictionnaire de recherche
    • exécuter avec l'interprète ./dict.swift word
    • construit par le compilateur swiftc dict.swift et exécuter ./dict word

0 votes

Merci ! Cela fonctionne, mais il faut noter que cela ne renvoie que la première correspondance dans tous les dictionnaires actifs : developer.apple.com/documentation/coreservices/ . Il semble impossible d'obtenir toutes les correspondances en utilisant l'API actuelle.

4voto

J'allais également suggérer open dict://word mais l'API du dictionnaire de Google utilise également le New Oxford American Dictionary :

#!/usr/bin/env ruby

require "open-uri"
require "json"
require "cgi"

ARGV.each { |word|
  response = open("http://www.google.com/dictionary/json?callback=dict_api.callbacks.id100&q=#{CGI.escape(word)}&sl=en&tl=en&restrict=pr,de").read
  results = JSON.parse(response.sub(/dict_api.callbacks.id100\(/, "").sub(/,200,null\)$/, ""))
  next unless results["primaries"]
  results["primaries"][0]["entries"].select { |e| e["type"] == "meaning" }.each { |entry|
    puts word + ": " + entry["terms"][0]["text"].gsub(/x3c\/?(em|i|b)x3e/, "").gsub("x27", "'")
  }
}

1 votes

Cette API Google est obsolète et renvoie 404. On dirait que dictionnaireapi.com pourrait fonctionner, il faudrait juste créer une connexion.

3voto

Huy Tran Points 131

Le code mis à jour par David Perace répond, ajoute quelques couleurs et de nouvelles lignes :

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import re
from DictionaryServices import *

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

def main():
    try:
        searchword = sys.argv[1].decode('utf-8')
    except IndexError:
        errmsg = 'You did not enter any terms to look up in the Dictionary.'
        print errmsg
        sys.exit()
    wordrange = (0, len(searchword))
    dictresult = DCSCopyTextDefinition(None, searchword, wordrange)
    if not dictresult:
        errmsg = "'%s' not found in Dictionary." % (searchword)
        print errmsg.encode('utf-8')
    else:
        result = dictresult.encode('utf-8')
        result = re.sub(r'\|(.+?)\|', bcolors.HEADER + r'/\1/' + bcolors.ENDC, result)
        result = re.sub(r'', '\n\n ' + bcolors.FAIL + ' ' + bcolors.ENDC, result)
        result = re.sub(r'• ', '\n   ' + bcolors.OKGREEN + '• ' + bcolors.ENDC, result)
        result = re.sub(r'(‘|“)(.+?)(’|”)', bcolors.WARNING + r'“\2”' + bcolors.ENDC, result)
        print result

if __name__ == '__main__':
    main()

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X