шукайте слово у Dictionary.app у Terminal


19

Чи є баш або яблучний скрипт, щоб шукати слово у /Applications/Dictionary.appвікні терміналу?

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

ігнорує --арги, каже "введіть слово, щоб шукати"

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


Замість кнопки "більше" ви просто натисніть на назву словника у спливаючому вікні, щоб відкрити пошук у словниковій програмі.
gentmatt

Відповіді:


20

Ви можете використовувати ...

open dict://my_word

... що відкриє додаток Словник і знайде рядок my_word. Якщо ви хочете використовувати кілька слів, використовуйте щось на кшталт open dict://"Big Bang Theory".

Однак у терміналі немає виводу.


Спасибі. Чи є список відкритих magicprefix: ... десь?
деніс

@Denis Я не знаю джерела, яке спеціально збирає недокументовані параметри команд для open. Але загалом кажучи, hints.macworld.com - добре відоме джерело для прихованих дорогоцінних каменів. Я також знав інше джерело, яке збирає незадокументовані defaults writeкоманди, але я не можу його пам’ятати, просто знаю, і Google мені також не допоміг ...
gentmatt

openНещодавно я зробив короткий підсумок про SuperUser superuser.com/questions/4368/os-x-equivalent-of-windows-run-box/…
Джош Хант

@denis система підтримує базу даних усіх префіксів, з якими всі встановлені програми розповіли, як працювати. Якщо ви можете придумати практичну користь для того, щоб пізнати цей примх, задати повне запитання було б дивним.
bmike

18

Використовуючи прив’язки Python Objective-C, ви можете створити лише невеликий скрипт python, щоб отримати його зі вбудованого словника OS X. Ось публікація, в якій детально описується цей сценарій "

#!/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 (на ОС 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 також використовує 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
Цей 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

2

Оновлений код з відповіді Девіда Пераса, додайте кілька кольорів та нових рядків:

#!/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 .



0

Я натрапив на цю посаду, шукаючи подібну річ. Не був задоволений доступними варіантами, тому зробив простий сценарій. Його термінальний заснований тезаурус з текстом у мовлення. Може зацікавити ...

https://github.com/aefty/thes


0

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


1
Відповіді на запитання різних повинні бути більше, ніж просто посилання. Добре включити посилання, але будь ласка, узагальнюйте або витягуйте його у відповідь. Ідея полягає в тому, щоб зробити відповідь самостійною.
nohillside
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.