buscar una palabra en Dictionary.app en Terminal

19

¿Hay un bash o applecript para buscar una palabra /Applications/Dictionary.appdesde una ventana de Terminal?

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

ignora --args, dice "escribe una palabra para buscar"

Las mejoras del Diccionario Mac sugieren, ⌃ Control ⌘ Command Dsin embargo, estoy buscando lanzar la aplicación completa, no solo el pequeño popover.

denis
fuente
En lugar del botón "más", simplemente haga clic en el nombre del diccionario en la ventana emergente para abrir la búsqueda en la aplicación del diccionario.
gentmatt
Gracias a todos, hay_more_than_one_way_to_skin_a_cat
denis

Respuestas:

20

Puedes usar...

open dict://my_word

... que abrirá la aplicación Diccionario y buscará la cadena my_word. Si quieres usar varias palabras usa algo como open dict://"Big Bang Theory".

Sin embargo, no hay salida en la Terminal.

Gentmatt
fuente
Gracias. ¿Hay una lista de prefijo mágico abierto: ... en algún lugar?
denis
@Denis No conozco una fuente que recopile específicamente opciones de comando no documentadas para open. Pero en términos generales, hints.macworld.com es una fuente bien conocida de gemas ocultas. También utilicé a conocer una fuente diferente que recoge indocumentados defaults writecomandos, pero no puedo recordar sólo saben y Google no me ayudó tampoco ...
gentmatt
Hice un breve resumen de openSuperUser hace un tiempo superuser.com/questions/4368/os-x-equivalent-of-windows-run-box/…
Josh Hunt
@denis el sistema mantiene una base de datos de todos los prefijos que todas las aplicaciones instaladas le han dicho cómo manejar. Si puede pensar en un uso práctico para conocer ese tidbit, hacer una pregunta completa sería increíble.
bmike
18

Usando los enlaces de Python Objective-C, puede crear solo un pequeño script de Python para obtenerlo del Diccionario OS X incorporado. Aquí hay una publicación que detalla este 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()

Guarda eso en dict.py, y luego solo correpython dict.py dictation

ingrese la descripción de la imagen aquí

Consulte la publicación para obtener más instrucciones sobre cómo hacer que sea accesible desde su terminal.

Josh Hunt
fuente
1
Usé este script, pero no hay un salto de línea en la salida, se ve así: i.imgur.com/ooAwQCA.png (en un OS X 10.9).
h__
Tampoco recibo nueva línea en la salida. La comprobación print repr(dictresult.encode('utf-8'))me muestra esto:'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
He agregado algunos reemplazos de cadena para simular saltos de línea ... parece funcionar bien, aunque no lo he probado exhaustivamente: gist.github.com/lambdamusic/bdd56b25a5f547599f7f
magicrebirth
Esto ya no parece funcionar.
Toothrot
4

También iba a sugerir open dict://word, pero la API del diccionario de Google también usa el 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", "'")
  }
}
Lri
fuente
1
Esa API de Google está en desuso y devuelve 404. Parece que dictionaryapi.com podría funcionar, solo tiene que iniciar sesión.
Sam Berry
4

Encontré una solución 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. guarda esto como dict.swift
  2. agregar permiso por chmod +x dict.swift
  3. diccionario de búsqueda
    • correr con intérprete ./dict.swift word
    • construir por compilador swiftc dict.swifty ejecutar./dict word
peccu
fuente
2

El código actualizado de la respuesta de David Perace, agrega algunos colores y nuevas líneas:

#!/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()
Huy Tran
fuente
1

Pruebe Dictionary OSX (hice esto después de quedarme atascado con otras respuestas y querer una solución que no sea Python). Utiliza las definiciones de Dictionary.app.

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

Utiliza DictionaryKit , un contenedor para los servicios de diccionario privados disponibles en OSX. Hay información de fondo interesante sobre cómo funciona esto en NSHipster .

odlp
fuente
0

Encontré esta publicación buscando algo similar. No estaba contento con las opciones disponibles, así que hice un script simple. Es un tesauro basado en terminal con texto a voz. Puede ser de interés ...

https://github.com/aefty/thes

usuario28958
fuente
0

Consulte el siguiente hilo para saber cómo usar Dictionary.app en la Terminal: https://discussions.apple.com/thread/2679911?start=0&tstart=0

kcidkcus
fuente
1
Las respuestas a Ask Different deben ser más que un simple enlace. Está bien incluir un enlace, pero resumirlo o extraerlo en la respuesta. La idea es hacer que la respuesta sea independiente.
Nohillside