When building software for the Apple ecosystem, Xcode is often the editor of choice. With Emacs being my personal preference, I rarely find other iOS devs with a similar mindset.
When I saw Mikael Konradsson's post describing his Emacs Swift development setup, I reached out to say hello. While exchanging tips and tricks, the topic of searching Apple's docs came up. It had been a while since I looked into this, so it was a great reminder to revisit the space.
Back in June 2020, I wrote a snippet to fuzzy search hackingwithswift.com, using Emacs's ivy completion framework. With a similar online API, we could also search Apple's docs. Turns out, there is and we can we can use it to search developer.apple.com from our beloved editor.
;;; counsel-apple-search.el -*- lexical-binding: t; -*-
(defun ar/counsel-apple-search ()
"Ivy interface for dynamically querying apple.com docs."
(interactive)
(require 'request)
(require 'json)
(require 'url-http)
(ivy-read "apple docs: "
(lambda (input)
(let* ((url (url-encode-url (format "https://developer.apple.com/search/search_data.php?q=%s" input)))
(c1-width (round (* (- (window-width) 9) 0.3)))
(c2-width (round (* (- (window-width) 9) 0.5)))
(c3-width (- (window-width) 9 c1-width c2-width)))
(or
(ivy-more-chars)
(let ((request-curl-options (list "-H" (string-trim (url-http-user-agent-string)))))
(request url
:type "GET"
:parser 'json-read
:success (cl-function
(lambda (&key data &allow-other-keys)
(ivy-update-candidates
(mapcar (lambda (item)
(let-alist item
(propertize
(format "%s %s %s"
(truncate-string-to-width (propertize (or .title "")
'face '(:foreground "yellow")) c1-width nil ?\s "…")
(truncate-string-to-width (or .description "") c2-width nil ?\s "…")
(truncate-string-to-width (propertize (string-join (or .api_ref_data.languages "") "/")
'face '(:foreground "cyan1")) c3-width nil ?\s "…"))
'url .url)))
(cdr (car data)))))))
0))))
:action (lambda (selection)
(browse-url (concat "https://developer.apple.com"
(get-text-property 0 'url selection))))
:dynamic-collection t
:caller 'ar/counsel-apple-search))