diff options
| author | Yuchen Pei <id@ypei.org> | 2025-01-12 19:54:55 +1100 | 
|---|---|---|
| committer | Yuchen Pei <id@ypei.org> | 2025-01-12 19:54:55 +1100 | 
| commit | 672458a898250389444a4a41a8384b9a8e3ec942 (patch) | |
| tree | 082c649a576e687f5dd20a4ca27b55186455b905 /emacs/.emacs.d/lisp | |
| parent | 264fae53a90395463f65561c2a6ac6f194521abd (diff) | |
[emacs] Add more infobox commands
info box support for exiftool, pacman, calibredb, github
also fix a bug in my-emms-wrapped
Diffstat (limited to 'emacs/.emacs.d/lisp')
| -rw-r--r-- | emacs/.emacs.d/lisp/my/infobox.el | 75 | ||||
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-emms.el | 4 | ||||
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-github.el | 50 | 
3 files changed, 125 insertions, 4 deletions
| diff --git a/emacs/.emacs.d/lisp/my/infobox.el b/emacs/.emacs.d/lisp/my/infobox.el index 0b84810..518c7db 100644 --- a/emacs/.emacs.d/lisp/my/infobox.el +++ b/emacs/.emacs.d/lisp/my/infobox.el @@ -53,7 +53,6 @@ something like  (defun infobox-render (info item &optional interactive-p)    "Render and display a help buffer of INFO." -  (help-setup-xref item interactive-p)    (with-help-window "*infobox*"      (with-current-buffer standard-output        (let ((n-rows 0)) @@ -69,6 +68,78 @@ something like           (point-min)           (progn (goto-line (1+ n-rows)) (point))           "\\(\\s-*\\):")) -      (visual-line-mode)))) +      (visual-line-mode))) +  (with-current-buffer "*infobox*" +    (let ((help-xref-following t)) +      (help-setup-xref item interactive-p) +      ))) + +(defun infobox-render-string (text item &optional interactive-p) +  (help-setup-xref item interactive-p) +  (with-help-window "*infobox*" +    (with-current-buffer standard-output +      (insert text) +      (visual-line-mode))) +  (with-current-buffer "*infobox*" +    (let ((help-xref-following t)) +      (help-setup-xref item interactive-p) +      ))) + +(defun infobox-exiftool (filename) +  (interactive (list (expand-file-name (read-file-name "infobox exiftool: ")))) +  (infobox-render-string +   (with-temp-buffer +     (call-process "exiftool" nil t nil filename) +     (buffer-string)) +   `(infobox-exiftool ,filename) +   (called-interactively-p 'interactive) +   )) + +(defun infobox-pacman (package-name) +  (interactive (list (completing-read +                      "pacman package: " +                      (infobox-pacman-installed-packages) +                      nil +                      t))) +  (infobox-render-string +   (with-temp-buffer +     (call-process "pacman" nil t nil "-Qi" package-name) +     (buffer-string)) +   `(infobox-pacman ,package-name) +   (called-interactively-p 'interactive) +   )) + +(defun infobox-pacman-installed-packages () +  "Returns list of installed packages." +  (with-temp-buffer +    (call-process "pacman" nil t nil "-Qq") +    (split-string (buffer-string) "\n"))) + +(defun infobox-calibre (book-id) +  (interactive (list (car (split-string +                           (completing-read +                            "calibre book: " +                            (infobox-calibre-books) +                            nil +                            t) +                           " ")))) +  (infobox-render-string +   (with-temp-buffer +     (call-process "calibredb" nil t nil "show_metadata" book-id) +     (buffer-string)) +   `(infobox-calibre ,book-id) +   (called-interactively-p 'interactive))) + +(defun infobox-calibre-books () +  (with-temp-buffer +    (call-process "calibredb" nil t nil "list") +    (seq-filter +     (lambda (line) (string-match-p "^[0-9]" line)) +     (split-string (buffer-string) "\n")))) + +(defun my-call-process-out (command &rest args) +  (with-temp-buffer +    (apply 'call-process (append (list command nil t nil) args)) +    (buffer-string)))  (provide 'infobox) diff --git a/emacs/.emacs.d/lisp/my/my-emms.el b/emacs/.emacs.d/lisp/my/my-emms.el index 03392be..fd3c73d 100644 --- a/emacs/.emacs.d/lisp/my/my-emms.el +++ b/emacs/.emacs.d/lisp/my/my-emms.el @@ -517,8 +517,8 @@ If the last command is `emms-playlist-mode-play-smart', then set    (let (keys)      (maphash (lambda (k _) (push k keys)) emms-score-hash)      (sort keys (lambda (k1 k2) -                 (< (second (gethash k1 emms-score-hash)) -                    (second (gethash k2 emms-score-hash))))) +                 (> (cl-second (gethash k1 emms-score-hash)) +                    (cl-second (gethash k2 emms-score-hash)))))      (message "Top 5: %s" (string-join (take 5 keys) "\n"))))  (provide 'my-emms) diff --git a/emacs/.emacs.d/lisp/my/my-github.el b/emacs/.emacs.d/lisp/my/my-github.el index 45adcf6..1643612 100644 --- a/emacs/.emacs.d/lisp/my/my-github.el +++ b/emacs/.emacs.d/lisp/my/my-github.el @@ -54,6 +54,56 @@ License; name; description; homepage; created at"          (cons "Developers" (my-grok-github-get-developer-name                              (alist-get 'url (alist-get 'owner raw)))))) +(defun my-github-api-repos (url) +  (when-let* ((urlobj (url-generic-parse-url url)) +              (path (url-filename urlobj)) +              (project-id +               (when (string-match "^/[^/]+/[^/]+" path) +                 (match-string 0 path)))) +    (my-url-fetch-json +     (format "https://api.github.com/repos%s" project-id)))) + +(defun my-github-api-readme (url) +  (when-let* ((urlobj (url-generic-parse-url url)) +              (path (url-filename urlobj)) +              (project-id +               (when (string-match "^/[^/]+/[^/]+" path) +                 (match-string 0 path))) +              ;; so that the response of readme is in html format +              (url-request-extra-headers +               '(("Accept" . "application/vnd.github.html")))) +    (my-url-fetch-raw +     (format "https://api.github.com/repos%s/readme" project-id)))) + +(defun my-github-project-infobox (url) +  (interactive "sGithub repo url: ") +  (let ((info +         (append +          (my-github-api-repos url) +          `((readme . ,(my-github-api-readme url)))))) +    (infobox-render +     (infobox-translate +      info my-github-project-info-specs) +     `(my-github-project-infobox ,url) +     (called-interactively-p 'interactive))) +  ) + +(defvar my-github-project-info-specs +  `((html_url . "Clone") +    (full_name . "Name") +    (description . "Description") +    (created_at . ("Created at" . my-gitlab-format-time-string)) +    (pushed_at . ("Pushed at" . my-gitlab-format-time-string)) +    (topics . ("Topics" . ,(lambda (xs) +                             (mapconcat #'identity xs "; ")))) +    (stargazers_count . ("Stars" . number-to-string)) +    (forks_count . ("Forks" . number-to-string)) +    (readme . (body . ,(lambda (text) +                         (with-temp-buffer +                           (insert text) +                           (shr-render-region (point-min) (point-max)) +                           (buffer-string))))))) +  (defun my-grok-github-get-developer-name (url)    (with-current-buffer (url-retrieve-synchronously url)      (set-buffer-multibyte t) | 
