искать слово в Dictionary.app в терминале

19

Есть ли bash или applecript для поиска слова /Applications/Dictionary.appиз окна терминала?

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

игнорирует --args, говорит "набери слово для поиска"

Улучшения в словаре Mac⌃ Control ⌘ Command D позволяют предположить, что я собираюсь запустить полное приложение, а не только небольшой поповер.

Денис
источник
Вместо кнопки «еще» вы просто нажимаете на название словаря во всплывающем окне, чтобы открыть поиск в приложении словаря.
Gentmatt
Спасибо всем, there's_more_than_one_way_to_skin_a_cat
денис

Ответы:

20

Вы можете использовать...

open dict://my_word

... который откроет приложение Dictionary и найдет строку my_word. Если вы хотите использовать несколько слов, используйте что-то вроде open dict://"Big Bang Theory".

Там нет выхода в терминале, хотя.

gentmatt
источник
Благодарю. Есть ли список открытого magicprefix: ... где-нибудь?
Денис
@ Денис Я не знаю источника, который специально собирает недокументированные параметры команды для open. Но, вообще говоря, hints.macworld.com является хорошо известным источником скрытых драгоценных камней. Я также знал другой источник, который собирает недокументированные defaults writeкоманды, но я не могу вспомнить, просто знаю, и Google мне тоже не помог ...
gentmatt
Я сделал краткое резюме openна суперпользователе некоторое время назад superuser.com/questions/4368/os-x-equivalent-of-windows-run-box/...
Джош Хант
@denis система поддерживает базу данных всех префиксов, которые все установленные приложения рассказали ей, как обрабатывать. Если вы можете подумать о практическом использовании для того, чтобы узнать этот кусочек, задавать полный вопрос было бы здорово.
bmike
18

Используя привязки Python Objective-C, вы можете создать небольшой скрипт на Python, чтобы получить его из встроенного в OS X Dictionary. Вот пост, который детализирует этот скрипт

#!/usr/bin/python

import sys
from DictionaryServices import *

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:
        print dictresult.encode('utf-8')

if __name__ == '__main__':
    main()

Сохраните это dict.py, а затем просто запуститеpython dict.py dictation

введите описание изображения здесь

Проверьте почту для большего количества инструкций о том, как сделать это доступным всем через Ваш терминал.

Джош Хант
источник
1
Я использовал этот скрипт, но в выводе нет разрыва строки, он выглядит так: i.imgur.com/ooAwQCA.png (в OS X 10.9).
h__
Я также не получаю перевод строки в выводе. Проверка print repr(dictresult.encode('utf-8'))показывает мне это:'dictation |d\xc9\xaak\xcb\x88te\xc9\xaa\xca\x83(\xc9\x99)n| \xe2\x96\xb6noun [ mass noun ] 1 the action of dictating words to be typed, written down, or recorded on tape: the dictation of letters. \xe2\x80\xa2 the activity of taking down a passage that is dictated by a teacher as a test of spelling, writing, or language skills: passages for dictation. \xe2\x80\xa2 words that are dictated: the job will involve taking dictation, drafting ...'
nnn
Я добавил некоторые замены строк, чтобы имитировать разрывы строк ... кажется, работает нормально, хотя я не проверял это подробно: gist.github.com/lambdamusic/bdd56b25a5f547599f7f
magicrebirth
Кажется, это больше не работает.
Зубной шрот
4

Я также собирался предложить open dict://word, но API словаря Google также использует Новый Оксфордский Американский Словарь:

#!/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", "'")
  }
}
LRI
источник
1
Этот API Google устарел и возвращает 404. Похоже, что dictionaryapi.com может работать, просто нужно войти в систему.
Сэм Берри
4

Я нашел решение, используя 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. сохранить это как dict.swift
  2. добавить разрешение chmod +x dict.swift
  3. поисковый словарь
    • беги с переводчиком ./dict.swift word
    • собрать компилятором swiftc dict.swiftи запустить./dict word
peccu
источник
2

Обновленный код от David Perace ответит, добавит несколько цветов и новые строки:

#!/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()
Хай Тран
источник
1

Попробуйте словарь OSX (я сделал это после того, как застрял с другими ответами и захотел не-Python решение). Он использует определения из Dictionary.app.

dictionary cat
# cat 1 |kat| ▶noun 1 a small domesticated carnivorous mammal with soft fur...

Он использует DictionaryKit , обертку для частных служб словарей, доступных в OSX. Есть интересная справочная информация о том, как это работает на NSHipster .

odlp
источник
0

Я наткнулся на этот пост в поисках аналогичной вещи. Был недоволен имеющимися опциями, поэтому сделал простой скрипт. Это основанный на терминале тезаурус с текстом в речь. Может представлять интерес ...

https://github.com/aefty/thes

user28958
источник
0

Посмотрите в следующей ветке, чтобы узнать, как использовать Dictionary.app в Терминале: https://discussions.apple.com/thread/2679911?start=0&tstart=0.

kcidkcus
источник
1
Ответы на разные вопросы должны быть чем-то большим, чем просто ссылка. Это нормально, чтобы включить ссылку, но, пожалуйста, суммируйте или извлеките ее в ответе. Идея состоит в том, чтобы сделать ответ самостоятельно.
nohillside