with
マクロは便利。
with-temp-buffer
や with-current-buffer
は超基本マクロだし、helmなども with-helm-buffer
という同じ文脈のマクロを提供している。
ふと、 with
プレフィックスのマクロがどれだけEmacsに用意されているのか気になったので調べた。
ppp, promise, asyncに依存して、次のコード片を実行すれば調べられる。
31シンボル見つかった。
emacs-version
;;=> "26.3"
(ppp-list
(promise-wait-value
(promise-wait 5
(promise:async-start
(lambda ()
(let (res)
(mapatoms
(lambda (elm)
(when (and (fboundp elm)
(string-prefix-p "with-" (symbol-name elm)))
(push elm res))))
(sort res (lambda (a b) (string< (symbol-name a) (symbol-name b))))))))))
;;=> (with-auto-compression-mode
;; with-case-table
;; with-category-table
;; with-coding-priority
;; with-connection-local-profiles
;; with-current-buffer
;; with-current-buffer-window
;; with-demoted-errors
;; with-displayed-buffer-window
;; with-electric-help
;; with-eval-after-load
;; with-file-modes
;; with-help-window
;; with-isearch-suspended
;; with-local-quit
;; with-mutex
;; with-no-warnings
;; with-output-to-string
;; with-output-to-temp-buffer
;; with-selected-frame
;; with-selected-window
;; with-silent-modifications
;; with-syntax-table
;; with-temp-buffer
;; with-temp-buffer-window
;; with-temp-file
;; with-temp-message
;; with-timeout
;; with-timeout-suspend
;; with-timeout-unsuspend
;; with-wrapper-hook)
先のコード片で面倒なことをやっているのは、いわゆる emacs -q
で実行した結果を得たいため。
今起動しているEmacsでの結果が欲しい場合はpromiseを消せば良い。
82シンボル見つかった。
(ppp-list
(let (res)
(mapatoms
(lambda (elm)
(when (and (fboundp elm)
(string-prefix-p "with-" (symbol-name elm)))
(push elm res))))
(sort res (lambda (a b) (string< (symbol-name a) (symbol-name b))))))
;;=> (with-auto-compression-mode
;; with-buffer-modified-unmodified
;; with-case-table
;; with-category-table
;; with-coding-priority
;; with-connection-local-profiles
;; with-current-buffer
;; with-current-buffer-window
;; with-decoded-time-value
;; with-demoted-errors
;; with-displayed-buffer-window
;; with-editor
;; with-editor*
;; with-editor--setup
;; with-editor-async-shell-command
;; with-editor-cancel
;; with-editor-debug
;; with-editor-emacsclient-path
;; with-editor-emacsclient-version
;; with-editor-emulate-terminal
;; with-editor-export-editor
;; with-editor-export-git-editor
;; with-editor-export-hg-editor
;; with-editor-finish
;; with-editor-kill-buffer-noop
;; with-editor-locate-emacsclient
;; with-editor-locate-emacsclient-1
;; with-editor-mode
;; with-editor-output-filter
;; with-editor-process-filter
;; with-editor-read-envvar
;; with-editor-return
;; with-editor-server-window
;; with-editor-set-process-filter
;; with-editor-shell-command
;; with-editor-shell-command-read-args
;; with-editor-usage-message
;; with-electric-help
;; with-eval-after-load
;; with-feather-dashboard-buffer
;; with-file-modes
;; with-helm-after-update-hook
;; with-helm-alive-p
;; with-helm-buffer
;; with-helm-current-buffer
;; with-helm-default-directory
;; with-helm-display-marked-candidates
;; with-helm-in-frame
;; with-helm-quittable
;; with-helm-temp-hook
;; with-helm-time-after-update
;; with-helm-window
;; with-help-window
;; with-httpd-buffer
;; with-isearch-suspended
;; with-ivy-window
;; with-local-quit
;; with-lsp-workspace
;; with-lsp-workspaces
;; with-mutex
;; with-no-warnings
;; with-output-to-string
;; with-output-to-temp-buffer
;; with-parsed-tramp-file-name
;; with-ppp--working-buffer
;; with-selected-frame
;; with-selected-window
;; with-silent-modifications
;; with-slots
;; with-syntax-table
;; with-temp-buffer
;; with-temp-buffer-window
;; with-temp-file
;; with-temp-message
;; with-timeout
;; with-timeout-suspend
;; with-timeout-unsuspend
;; with-tramp-connection-property
;; with-tramp-file-property
;; with-tramp-progress-reporter
;; with-vc-properties
;; with-wrapper-hook)