Questions tagged [elisp-macros]

Emacs Lisp macros enable you to define new control constructs and other language features. A macro is defined much like a function, but instead of telling how to compute a value, it tells how to compute another Lisp expression, which in turn is evaluated to compute the value. We call this expression the "expansion" of the macro call. The macro call is first expanded and then evaluated, returning the value of that evaluation.

Filter by
Sorted by
Tagged with
1
vote
0answers
22 views

Navigating to a `defconst` variable defined by a Lisp macro

My goal is to define a const variable within a non-trivial macro that can be navigated to after calling describe-variable. The design goal of my macro works just fine if I define it like so: (...
1
vote
2answers
50 views

Evaluate docstring in macros

Macros like defun (or defmacro itself) have an optional docstring argument, but since they are macros and not functions, docstring isn't evaluated, but is taken as-is. I need the docstring to be ...
1
vote
1answer
29 views

How to properly generate a concat'd function name with defmacro?

I have a macro like this: (defmacro my-fun-generator (x) `(defun ,(intern (concat "fun-" x)) () ,(concat "Print " x) (interactive) (print ,x))) This works (found ...
1
vote
2answers
81 views

Macro definition

I'm in the process of "modularizing" my config file and ran into a problem involving elisp macros. Because of the way in which I'm defining my configuration modules, I ended up with a bunch ...
13
votes
2answers
2k views

“and” vs “when” for conditionals

This is a follow-up on the comments on this answer. The following bits of code seem to be equivalent: (and a b) (when a b) Of course and lets you put more conditions: (and a b c d) means (when (and ...
0
votes
1answer
58 views

compilation sentinel: symbol's value as variable is void for quote, >, <, =, etc

I'm working on a script that can compile multiple directories and then provide the first error to a file. Currently, I am tackling the issue of running make in multiple directories portion. I am ...
1
vote
1answer
56 views

How to code a command to `write-region` to a particular file?

I have a system that I am not allowed permissions to install software but need to copy text from the remote server to the host computer's system clipboard. Because I can't install xclip or xsel and I ...
3
votes
1answer
56 views

Inconsistent behavior when calling #'funcall with a macro

I would have thought that both of the funcall's the follow would have yielded the same result, but they don't and I'm trying to understand why. (defmacro test/z () "z") (funcall (function test/z)) ;;...
1
vote
0answers
39 views

Autodocument function for C Code

Suppose i have this line of code presenting a C function prototype: int sum_Func(int a, int *b) I want an Emacs lisp function that adds the function description (initialization) according to its ...
1
vote
1answer
43 views

why is switch-to-buffer effect not visible immediately when called in a list with other functions?

I have a key bound to some program which prepares a buffer, switches to it via switch-to-buffer and afterwards calls some function which modifies the buffer (and can take a few seconds to execute). ...
1
vote
2answers
352 views

CSV to Markdown table

Say we have a CSV in a buffer: foo,bar,hello 1,234,95 8923,901,145 Are there any native Emacs or Markdown-mode built-ins in Emacs that can be used to convert it to a Markdown table? It looks like ...
1
vote
1answer
124 views

Working with printed macro expansions

I am trying to write a macro. I have read the manual and learned about macroexpand. However, when I use it, I find the expansion difficult to read and work with. How can I expand a macro in a ...
0
votes
1answer
24 views

How to use a macro append macro argument to a list?

I want use a macro to generate a package list. (defvar xx-packages '()) (genpack evil) (genpack all-the-icons-ivy-rich :recipe (:host github :repo "seagle0128/all-the-icons-ivy-rich")) this ...
1
vote
1answer
39 views

Use Elisp macro instead of two function arguments?

Is the following sort of shortcut macro possible to implement? (defmacro region-end-beg () "Replacement for '(region-end) (region-begin)' in source code" (...)) So that (buffer-substring (region-...
1
vote
1answer
106 views

Why does one argument need to be quoted but not the other?

In the following code I have a reproducible example of strange behavior (the macro body is probably not important): (setq annoying-commands ()) (defmacro add-annoying-arrows-advice (cmd alternatives ...
0
votes
1answer
107 views

Is there a clean way to splice some args to an existing Lisp macro?

I have the following non-working elisp code: (use-package eglot ;; For debug/testing, load local copy of eglot if it exists ,@(if (file-directory-p (concat user-emacs-directory "/...
0
votes
1answer
68 views

How safe is “with-silent-modifications” to mask (hide) strings before and after buffer modification?

In my LaTeX code I want to replace one-line eqnarray environments with the equation environment. To do that I need to "count" the new-line (\\) strings in a region and I also need to ignore some new-...
1
vote
1answer
88 views

Making a dynamic, interactive function

I have make a macro that creates dynamic functions: (defmacro tjb-make-register-macro (func-name out-string) (list 'defun func-name () '(interactive) (list 'insert out-string))) ;; This call ...
1
vote
0answers
34 views

does this routine exist? until (while until true)

I found myself needing this control loop and was very surprised not to find it in the standard library. Does it exist by some other name? (defmacro until (form &optional guard) "Runs `while' on ...
1
vote
1answer
55 views

How do you remove compiler warnings for macro usage when running macro with 'with-eval-after-load'?

In a package I am working on I want to define a flycheck checker only if the user has flycheck installed already. To do this, I am using the macro (with-eval-after-load "flycheck" ...) as follows: (...
4
votes
3answers
110 views

How do I get byte-compilation warnings about undefined variables?

The following code works fine with M-x eval-buffer, and byte-compiles without any warnings. (eval-when-compile (defconst demo-one 1)) (defvar demo-some-var `(foo bar ,demo-one)) However, if I ...
6
votes
0answers
72 views

Evaluate some arguments to macro immediately

I am trying to call a macro (defined somewhere else; I can't change it), but I want to evaluate some of the arguments before the macro is expanded. Is this possible? For example: (defmacro foo (&...
1
vote
1answer
36 views

what is the macro “section”?

Exploring far-out init files, I found this here: (defmacro section (name &rest a) `(progn ,@a)) (put 'section 'lisp-indent-function 'defun) then it's used AFAICT as a sort of wrapper, not sure ...
2
votes
0answers
142 views

On using Elisp macros for partial application

I want to improve my Elisp, but despite reading about the differences between functions and macros (including discussions here in Emacs SE and on Reddit), I still find examples where the distinction ...
7
votes
1answer
442 views

Setf weird expansion

Trying to understand what setf can do, I called (macroexpand '(setf (aref vec i) val)) ⇒ (let* ((v vec) (v i)) (aset v v val)) This seems obviously wrong. However I couldn't create an actual ...
0
votes
1answer
42 views

Byte-compilation and “uninterned” function names

Not quite a duplicate: this appears to be very similar to the situation described in an existing question. But my question is not "why does it happen", but rather "is there any way to keep using ...
0
votes
1answer
47 views

with-query-replace-color: macro or function?

I'm trying to create my first macro. I often change the background color of the query-replace matched string in my script. I usually do: (let* ((face 'query-replace) (bg (face-background face))...
0
votes
1answer
88 views

Forcing lexical-scope in the middle of dynamic-scope

Today I ran head first into lexical vs dynamic scope in Emacs Lisp. Gist of it is I have a macro defined in lexical scope that expands into a `defun'. Let's say something simple like this: ;; -*- ...
3
votes
3answers
423 views

How to avoid use of `lexical-let`

I have a macro that intends to creates a closure: ; -*- lexical-binding: t -*- (defmacro repro () (let ((kmap-sym (gensym "kmap-"))) `(let ((,kmap-sym (make-sparse-keymap))) (define-key ,...
1
vote
1answer
73 views

Define negating pcase patterns

I am interested in extending pcase with patterns which: Complement an existing pattern, e.g. (not (pred string-empty-p)). Such a pattern would match where the non-negated form does not match and vice ...
0
votes
1answer
141 views

elips macro that return's the current file's filename

I want to define a action that says open <config file> within the actual config file itself. However, this config file may be in a different location on different computers. How can I get the ...
1
vote
1answer
46 views

macro takes multiple pairs of arguments

I found this snippet of code from oremacs (defmacro csetq (variable value) `(funcall (or (get ',variable 'custom-set) 'set-default) ',variable ,value)) I would like to expand this macro so that is ...
0
votes
1answer
43 views

Creating a macro/elisp function for HASH using calc

In my workflow, I need to do binary operations quite often. I am wondering if there is a clean way of creating macro/elisp-function to return value of following HASH function. Input 16bit hex number: ...
5
votes
2answers
140 views

How can I define new places for setf?

Q: how do I teach setf about new places it can set? In common lisp, one uses the macro defsetf to tell setf about new places it can set. In elisp, that macro exists in in the cl library, but, as far ...
0
votes
1answer
178 views

Why doesn't this `declare-function` form suppress 'Warning: the function is not known to be defined.'?

Here's my declare-function form in file A: (declare-function 'my-function "file-B" (my-func-arg &optional args)) and here's the definition of my-function in file B: ;;;###autoload (defun my-...
1
vote
1answer
143 views

Unconsumed commas in double-backquoted lists

I'm writing a macro which calls a helper function. I need to return a list like this: `(s -- (cons 'commentary s)) I have tried many combinations, but I can't seem to get what I need without an ...
1
vote
0answers
52 views

Macro expansion inside quail-define-rules

Why can't I expand a macro inside (quail-define-rules)? (defmacro quail-test () `("c" ["success!"])) (quail-define-package "experiment" "Experiment" "X" t ...
0
votes
1answer
140 views

AUCTeX set LaTeX-default-tabular-environment back to “tabular”

When I use the package tabularx in a tex file, if I insert table environment, the inner environment will be given as tabularx instead of tabular when the package tabularx is not used. Normally this ...
2
votes
1answer
129 views

improve AUCTeX macros like `\frac` and `\stackrel`

While using AUCTeX, the macro \frac is quite intelligent that when I just type C-c C-m frac RET, it will put the cursor in the first pair of braces, as \frac{(cursor here)}{} However, when I have ...
7
votes
1answer
282 views

“cl-flet” macro not allowing for recursive functions

I am used to the deprecated elisp macro flet and I was told to change to cl-flet. However upon making this change some of my elisp programs stopped working and I realized the reason is that, unlike ...
12
votes
3answers
2k views

How can I create multiple defuns by looping through a list?

I am working on optimizing my emacs config where I can dynamically create interactive functions for all themes I have in a list. Below is a simplified version of the construct I am trying to make ...
-1
votes
1answer
46 views

Writing a macro that generates a (cons atom (cons atom … ))) list

I am relatively new to elisp, and am currently in need of a macro that will take in a list, and return, not a cons-list, but: given (1 2 3 4) returns (cons 1 (cons 2 (cons 3 4))) Any help would be ...
2
votes
3answers
378 views

Eval some arguments in a macro

I want to make a macro that takes a form and returns a string with some parts of the form evaluated. The form can have any number of elements (e.g. additional options for the title font, color, size,.....
0
votes
1answer
59 views

prin1 abbreviates form with “…” despite expression-print-level?

I have the following function to produce a form that can be "printed" to a ~/.gnus file to configure gnus to use a certain stmp and imap server for an account: (defun gnus-imap-smtp-form (email smtp-...
8
votes
1answer
474 views

eval-when-compile: defsubst vs defmacro vs define-inline

I defined some simple functions in init.el, for example my-cache-file: (defconst my-cache-directory (expand-file-name ".cache" user-emacs-directory)) ; ~/.emacs/.cache (defun my-cache-...
1
vote
1answer
680 views

Passing a symbol as an argument to a function

I'm trying to understand why this doesn't work, and how to make it work: (defvar test/var-1 nil) (defvar test/var-2 nil) (defun make-setter (var-to-set) (lambda (val-to-set) (setq var-to-set ...
2
votes
2answers
172 views

Why does my function-generating macro only work when I evaluate its expansion?

I'm trying to write a macro that will define a function exactly once where I don't really care what the name of the function is. My thought was to generate a symbol, use defun with that, and then put ...
4
votes
2answers
79 views

How can I record where a function is defined if it's done indirectly?

I've got a few functions in api-wrap.el that I'll refer to as 'macro code', here simplified to clarify the question: function (generate-form prefix kind &rest args) returns an unevaluated form ...
1
vote
1answer
214 views

How can I syntax-highlight a function like a macro?

I've got a function that behaves more like a macro in that it does compile-time environment definitions. For various reasons (at this point, one of those reasons is 'because it is easier to grok in ...
2
votes
1answer
312 views

Using local variables in cl-loop

This is my first time trying to write my own elisp code, so bear with me. I have the following cl-loop: data contains the following: ((refs . [((file . "api/user.js") (start . 266) (end . 269)) ((...