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.


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

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.


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.


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", "'")
  }
}

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

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()

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 .



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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.