Álvaro Ramírez
Emacs: Fuzzy search Apple's online docs
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))