procure uma palavra no Dictionary.app no ​​Terminal


19

Existe um bash ou AppleScript para procurar uma palavra em /Applications/Dictionary.appuma janela do Terminal?

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

ignora --args, diz "digite uma palavra para procurar"

As melhorias⌃ Control ⌘ Command D no Mac Dictionary sugerem, no entanto, que eu estou procurando lançar o aplicativo completo, não apenas o pequeno popover.


Em vez do botão "mais", basta clicar no nome do dicionário no pop-up para abrir a pesquisa no aplicativo de dicionário.
gentmatt

Respostas:


20

Você pode usar...

open dict://my_word

... que abrirá o aplicativo Dictionary e procurará a string my_word. Se você quiser usar várias palavras, use algo como open dict://"Big Bang Theory".

Não há saída no terminal.


Obrigado. Existe uma lista de prefixos mágicos abertos: ... em algum lugar?
Denis

@ Denis Não sei de uma fonte que coleta especificamente opções de comando não documentadas para open. Mas de um modo geral, o hints.macworld.com é uma fonte bem conhecida de jóias escondidas. Eu também costumava conhecer uma fonte diferente que recolhe indocumentados defaults writecomandos, mas não me lembro-lo apenas conhecer e Google não quer me ajudar ...
gentmatt

Fiz um resumo breve de openem SuperUser um tempo atrás superuser.com/questions/4368/os-x-equivalent-of-windows-run-box/...
Josh Hunt

@denis, o sistema mantém um banco de dados com todos os prefixos com os quais todos os aplicativos instalados disseram como lidar. Se você puder pensar em um uso prático para conhecer esse petisco, fazer uma pergunta completa seria incrível.
Bmike

18

Usando as ligações Python Objective-C, você pode criar apenas um pequeno script python para obtê-lo a partir do OS X Dictionary embutido. Aqui está uma postagem que detalha esse 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()

Salve isso e dict.py, em seguida, apenas executepython dict.py dictation

insira a descrição da imagem aqui

Confira o post para obter mais instruções sobre como acessá-lo em todo o seu terminal.


1
Eu usei esse script, mas não há quebra de linha na saída, fica assim: i.imgur.com/ooAwQCA.png (em um OS X 10.9).
h__ 23/03

Também não recebo nova linha na saída. A verificação print repr(dictresult.encode('utf-8'))me mostra o seguinte:'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

Eu adicionei algumas substituições de corda para quebras de linha simulados .. parece ok trabalho, embora eu não tenha testado extensivamente: gist.github.com/lambdamusic/bdd56b25a5f547599f7f
magicrebirth

Isso parece não funcionar mais.
Toothrot 27/03

4

Eu também sugeriria open dict://word, mas a API do dicionário do Google também usa o 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
Essa API do Google está obsoleta e retorna 404. Parece que o dictionaryapi.com pode funcionar, basta fazer um login.
Sam Berry

4

Encontrei uma solução usando o 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. salve isso como dict.swift
  2. adicionar permissão por chmod +x dict.swift
  3. dicionário de pesquisa
    • correr com intérprete ./dict.swift word
    • construir pelo compilador swiftc dict.swifte executar./dict word

2

O código atualizado da resposta de David Perace, adicione algumas cores e novas linhas:

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

Experimente o Dictionary OSX (fiz isso depois de ficar preso a outras respostas e querer uma solução não-Python). Ele usa as definições de Dictionary.app.

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

Ele usa o DictionaryKit , um wrapper para os Serviços de Dicionário privados disponíveis no OSX. Há informações interessantes sobre como isso funciona no NSHipster .



0

Me deparei com este post procurando uma coisa semelhante. Não estava satisfeito com as opções disponíveis, então fiz um script simples. É um dicionário de sinônimos baseado em terminal com texto para fala. Pode ser do seu interesse ...

https://github.com/aefty/thes


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.