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.