cercare una parola in Dictionary.app nel Terminale


19

Esiste un bash o uno script per cercare una parola /Applications/Dictionary.appdalla finestra di un Terminale?

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

ignora --args, dice "digita una parola per cercare"

I miglioramenti del dizionario Mac suggeriscono ⌃ Control ⌘ Command Dtuttavia che sto cercando di avviare l'app completa, non solo il piccolo popover.


Invece del pulsante "Altro", fai semplicemente clic sul nome del dizionario nel pop-up per aprire la ricerca nell'applicazione del dizionario.
— gentmatt,

Risposte:


20

Puoi usare...

open dict://my_word

... che aprirà l'applicazione Dizionario e cercherà la stringa my_word. Se vuoi usare più parole usa qualcosa di simile open dict://"Big Bang Theory".

Non c'è output nel Terminale però.


Grazie. Esiste un elenco di magicprefix aperti: ... da qualche parte?
— denis,

@Denis Non conosco una fonte che raccoglie specificamente opzioni di comando non documentate per open. Ma in generale, hints.macworld.com è una fonte ben nota di gemme nascoste. Conoscevo anche un'altra fonte che raccoglie defaults writecomandi privi di documenti , ma non ricordo che sappia e Google non mi ha aiutato neanche ...
— gentmatt

Ho fatto un breve riepilogo di openSuperUser qualche tempo fa superuser.com/questions/4368/os-x-equivalent-of-windows-run-box/…
— Josh Hunt

@denis il sistema mantiene un database di tutti i prefissi che tutte le app installate gli hanno detto come gestire. Se riesci a pensare a un uso pratico per conoscere quel bocconcino, porre una domanda completa sarebbe fantastico.
— bmike

18

Usando i binding Python Objective-C, è possibile creare solo un piccolo script Python per ottenerlo dal dizionario OS X incorporato. Ecco un post che descrive in dettaglio questo script "

#!/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()

Salvalo in dict.py, quindi eseguipython dict.py dictation

inserisci qui la descrizione dell'immagine

Controlla il post per ulteriori istruzioni su come renderlo accessibile in tutto il tuo terminale.


1
Ho usato questo script, ma non c'è interruzione di linea nell'output, sembra così: i.imgur.com/ooAwQCA.png (su un OS X 10.9).
— h__

Inoltre non ottengo newline nell'output. Il controllo print repr(dictresult.encode('utf-8'))mi mostra questo:'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

Ho aggiunto alcune sostituzioni di stringhe per simulare le interruzioni di linea .. sembra funzionare bene anche se non l'ho provato ampiamente: gist.github.com/lambdamusic/bdd56b25a5f547599f7f
— magicrebirth

Questo non sembra funzionare più.
— Toothrot,

4

Stavo anche per suggerire open dict://word, ma l'API del dizionario di Google utilizza anche il 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
Che l'API di Google è obsoleta e restituisce 404. Sembra che il dizionarioapi.com potrebbe funzionare, è sufficiente effettuare un accesso.
— Sam Berry,

4

Ho trovato una soluzione usando 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. salva questo come dict.swift
  2. aggiungere il permesso di chmod +x dict.swift
  3. dizionario di ricerca
    • correre con l'interprete ./dict.swift word
    • compilato dal compilatore swiftc dict.swifted eseguito./dict word

2

Il codice aggiornato di David Perace risponde, aggiunge alcuni colori e nuove linee:

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

Prova Dizionario OSX (l'ho fatto dopo essermi bloccato con altre risposte e volendo una soluzione non Python). Utilizza le definizioni da Dictionary.app.

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

Utilizza DictionaryKit , un wrapper per i servizi di dizionario privati ​​disponibili su OSX. Ci sono interessanti informazioni di base su come funziona su NSHipster .



0

Mi sono imbattuto in questo post alla ricerca di una cosa simile. Non ero soddisfatto delle opzioni disponibili, quindi reso semplice script. È un thesaurus basato su terminali con sintesi vocale. Potrebbe essere di interesse ...

https://github.com/aefty/thes


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.