What does this do?
(add-hook 'compilation-mode-hook #'my-setup-compile-mode)
...and is it different than
(add-hook 'compilation-mode-hook 'my-setup-compile-mode)
What does this do?
(add-hook 'compilation-mode-hook #'my-setup-compile-mode)
...and is it different than
(add-hook 'compilation-mode-hook 'my-setup-compile-mode)
There is no difference:
(eq 'my-add #'my-add)
yields t
The #
can be used in front of a lambda
expression indicating to the byte-compiler that the following expression can be byte compiled, see the docs for Anonymous Functions. But there's nothing to compile in the case of a symbol.
In general, it is used in the printed representation along with the left angle bracket (<) to indicate that the object printed is a description (but cannot be read). For example:
#<buffer foo.txt>
It is also used in constructs by the reader to represent circular structures. See the docs for Read Syntax for Circular Objects.
And then you have its use for denoting the base for integers, e.g. #x2c -> 44
.
Plus more I'm sure.
'symbol
represents (quote symbol)
and #'symbol
represents (function symbol)
syntactically. –
Conjurer The should-be-comprehensive list can be found at the top of the Emacs lisp reference index.
Edit: Or even more conveniently, from within Emacs itself:
M-x info
RET (open the info browser)
d m elisp
RET (open the elisp manual)
I #
RET (list the entries for #
in the index)
I found this question while searching for what the hash meant in something I found while hacking mode-line-format
:
#("-%-" 0 3
(help-echo "Display as tooltip when mouse hovers or with display-local-help."))
which is a format used for text properties in strings where:
"-%-"
, text to be propertized: one dash and a %-construct that results in "dashes sufficient to fill the remainder of the mode line", resulting in the famous Emacs ------
.0
, the first character upon which the text properties apply.3
, the last character upon which the text properties apply, i.e. the entire "-%-"
.(help-echo "...")
, a property and a string as its argument.This can be created with the propertize
function:
(propertize "Hover over me!" 'help-echo '"congratulations!")
would be the same as #("Hover over me!" 0 14 (help-echo "Congratulations!"))
:
If you're using font lock mode, using the buffer-substring
command might produce something like this:
(buffer-substring 1 28) ; First 27 characters in the current buffer
⇒ #(";; This buffer is for notes"
0 3
(fontified t face font-lock-comment-delimiter-face)
3 27
(fontified t face font-lock-comment-face))
So you could create something like:
propertize
seems broken. See this instead: gnu.org/software/emacs/manual/html_node/elisp/… –
Lymphangitis There is a difference if you want to pass a closure around:
(setq lexical-binding t)
(defun foo () (message "outer"))
(let ((x 5))
(cl-flet ((foo () (message "inner: %d" (+ x x))))
(setq y 'foo)
(setq z #'foo)))
(funcall y)
(funcall z)
Outputs
outer
inner: 10
Though I think that's only because the cl-flet
macro has special handling for #'
aka (function ...)
. When you macroexpand it you get:
(let*
((--cl-foo--
(cl-function
(lambda nil
(message "inner: %d"
(+ x x))))))
(progn
(message "%S" #''foo)
(setq y 'foo)
(setq z --cl-foo--)))
© 2022 - 2024 — McMap. All rights reserved.
#
to a lone symbol is to get diagnostics at compile time if that symbol is undefined. – Egide