embark.info (74896B)
1 This is embark.info, produced by makeinfo version 6.8 from embark.texi. 2 3 INFO-DIR-SECTION Emacs misc features 4 START-INFO-DIR-ENTRY 5 * Embark: (embark). Emacs Mini-Buffer Actions Rooted in Keymaps. 6 END-INFO-DIR-ENTRY 7 8 9 File: embark.info, Node: Top, Next: Overview, Up: (dir) 10 11 Embark: Emacs Mini-Buffer Actions Rooted in Keymaps 12 *************************************************** 13 14 * Menu: 15 16 * Overview:: 17 * Quick start:: 18 * Advanced configuration:: 19 * How does Embark call the actions?:: 20 * Embark, Marginalia and Consult: Embark Marginalia and Consult. 21 * Related Packages:: 22 * Resources:: 23 * Contributions:: 24 * Acknowledgments:: 25 26 — The Detailed Node Listing — 27 28 Overview 29 30 * Acting on targets:: 31 * The default action on a target:: 32 * Working with sets of possible targets:: 33 * Switching to a different command without losing what you've typed:: 34 35 Working with sets of possible targets 36 37 * Selecting some targets to make an ad hoc candidate set:: 38 * embark-live a live-updating variant of embark-collect:: 39 40 Advanced configuration 41 42 * Showing information about available targets and actions:: 43 * Selecting commands via completions instead of key bindings:: 44 * Quitting the minibuffer after an action:: 45 * Running some setup after injecting the target:: 46 * Running hooks before, after or around an action: Running hooks before after or around an action. 47 * Creating your own keymaps:: 48 * Defining actions for new categories of targets:: 49 50 Selecting commands via completions instead of key bindings 51 52 * Selecting commands via completion outside of Embark:: 53 54 Defining actions for new categories of targets 55 56 * New minibuffer target example - tab-bar tabs:: 57 * New target example in regular buffers - short Wikipedia links:: 58 59 How does Embark call the actions? 60 61 * Non-interactive functions as actions:: 62 63 Embark, Marginalia and Consult 64 65 * Marginalia:: 66 * Consult:: 67 68 69 70 File: embark.info, Node: Overview, Next: Quick start, Prev: Top, Up: Top 71 72 1 Overview 73 ********** 74 75 Embark makes it easy to choose a command to run based on what is near 76 point, both during a minibuffer completion session (in a way familiar to 77 Helm or Counsel users) and in normal buffers. Bind the command 78 ‘embark-act’ to a key and it acts like prefix-key for a keymap of 79 _actions_ (commands) relevant to the _target_ around point. With point 80 on an URL in a buffer you can open the URL in a browser or eww or 81 download the file it points to. If while switching buffers you spot an 82 old one, you can kill it right there and continue to select another. 83 Embark comes preconfigured with over a hundred actions for common types 84 of targets such as files, buffers, identifiers, s-expressions, 85 sentences; and it is easy to add more actions and more target types. 86 Embark can also collect all the candidates in a minibuffer to an 87 occur-like buffer or export them to a buffer in a major-mode specific to 88 the type of candidates, such as dired for a set of files, ibuffer for a 89 set of buffers, or customize for a set of variables. 90 91 * Menu: 92 93 * Acting on targets:: 94 * The default action on a target:: 95 * Working with sets of possible targets:: 96 * Switching to a different command without losing what you've typed:: 97 98 99 File: embark.info, Node: Acting on targets, Next: The default action on a target, Up: Overview 100 101 1.1 Acting on targets 102 ===================== 103 104 You can think of ‘embark-act’ as a keyboard-based version of a 105 right-click contextual menu. The ‘embark-act’ command (which you should 106 bind to a convenient key), acts as a prefix for a keymap offering you 107 relevant _actions_ to use on a _target_ determined by the context: 108 109 • In the minibuffer, the target is the current top completion 110 candidate. 111 • In the ‘*Completions*’ buffer the target is the completion at 112 point. 113 • In a regular buffer, the target is the region if active, or else 114 the file, symbol, URL, s-expression or defun at point. 115 116 Multiple targets can be present at the same location and you can 117 cycle between them by repeating the ‘embark-act’ key binding. The type 118 of actions offered depend on the type of the target. Here is a sample 119 of a few of the actions offered in the default configuration: 120 121 • For files you get offered actions like deleting, copying, renaming, 122 visiting in another window, running a shell command on the file, 123 etc. 124 • For buffers the actions include switching to or killing the buffer. 125 • For package names the actions include installing, removing or 126 visiting the homepage. 127 • For Emacs Lisp symbols the actions include finding the definition, 128 looking up documentation, evaluating (which for a variable 129 immediately shows the value, but for a function lets you pass it 130 some arguments first). There are some actions specific to 131 variables, such as setting the value directly or though the 132 customize system, and some actions specific to commands, such as 133 binding it to a key. 134 135 By default when you use ‘embark-act’ if you don’t immediately select 136 an action, after a short delay Embark will pop up a buffer showing a 137 list of actions and their corresponding key bindings. If you are using 138 ‘embark-act’ outside the minibuffer, Embark will also highlight the 139 current target. These behaviors are configurable via the variable 140 ‘embark-indicators’. Instead of selecting an action via its key 141 binding, you can select it by name with completion by typing ‘C-h’ after 142 ‘embark-act’. 143 144 Everything is easily configurable: determining the current target, 145 classifying it, and deciding which actions are offered for each type in 146 the classification. The above introduction just mentions part of the 147 default configuration. 148 149 Configuring which actions are offered for a type is particularly easy 150 and requires no programming: the variable ‘embark-keymap-alist’ 151 associates target types with variables containing keymaps, and those 152 keymaps containing bindings for the actions. (To examine the available 153 categories and their associated keymaps, you can use ‘C-h v 154 embark-keymap-alist’ or customize that variable.) For example, in the 155 default configuration the type ‘file’ is associated with the symbol 156 ‘embark-file-map’. That symbol names a keymap with single-letter key 157 bindings for common Emacs file commands, for instance ‘c’ is bound to 158 ‘copy-file’. This means that if you are in the minibuffer after running 159 a command that prompts for a file, such as ‘find-file’ or ‘rename-file’, 160 you can copy a file by running ‘embark-act’ and then pressing ‘c’. 161 162 These action keymaps are very convenient but not strictly necessary 163 when using ‘embark-act’: you can use any command that reads from the 164 minibuffer as an action and the target of the action will be inserted at 165 the first minibuffer prompt. After running ‘embark-act’ all of your key 166 bindings and even ‘execute-extended-command’ can be used to run a 167 command. For example, if you want to replace all occurrences of the 168 symbol at point, just use ‘M-%’ as the action, there is no need to bind 169 ‘query-replace’ in one of Embark’s keymaps. Also, those action keymaps 170 are normal Emacs keymaps and you should feel free to bind in them 171 whatever commands you find useful as actions and want to be available 172 through convenient bindings. 173 174 The actions in ‘embark-general-map’ are available no matter what type 175 of completion you are in the middle of. By default this includes 176 bindings to save the current candidate in the kill ring and to insert 177 the current candidate in the previously selected buffer (the buffer that 178 was current when you executed a command that opened up the minibuffer). 179 180 Emacs’s minibuffer completion system includes metadata indicating the 181 _category_ of what is being completed. For example, ‘find-file’’s 182 metadata indicates a category of ‘file’ and ‘switch-to-buffer’’s 183 metadata indicates a category of ‘buffer’. Embark has the related 184 notion of the _type_ of a target for actions, and by default when 185 category metadata is present it is taken to be the type of minibuffer 186 completion candidates when used as targets. Emacs commands often do not 187 set useful category metadata so the Marginalia 188 (https://github.com/minad/marginalia) package, which supplies this 189 missing metadata, is highly recommended for use with Embark. 190 191 Embark’s default configuration has actions for the following target 192 types: files, buffers, symbols, packages, URLs, bookmarks, and as a 193 somewhat special case, actions for when the region is active. You can 194 read about the default actions and their key bindings 195 (https://github.com/oantolin/embark/wiki/Default-Actions) on the GitHub 196 project wiki. 197 198 199 File: embark.info, Node: The default action on a target, Next: Working with sets of possible targets, Prev: Acting on targets, Up: Overview 200 201 1.2 The default action on a target 202 ================================== 203 204 Embark has a notion of default action for a target: 205 206 • If the target is a minibuffer completion candidate, then the 207 default action is whatever command opened the minibuffer in the 208 first place. For example if you run ‘kill-buffer’, then the 209 default action will be to kill buffers. 210 • If the target comes from a regular buffer (i.e., not a minibuffer), 211 then the default action is whatever is bound to ‘RET’ in the keymap 212 of actions for that type of target. For example, in Embark’s 213 default configuration for a URL found at point the default action 214 is ‘browse-url’, because ‘RET’ is bound to ‘browse-url’ in the 215 ‘embark-url-map’ keymap. 216 217 To run the default action you can press ‘RET’ after running 218 ‘embark-act’. Note that if there are several different targets at a 219 given location, each has its own default action, so first cycle to the 220 target you want and then press ‘RET’ to run the corresponding default 221 action. 222 223 There is also ‘embark-dwim’ which runs the default action for the 224 first target found. It’s pretty handy in non-minibuffer buffers: with 225 Embark’s default configuration it will: 226 227 • Open the file at point. 228 • Open the URL at point in a web browser (using the ‘browse-url’ 229 command). 230 • Compose a new email to the email address at point. 231 • In an Emacs Lisp buffer, if point is on an opening parenthesis or 232 right after a closing one, it will evaluate the corresponding 233 expression. 234 • Go to the definition of an Emacs Lisp function, variable or macro 235 at point. 236 • Find the file corresponding to an Emacs Lisp library at point. 237 238 239 File: embark.info, Node: Working with sets of possible targets, Next: Switching to a different command without losing what you've typed, Prev: The default action on a target, Up: Overview 240 241 1.3 Working with sets of possible targets 242 ========================================= 243 244 Besides acting individually on targets, Embark lets you work 245 collectively on a set of target _candidates_. For example, while you 246 are in the minibuffer the candidates are simply the possible completions 247 of your input. Embark provides three main commands to work on candidate 248 sets: 249 250 • The ‘embark-act-all’ command runs the same action on each of the 251 current candidates. It is just like using ‘embark-act’ on each 252 candidate in turn. (Because you can easily act on many more 253 candidates than you meant to, by default Embark asks you to confirm 254 uses of ‘embark-act-all’; you can turn this off by setting the user 255 option ‘embark-confirm-act-all’ to ‘nil’.) 256 257 • The ‘embark-collect’ command produces a buffer listing all the 258 current candidates, for you to peruse and run actions on at your 259 leisure. The candidates are displayed as a list showing additional 260 annotations. If any of the candidates contain newlines, then 261 horizontal lines are used to separate candidates. 262 263 The Embark Collect buffer is somewhat “dired-like”: you can select 264 and deselect candidates through ‘embark-select’ (available as an 265 action in ‘embark-act’, bound to ‘SPC’; but you could also give it 266 a global key binding). In an Embark Collect buffer ‘embark-act’ is 267 bound to ‘a’ and ‘embark-act-all’ is bound to ‘A’; ‘embark-act-all’ 268 will act on all currently marked candidates if there any, and will 269 act on all candidates if none are marked. In particular, this 270 means that ‘a SPC’ will toggle whether the candidate at point is 271 selected, and ‘A SPC’ will select all candidates if none are 272 selected, or deselect all selected candidates if there are some. 273 274 • The ‘embark-export’ command tries to open a buffer in an 275 appropriate major mode for the set of candidates. If the 276 candidates are files export produces a Dired buffer; if they are 277 buffers, you get an Ibuffer buffer; and if they are packages you 278 get a buffer in package menu mode. 279 280 If you use the grepping commands from the Consult 281 (https://github.com/minad/consult/) package, ‘consult-grep’, 282 ‘consult-git-grep’ or ‘consult-ripgrep’, then you should install 283 the ‘embark-consult’ package, which adds support for exporting a 284 list of grep results to an honest grep-mode buffer, on which you 285 can even use wgrep (https://github.com/mhayashi1120/Emacs-wgrep) if 286 you wish. 287 288 When in doubt choosing between exporting and collecting, a good rule 289 of thumb is to always prefer ‘embark-export’ since when an exporter to a 290 special major mode is available for a given type of target, it will be 291 more featureful than an Embark collect buffer, and if no such exporter 292 is configured the ‘embark-export’ command falls back to the generic 293 ‘embark-collect’. 294 295 These commands are always available as “actions” (although they do 296 not act on just the current target but on all candidates) for 297 ‘embark-act’ and are bound to ‘A’, ‘S’ (for “snapshot”), and ‘E’, 298 respectively, in ‘embark-general-map’. This means that you do not have 299 to bind your own key bindings for these (although you can, of course!), 300 just a key binding for ‘embark-act’. 301 302 In Embark Collect or Embark Export buffers that were obtained by 303 running ‘embark-collect’ or ‘embark-export’ from within a minibuffer 304 completion session, ‘g’ is bound to a command that restarts the 305 completion session, that is, the command that opened the minibuffer is 306 run again and the minibuffer contents restored. You can then interact 307 normally with the command, perhaps editing the minibuffer contents, and, 308 if you wish, you can rerun ‘embark-collect’ or ‘embark-export’ to get an 309 updated buffer. 310 311 * Menu: 312 313 * Selecting some targets to make an ad hoc candidate set:: 314 * embark-live a live-updating variant of embark-collect:: 315 316 317 File: embark.info, Node: Selecting some targets to make an ad hoc candidate set, Next: embark-live a live-updating variant of embark-collect, Up: Working with sets of possible targets 318 319 1.3.1 Selecting some targets to make an ad hoc candidate set 320 ------------------------------------------------------------ 321 322 The commands for working with sets of candidates just described, namely 323 ‘embark-act-all’, ‘embark-export’ and ‘embark-collect’ by default work 324 with all candidates defined in the current context. For example, in the 325 minibuffer they operate on all currently completion candidates, or in a 326 dired buffer they work on all marked files (or all files if none are 327 marked). Embark also has a notion of _selection_, where you can 328 accumulate an ad hoc list of targets for these commands to work on. 329 330 The selection is controlled by using the ‘embark-select’ action, 331 bound to ‘SPC’ in ‘embark-general-map’ so that it is always available 332 (you can also give ‘embark-select’ a global key binding if you wish; 333 when called directly, not as an action for ‘embark-act’, it will select 334 the first target at point). Calling this action on a target toggles its 335 membership in the current buffer’s Embark selection; that is, it adds it 336 to selection if not selected and removes it from the selection if it was 337 selected. Whenever the selection for a buffer is non-empty, the 338 commands ‘embark-act-all’, ‘embark-export’ and ‘embark-collect’ will act 339 on the selection. 340 341 To deselect all selected targets, you can use the ‘embark-select’ 342 action through ‘embark-act-all’, since this will run ‘embark-select’ on 343 each member of the current selection. Similarly if no targets are 344 selected and you are in a minibuffer completion session, running 345 ‘embark-select’ from ‘embark-act-all’ will select all the current 346 completion candidates. 347 348 By default, whenever some targets are selected in the current buffer, 349 a count of selected targets appears in the mode line. This can be 350 turned off or customized through the ‘embark-selection-indicator’ user 351 option. 352 353 The selection functionality is supported in every buffer: 354 355 • In the minibuffer this gives a convenient way to act on several 356 completion candidates that don’t follow any simple pattern: just go 357 through the completions selecting the ones you want, then use 358 ‘embark-act-all’. For example, you could attach several files at 359 once to an email. 360 • For Embark Collect buffers this functionality enables a dired-like 361 workflow, in which you mark various candidates and apply an action 362 to all at once. (It supersedes a previous ad hoc dired-like 363 interface that was implemented only in Embark Collect buffers, with 364 a slightly different interface.) 365 • In a eww buffer you could use this to select various links you wish 366 to follow up on, and then collect them into a buffer. Similarly, 367 while reading Emacs’s info manual you could select some symbols you 368 want to read more about and export them to an ‘apropos-mode’ 369 buffer. 370 • You can use selections in regular text or programming buffers to do 371 complex editing operations. For example, if you have three 372 paragraphs scattered over a file and you want to bring them 373 together, you can select each one, insert them all somewhere and 374 finally delete all of them (from their original locations). 375 376 377 File: embark.info, Node: embark-live a live-updating variant of embark-collect, Prev: Selecting some targets to make an ad hoc candidate set, Up: Working with sets of possible targets 378 379 1.3.2 ‘embark-live’ a live-updating variant of ‘embark-collect’ 380 --------------------------------------------------------------- 381 382 Finally, there is also an ‘embark-live’ variant of the ‘embark-collect’ 383 command which automatically updates the collection after each change in 384 the source buffer. Users of a completion UI that automatically updates 385 and displays the candidate list (such as Vertico, Icomplete, Fido-mode, 386 or MCT) will probably not want to use ‘embark-live’ from the minibuffer 387 as they will then have two live updating displays of the completion 388 candidates! 389 390 A more likely use of ‘embark-live’ is to be called from a regular 391 buffer to display a sort of live updating “table of contents” for the 392 buffer. This depends on having appropriate candidate collectors 393 configured in ‘embark-candidate-collectors’. There are not many in 394 Embark’s default configuration, but you can try this experiment: open a 395 dired buffer in a directory that has very many files, mark a few, and 396 run ‘embark-live’. You’ll get an Embark Collect buffer containing only 397 the marked files, which updates as you mark or unmark files in dired. 398 To make ‘embark-live’ genuinely useful other candidate collectors are 399 required. The ‘embark-consult’ package (documented near the end of this 400 manual) contains a few: one for imenu items and one for outline headings 401 as used by ‘outline-minor-mode’. Those collectors really do give 402 ‘embark-live’ a table-of-contents feel. 403 404 405 File: embark.info, Node: Switching to a different command without losing what you've typed, Prev: Working with sets of possible targets, Up: Overview 406 407 1.4 Switching to a different command without losing what you’ve typed 408 ===================================================================== 409 410 Embark also has the ‘embark-become’ command which is useful for when you 411 run a command, start typing at the minibuffer and realize you meant a 412 different command. The most common case for me is that I run 413 ‘switch-to-buffer’, start typing a buffer name and realize I haven’t 414 opened the file I had in mind yet! I’ll use this situation as a running 415 example to illustrate ‘embark-become’. When this happens I can, of 416 course, press ‘C-g’ and then run ‘find-file’ and open the file, but this 417 requires retyping the portion of the file name you already typed. This 418 process can be streamlined with ‘embark-become’: while still in the 419 ‘switch-to-buffer’ you can run ‘embark-become’ and effectively make the 420 ‘switch-to-buffer’ command become ‘find-file’ for this run. 421 422 You can bind ‘embark-become’ to a key in ‘minibuffer-local-map’, but 423 it is also available as an action under the letter ‘B’ (uppercase), so 424 you don’t need a binding if you already have one for ‘embark-act’. So, 425 assuming I have ‘embark-act’ bound to, say, ‘C-.’, once I realize I 426 haven’t open the file I can type ‘C-. B C-x C-f’ to have 427 ‘switch-to-buffer’ become ‘find-file’ without losing what I have already 428 typed in the minibuffer. 429 430 But for even more convenience, ‘embark-become’ offers shorter key 431 bindings for commands you are likely to want the current command to 432 become. When you use ‘embark-become’ it looks for the current command 433 in all keymaps named in the list ‘embark-become-keymaps’ and then 434 activates all keymaps that contain it. For example, the default value 435 of ‘embark-become-keymaps’ contains a keymap 436 ‘embark-become-file+buffer-map’ with bindings for several commands 437 related to files and buffers, in particular, it binds ‘switch-to-buffer’ 438 to ‘b’ and ‘find-file’ to ‘f’. So when I accidentally try to switch to 439 a buffer for a file I haven’t opened yet, ‘embark-become’ finds that the 440 command I ran, ‘switch-to-buffer’, is in the keymap 441 ‘embark-become-file+buffer-map’, so it activates that keymap (and any 442 others that also contain a binding for ‘switch-to-buffer’). The end 443 result is that I can type ‘C-. B f’ to switch to ‘find-file’. 444 445 446 File: embark.info, Node: Quick start, Next: Advanced configuration, Prev: Overview, Up: Top 447 448 2 Quick start 449 ************* 450 451 The easiest way to install Embark is from GNU ELPA, just run ‘M-x 452 package-install RET embark RET’. (It is also available on MELPA.) It 453 is highly recommended to also install Marginalia 454 (https://github.com/minad/marginalia) (also available on GNU ELPA), so 455 that Embark can offer you preconfigured actions in more contexts. For 456 ‘use-package’ users, the following is a very reasonable starting 457 configuration: 458 459 (use-package marginalia 460 :ensure t 461 :config 462 (marginalia-mode)) 463 464 (use-package embark 465 :ensure t 466 467 :bind 468 (("C-." . embark-act) ;; pick some comfortable binding 469 ("C-;" . embark-dwim) ;; good alternative: M-. 470 ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' 471 472 :init 473 474 ;; Optionally replace the key help with a completing-read interface 475 (setq prefix-help-command #'embark-prefix-help-command) 476 477 ;; Show the Embark target at point via Eldoc. You may adjust the 478 ;; Eldoc strategy, if you want to see the documentation from 479 ;; multiple providers. Beware that using this can be a little 480 ;; jarring since the message shown in the minibuffer can be more 481 ;; than one line, causing the modeline to move up and down: 482 483 ;; (add-hook 'eldoc-documentation-functions #'embark-eldoc-first-target) 484 ;; (setq eldoc-documentation-strategy #'eldoc-documentation-compose-eagerly) 485 486 :config 487 488 ;; Hide the mode line of the Embark live/completions buffers 489 (add-to-list 'display-buffer-alist 490 '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" 491 nil 492 (window-parameters (mode-line-format . none))))) 493 494 ;; Consult users will also want the embark-consult package. 495 (use-package embark-consult 496 :ensure t ; only need to install it, embark loads it after consult if found 497 :hook 498 (embark-collect-mode . consult-preview-at-point-mode)) 499 500 About the suggested key bindings for ‘embark-act’ and ‘embark-dwim’: 501 • Those key bindings are unlikely to work in the terminal, but 502 terminal users are probably well aware of this and will know to 503 select different bindings. 504 • The suggested ‘C-.’ binding is used by default in (at least some 505 installations of) GNOME to input emojis, and Emacs doesn’t even get 506 a chance to respond to the binding. You can select a different key 507 binding for ‘embark-act’ or use ‘ibus-setup’ to change the shortcut 508 for emoji insertion (Emacs 29 uses ‘C-x 8 e e’, in case you want to 509 set the same one system-wide). 510 • The suggested alternative of ‘M-.’ for ‘embark-dwim’ is bound by 511 default to ‘xref-find-definitions’. That is a very useful command 512 but overwriting it with ‘embark-dwim’ is sensible since in Embark’s 513 default configuration, ‘embark-dwim’ will also find the definition 514 of the identifier at point. (Note that ‘xref-find-definitions’ 515 with a prefix argument prompts you for an identifier, ‘embark-dwim’ 516 does not cover this case). 517 518 Other Embark commands such as ‘embark-act-all’, ‘embark-become’, 519 ‘embark-collect’, and ‘embark-export’ can be run through ‘embark-act’ as 520 actions bound to ‘A’, ‘B’, ‘S’ (for “snapshot”), and ‘E’ respectively, 521 and thus don’t really need a dedicated key binding, but feel free to 522 bind them directly if you so wish. If you do choose to bind them 523 directly, you’ll probably want to bind them in ‘minibuffer-local-map’, 524 since they are most useful in the minibuffer (in fact, ‘embark-become’ 525 only works in the minibuffer). 526 527 The command ‘embark-dwim’ executes the default action at point. 528 Another good keybinding for ‘embark-dwim’ is ‘M-.’ since ‘embark-dwim’ 529 acts like ‘xref-find-definitions’ on the symbol at point. ‘C-.’ can be 530 seen as a right-click context menu at point and ‘M-.’ acts like 531 left-click. The keybindings are mnemonic, both act at the point (‘.’). 532 533 Embark needs to know what your minibuffer completion system considers 534 to be the list of candidates and which one is the current candidate. 535 Embark works out of the box if you use Emacs’s default tab completion, 536 the built-in ‘icomplete-mode’ or ‘fido-mode’, or the third-party 537 packages Vertico (https://github.com/minad/vertico) or Ivy 538 (https://github.com/abo-abo/swiper). 539 540 If you are a Helm (https://emacs-helm.github.io/helm/) or Ivy 541 (https://github.com/abo-abo/swiper) user you are unlikely to want Embark 542 since those packages include comprehensive functionality for acting on 543 minibuffer completion candidates. (Embark does come with Ivy 544 integration despite this.) 545 546 547 File: embark.info, Node: Advanced configuration, Next: How does Embark call the actions?, Prev: Quick start, Up: Top 548 549 3 Advanced configuration 550 ************************ 551 552 * Menu: 553 554 * Showing information about available targets and actions:: 555 * Selecting commands via completions instead of key bindings:: 556 * Quitting the minibuffer after an action:: 557 * Running some setup after injecting the target:: 558 * Running hooks before, after or around an action: Running hooks before after or around an action. 559 * Creating your own keymaps:: 560 * Defining actions for new categories of targets:: 561 562 563 File: embark.info, Node: Showing information about available targets and actions, Next: Selecting commands via completions instead of key bindings, Up: Advanced configuration 564 565 3.1 Showing information about available targets and actions 566 =========================================================== 567 568 By default, if you run ‘embark-act’ and do not immediately select an 569 action, after a short delay Embark will pop up a buffer called ‘*Embark 570 Actions*’ containing a list of available actions with their key 571 bindings. You can scroll that buffer with the mouse of with the usual 572 commands ‘scroll-other-window’ and ‘scroll-other-window-down’ (bound by 573 default to ‘C-M-v’ and ‘C-M-S-v’). 574 575 That functionality is provided by the ‘embark-mixed-indicator’, but 576 Embark has other indicators that can provide information about the 577 target and its type, what other targets you can cycle to, and which 578 actions have key bindings in the action map for the current type of 579 target. Any number of indicators can be active at once and the user 580 option ‘embark-indicators’ should be set to a list of the desired 581 indicators. 582 583 Embark comes with the following indicators: 584 585 • ‘embark-minimal-indicator’: shows a messages in the echo area or 586 minibuffer prompt showing the current target and the types of all 587 targets starting with the current one. 588 589 • ‘embark-highlight-indicator’: highlights the target at point; on by 590 default. 591 592 • ‘embark-verbose-indicator’: displays a table of actions and their 593 key bindings in a buffer; this is not on by default, in favor of 594 the mixed indicator described next. 595 596 • ‘embark-mixed-indicator’: starts out by behaving as the minimal 597 indicator but after a short delay acts as the verbose indicator; 598 this is on by default. 599 600 • ‘embark-isearch-highlight-indicator’: this only does something when 601 the current target is the symbol at point, in which case it lazily 602 highlights all occurrences of that symbol in the current buffer, 603 like isearch; also on by default. 604 605 Users of the popular which-key 606 (https://github.com/justbur/emacs-which-key) package may prefer to use 607 the ‘embark-which-key-indicator’ from the Embark wiki 608 (https://github.com/oantolin/embark/wiki/Additional-Configuration#use-which-key-like-a-key-menu-prompt). 609 Just copy its definition from the wiki into your configuration and 610 customize the ‘embark-indicators’ user option to exclude the mixed and 611 verbose indicators and to include ‘embark-which-key-indicator’. 612 613 If you use Vertico (https://github.com/minad/vertico), there is an 614 even easier way to get a ‘which-key’-like display that also lets you use 615 completion to narrow down the list of alternatives, described at the end 616 of the next section. 617 618 619 File: embark.info, Node: Selecting commands via completions instead of key bindings, Next: Quitting the minibuffer after an action, Prev: Showing information about available targets and actions, Up: Advanced configuration 620 621 3.2 Selecting commands via completions instead of key bindings 622 ============================================================== 623 624 As an alternative to reading the list of actions in the verbose or mixed 625 indicators (see the previous section for a description of these), you 626 can press the ‘embark-help-key’, which is ‘C-h’ by default (but you may 627 prefer ‘?’ to free up ‘C-h’ for use as a prefix) after running 628 ‘embark-act’. Pressing the help key will prompt you for the name of an 629 action with completion (but feel free to enter a command that is not 630 among the offered candidates!), and will also remind you of the key 631 bindings. You can press ‘embark-keymap-prompter-key’, which is ‘@’ by 632 default, at the prompt and then one of the key bindings to enter the 633 name of the corresponding action. 634 635 You may think that with the ‘*Embark Actions*’ buffer popping up to 636 remind you of the key bindings you’d never want to use completion to 637 select an action by name, but personally I find that typing a small 638 portion of the action name to narrow down the list of candidates feels 639 significantly faster than visually scanning the entire list of actions. 640 641 If you find you prefer selecting actions that way, you can configure 642 embark to always prompt you for actions by setting the variable 643 ‘embark-prompter’ to ‘embark-completing-read-prompter’. 644 645 On the other hand, you may wish to continue using key bindings for 646 the actions you perform most often, and to use completion only to 647 explore what further actions are available or when you’ve forgotten a 648 key binding. In that case, you may prefer to use the minimal indicator, 649 which does not pop-up an ‘*Embark Actions*’ buffer at all, and to use 650 the ‘embark-help-key’ whenever you need help. This unobtrusive setup is 651 achieved with the following configuration: 652 653 (setq embark-indicators 654 '(embark-minimal-indicator ; default is embark-mixed-indicator 655 embark-highlight-indicator 656 embark-isearch-highlight-indicator)) 657 658 Vertico (https://github.com/minad/vertico) users may wish to 659 configure a grid display for the actions and key-bindings, reminiscent 660 of the popular package which-key 661 (https://github.com/justbur/emacs-which-key), but, of course, enhanced 662 by the use of completion to narrow the list of commands. In order to 663 get the grid display, put the following in your Vertico configuration: 664 665 (add-to-list 'vertico-multiform-categories '(embark-keybinding grid)) 666 (vertico-multiform-mode) 667 668 This will make the available keys be shown in a compact grid like in 669 ‘which-key’. The ‘vertico-multiform-mode’ also enables keys such as 670 ‘M-V’, ‘M-G’, ‘M-B’, and ‘M-U’ for manually switching between layouts in 671 Vertico buffers. 672 673 * Menu: 674 675 * Selecting commands via completion outside of Embark:: 676 677 678 File: embark.info, Node: Selecting commands via completion outside of Embark, Up: Selecting commands via completions instead of key bindings 679 680 3.2.1 Selecting commands via completion outside of Embark 681 --------------------------------------------------------- 682 683 If you like this completion interface for exploring key bindings for 684 Embark actions, you may want to use it elsewhere in Emacs. You can use 685 Embark’s completion-based command prompter to list: 686 687 • key bindings under a prefix, 688 • local key bindings, or 689 • all key bindings. 690 691 To use it for key bindings under a prefix (you can use this to 692 replace the ‘which-key’ package, for example), use this configuration: 693 694 (setq prefix-help-command #'embark-prefix-help-command) 695 696 Now, when you have started on a prefix sequence such as ‘C-x’ or 697 ‘C-c’, pressing ‘C-h’ will bring up the Embark version of the built-in 698 ‘prefix-help-command’, which will list the keys under that prefix and 699 their bindings, and lets you select the one you wanted with completion, 700 or by key binding if you press ‘embark-keymap-prompter-key’. 701 702 To list local or global key bindings, use the command 703 ‘embark-bindings’. You can bind that to ‘C-h b’, which is the default 704 key binding for the built-in ‘describe-bindings’ command, which this 705 command can replace. By default, ‘embark-bindings’ lists local key 706 bindings, typically those bound in the major mode keymap; to get global 707 bindings as well, call it with a ‘C-u’ prefix argument. 708 709 710 File: embark.info, Node: Quitting the minibuffer after an action, Next: Running some setup after injecting the target, Prev: Selecting commands via completions instead of key bindings, Up: Advanced configuration 711 712 3.3 Quitting the minibuffer after an action 713 =========================================== 714 715 By default, if you call ‘embark-act’ from the minibuffer it quits the 716 minibuffer after performing the action. You can change this by setting 717 the user option ‘embark-quit-after-action’ to ‘nil’. Having 718 ‘embark-act’ _not_ quit the minibuffer can be useful to turn commands 719 into little “thing managers”. For example, you can use ‘find-file’ as a 720 little file manager or ‘describe-package’ as a little package manager: 721 you can run those commands, perform a series of actions, and then quit 722 the command. 723 724 If you want to control the quitting behavior in a fine-grained manner 725 depending on the action, you can set ‘embark-quit-after-action’ to an 726 alist, associating commands to either ‘t’ for quitting or ‘nil’ for not 727 quitting. When using an alist, you can use the special key ‘t’ to 728 specify the default behavior. For example, to specify that by default 729 actions should not quit the minibuffer but that using ‘kill-buffer’ as 730 an action should quit, you can use the following configuration: 731 732 (setq embark-quit-after-action '((kill-buffer . t) (t . nil))) 733 734 The variable ‘embark-quit-after-action’ only specifies a default, 735 that is, it only controls whether or not ‘embark-act’ quits the 736 minibuffer when you call it without a prefix argument, and you can 737 select the opposite behavior to what the variable says by calling 738 ‘embark-act’ with ‘C-u’. Also note that both the variable 739 ‘embark-quit-after-action’ and ‘C-u’ have no effect when you call 740 ‘embark-act’ outside the minibuffer. 741 742 If you find yourself using the quitting and non-quitting variants of 743 ‘embark-act’ about equally often, independently of the action, you may 744 prefer to simply have separate commands for them instead of a single 745 command that you call with ‘C-u’ half the time. You could, for example, 746 keep the default exiting behavior of ‘embark-act’ and define a 747 non-quitting version as follows: 748 749 (defun embark-act-noquit () 750 "Run action but don't quit the minibuffer afterwards." 751 (interactive) 752 (let ((embark-quit-after-action nil)) 753 (embark-act))) 754 755 756 File: embark.info, Node: Running some setup after injecting the target, Next: Running hooks before after or around an action, Prev: Quitting the minibuffer after an action, Up: Advanced configuration 757 758 3.4 Running some setup after injecting the target 759 ================================================= 760 761 You can customize what happens after the target is inserted at the 762 minibuffer prompt of an action. There are 763 ‘embark-target-injection-hooks’, that are run by default after injecting 764 the target into the minibuffer. The variable 765 ‘embark-target-injection-hooks’ is an alist associating commands to 766 their setup hooks. There are two special keys: if no setup hook is 767 specified for a given action, the hook associated to ‘t’ is run; and the 768 hook associated to ‘:always’ is run regardless of the action. (This 769 variable used to have the less explicit name of 770 ‘embark-setup-action-hooks’, so please update your configuration.) 771 772 For example, consider using ‘shell-command’ as an action during file 773 completion. It would be useful to insert a space before the target file 774 name and to leave the point at the beginning, so you can immediately 775 type the shell command to run on that file. That’s why in Embark’s 776 default configuration there is an entry in 777 ‘embark-target-injection-hooks’ associating ‘shell-command’ to a hook 778 that includes ‘embark--shell-prep’, a simple helper function that quotes 779 all the spaces in the file name, inserts an extra space at the beginning 780 of the line and leaves point to the left of it. 781 782 Now, the preparation that ‘embark--shell-prep’ does would be useless 783 if Embark did what it normally does after it inserts the target of the 784 action at the minibuffer prompt, which is to “press ‘RET’” for you, 785 accepting the target as is; if Embark did that for ‘shell-command’ you 786 wouldn’t get a chance to type in the command to execute! That is why in 787 Embark’s default configuration the entry for ‘shell-command’ in 788 ‘embark-target-injection-hooks’ also contains the function 789 ‘embark--allow-edit’. 790 791 Embark used to have a dedicated variable ‘embark-allow-edit-actions’ 792 to which you could add commands for which Embark should forgo pressing 793 ‘RET’ for you after inserting the target. Since its effect can also be 794 achieved via the general ‘embark-target-injection-hooks’ mechanism, that 795 variable has been removed to simplify Embark. Be sure to update your 796 configuration; if you had something like: 797 798 (add-to-list 'embark-allow-edit-actions 'my-command) 799 800 you should replace it with: 801 802 (push 'embark--allow-edit 803 (alist-get 'my-command embark-target-injection-hooks)) 804 805 Also note that while you could abuse ‘embark--allow-edit’ so that you 806 have to confirm “dangerous” actions such as ‘delete-file’, it is better 807 to implement confirmation by adding the ‘embark--confirm’ function to 808 the appropriate entry of a different hook alist, namely, 809 ‘embark-pre-action-hooks’. 810 811 Besides ‘embark--allow-edit’, Embark comes with another function that 812 is of general utility in action setup hooks: ‘embark--ignore-target’. 813 Use it for commands that do prompt you in the minibuffer but for which 814 inserting the target would be inappropriate. This is not a common 815 situation but does occasionally arise. For example it is used by 816 default for ‘shell-command-on-region’: that command is used as an action 817 for region targets, and it prompts you for a shell command; you 818 typically do _not_ want the target, that is the contents of the region, 819 to be entered at that prompt! 820 821 822 File: embark.info, Node: Running hooks before after or around an action, Next: Creating your own keymaps, Prev: Running some setup after injecting the target, Up: Advanced configuration 823 824 3.5 Running hooks before, after or around an action 825 =================================================== 826 827 Embark has three variables, ‘embark-pre-action-hooks’, 828 ‘embark-post-action-hooks’ and ‘embark-around-action-hooks’, which are 829 alists associating commands to hooks that should run before or after or 830 as around advice for the command when used as an action. As with 831 ‘embark-target-injection-hooks’, there are two special keys for the 832 alists: ‘t’ designates the default hook to run when no specific hook is 833 specified for a command; and the hook associated to ‘:always’ runs 834 regardless. 835 836 The default values of those variables are fairly extensive, adding 837 creature comforts to make running actions a smooth experience. Embark 838 comes with several functions intended to be added to these hooks, and 839 used in the default values of ‘embark-pre-action-hooks’, 840 ‘embark-post-action-hooks’ and ‘embark-around-action-hooks’. 841 842 For pre-action hooks: 843 844 ‘embark--confirm’ 845 Prompt the user for confirmation before executing the action. This 846 is used be default for commands deemed “dangerous”, or, more 847 accurately, hard to undo, such as ‘delete-file’ and ‘kill-buffer’. 848 849 ‘embark--unmark-target’ 850 Unmark the active region. Use this for commands you want to act on 851 the region contents but without the region being active. The 852 default configuration uses this function as a pre-action hook for 853 ‘occur’ and ‘query-replace’, for example, so that you can use them 854 as actions with region targets to search the whole buffer for the 855 text contained in the region. Without this pre-action hook using 856 ‘occur’ as an action for a region target would be pointless: it 857 would search for the the region contents _in the region_, 858 (typically, due to the details of regexps) finding only one match! 859 860 ‘embark--beginning-of-target’ 861 Move to the beginning of the target (for targets that report 862 bounds). This is used by default for backward motion commands such 863 as ‘backward-sexp’, so that they don’t accidentally leave you on 864 the current target. 865 866 ‘embark--end-of-target’ 867 Move to the end of the target. This is used similarly to the 868 previous function, but also for commands that act on the last 869 s-expression like ‘eval-last-sexp’. This allow you to act on an 870 s-expression from anywhere inside it and still use ‘eval-last-sexp’ 871 as an action. 872 873 ‘embark--xref-push-markers’ 874 Push the current location on the xref marker stack. Use this for 875 commands that take you somewhere and for which you’d like to be 876 able to come back to where you were using ‘xref-pop-marker-stack’. 877 This is used by default for ‘find-library’. 878 879 For post-action hooks: 880 881 ‘embark--restart’ 882 Restart the command currently prompting in the minibuffer, so that 883 the list of completion candidates is updated. This is useful as a 884 post action hook for commands that delete or rename a completion 885 candidate; for example the default value of 886 ‘embark-post-action-hooks’ uses it for ‘delete-file’, 887 ‘kill-buffer’, ‘rename-file’, ‘rename-buffer’, etc. 888 889 For around-action hooks: 890 891 ‘embark--mark-target’ 892 Save existing mark and point location, mark the target and run the 893 action. Most targets at point outside the minibuffer report which 894 region of the buffer they correspond to (this is the information 895 used by ‘embark-highlight-indicator’ to know what portion of the 896 buffer to highlight); this function marks that region. It is 897 useful as an around action hook for commands that expect a region 898 to be marked, for example, it is used by default for 899 ‘indent-region’ so that it works on s-expression targets, or for 900 ‘fill-region’ so that it works on paragraph targets. 901 902 ‘embark--cd’ 903 Run the action with ‘default-directory’ set to the directory 904 associated to the current target. The target should be of type 905 ‘file’, ‘buffer’, ‘bookmark’ or ‘library’, and the associated 906 directory is what you’d expect in each case. 907 908 ‘embark--narrow-to-target’ 909 Run the action with buffer narrowed to current target. Use this as 910 an around hook to localize the effect of actions that don’t already 911 work on just the region. In the default configuration it is used 912 for ‘repunctuate-sentences’. 913 914 ‘embark--save-excursion’ 915 Run the action restoring point at the end. The current default 916 configuration doesn’t use this but it is available for users. 917 918 919 File: embark.info, Node: Creating your own keymaps, Next: Defining actions for new categories of targets, Prev: Running hooks before after or around an action, Up: Advanced configuration 920 921 3.6 Creating your own keymaps 922 ============================= 923 924 All internal keymaps are defined with the standard helper macro 925 ‘defvar-keymap’. For example a simple version of the file action keymap 926 could be defined as follows: 927 928 (defvar-keymap embark-file-map 929 :doc "Example keymap with a few file actions" 930 :parent embark-general-map 931 "d" #'delete-file 932 "r" #'rename-file 933 "c" #'copy-file) 934 935 These action keymaps are perfectly normal Emacs keymaps. You may 936 want to inherit from the ‘embark-general-map’ if you want to access the 937 default Embark actions. Note that ‘embark-collect’ and ‘embark-export’ 938 are also made available via ‘embark-general-map’. 939 940 941 File: embark.info, Node: Defining actions for new categories of targets, Prev: Creating your own keymaps, Up: Advanced configuration 942 943 3.7 Defining actions for new categories of targets 944 ================================================== 945 946 It is easy to configure Embark to provide actions for new types of 947 targets, either in the minibuffer or outside it. I present below two 948 very detailed examples of how to do this. At several points I’ll 949 explain more than one way to proceed, typically with the easiest option 950 first. I include the alternative options since there will be similar 951 situations where the easiest option is not available. 952 953 * Menu: 954 955 * New minibuffer target example - tab-bar tabs:: 956 * New target example in regular buffers - short Wikipedia links:: 957 958 959 File: embark.info, Node: New minibuffer target example - tab-bar tabs, Next: New target example in regular buffers - short Wikipedia links, Up: Defining actions for new categories of targets 960 961 3.7.1 New minibuffer target example - tab-bar tabs 962 -------------------------------------------------- 963 964 As an example let us take a look at the tab bars 965 (https://www.gnu.org/software/emacs/manual/html_node/emacs/Tab-Bars.html). 966 I’ll explain how to configure Embark to offer tab-specific actions when 967 you use the tab-bar-mode commands that mention tabs by name. The 968 configuration explained here is now built-in to Embark (and Marginalia), 969 but it’s still a good self-contained example. In order to setup up tab 970 actions you would need to: (1) make sure Embark knows those commands 971 deal with tabs, (2) define a keymap for tab actions and configure Embark 972 so it knows that’s the keymap you want. 973 974 1. Telling Embark about commands that prompt for tabs by name 975 976 For step (1), it would be great if the ‘tab-bar-mode’ commands 977 reported the completion category ‘tab’ when asking you for a tab 978 with completion. (All built-in Emacs commands that prompt for file 979 names, for example, do have metadata indicating that they want a 980 ‘file’.) They do not, unfortunately, and I will describe a couple 981 of ways to deal with this. 982 983 Maybe the easiest thing is to configure Marginalia 984 (https://github.com/minad/marginalia) to enhance those commands. 985 All of the ‘tab-bar-*-tab-by-name’ commands have the words “tab by 986 name” in the minibuffer prompt, so you can use: 987 988 (add-to-list 'marginalia-prompt-categories '("tab by name" . tab)) 989 990 That’s it! But in case you are ever in a situation where you don’t 991 already have commands that prompt for the targets you want, I’ll 992 describe how writing your own command with appropriate ‘category’ 993 metadata looks: 994 995 (defun my-select-tab-by-name (tab) 996 (interactive 997 (list 998 (let ((tab-list (or (mapcar (lambda (tab) (cdr (assq 'name tab))) 999 (tab-bar-tabs)) 1000 (user-error "No tabs found")))) 1001 (completing-read 1002 "Tabs: " 1003 (lambda (string predicate action) 1004 (if (eq action 'metadata) 1005 '(metadata (category . tab)) 1006 (complete-with-action 1007 action tab-list string predicate))))))) 1008 (tab-bar-select-tab-by-name tab)) 1009 1010 As you can see, the built-in support for setting the category 1011 meta-datum is not very easy to use or pretty to look at. To help 1012 with this I recommend the ‘consult--read’ function from the 1013 excellent Consult (https://github.com/minad/consult/) package. 1014 With that function we can rewrite the command as follows: 1015 1016 (defun my-select-tab-by-name (tab) 1017 (interactive 1018 (list 1019 (let ((tab-list (or (mapcar (lambda (tab) (cdr (assq 'name tab))) 1020 (tab-bar-tabs)) 1021 (user-error "No tabs found")))) 1022 (consult--read tab-list 1023 :prompt "Tabs: " 1024 :category 'tab)))) 1025 (tab-bar-select-tab-by-name tab)) 1026 1027 Much nicer! No matter how you define the ‘my-select-tab-by-name’ 1028 command, the first approach with Marginalia and prompt detection 1029 has the following advantages: you get the ‘tab’ category for all 1030 the ‘tab-bar-*-bar-by-name’ commands at once, also, you enhance 1031 built-in commands, instead of defining new ones. 1032 1033 2. Defining and configuring a keymap for tab actions 1034 1035 Let’s say we want to offer select, rename and close actions for 1036 tabs (in addition to Embark general actions, such as saving the tab 1037 name to the kill-ring, which you get for free). Then this will do: 1038 1039 (defvar-keymap embark-tab-actions 1040 :doc "Keymap for actions for tab-bar tabs (when mentioned by name)." 1041 :parent embark-general-map 1042 "s" #'tab-bar-select-tab-by-name 1043 "r" #'tab-bar-rename-tab-by-name 1044 "k" #'tab-bar-close-tab-by-name) 1045 1046 (add-to-list 'embark-keymap-alist '(tab . embark-tab-actions)) 1047 1048 What if after using this for a while you feel closing the tab 1049 without confirmation is dangerous? You have a couple of options: 1050 1051 1. You can keep using the ‘tab-bar-close-tab-by-name’ command, 1052 but have Embark ask you for confirmation: 1053 (push #'embark--confirm 1054 (alist-get 'tab-bar-close-tab-by-name 1055 embark-pre-action-hooks)) 1056 1057 2. You can write your own command that prompts for confirmation 1058 and use that instead of ‘tab-bar-close-tab-by-name’ in the 1059 above keymap: 1060 (defun my-confirm-close-tab-by-name (tab) 1061 (interactive "sTab to close: ") 1062 (when (y-or-n-p (format "Close tab '%s'? " tab)) 1063 (tab-bar-close-tab-by-name tab))) 1064 1065 Notice that this is a command you can also use directly from 1066 ‘M-x’ independently of Embark. Using it from ‘M-x’ leaves 1067 something to be desired, though, since you don’t get 1068 completion for the tab names. You can fix this if you wish as 1069 described in the previous section. 1070 1071 1072 File: embark.info, Node: New target example in regular buffers - short Wikipedia links, Prev: New minibuffer target example - tab-bar tabs, Up: Defining actions for new categories of targets 1073 1074 3.7.2 New target example in regular buffers - short Wikipedia links 1075 ------------------------------------------------------------------- 1076 1077 Say you want to teach Embark to treat text of the form 1078 ‘wikipedia:Garry_Kasparov’ in any regular buffer as a link to Wikipedia, 1079 with actions to open the Wikipedia page in eww or an external browser or 1080 to save the URL of the page in the kill-ring. We can take advantage of 1081 the actions that Embark has preconfigured for URLs, so all we need to do 1082 is teach Embark that ‘wikipedia:Garry_Kasparov’ stands for the URL 1083 ‘https://en.wikipedia.org/wiki/Garry_Kasparov’. 1084 1085 You can be as fancy as you want with the recognized syntax. Here, to 1086 keep the example simple, I’ll assume the link matches the regexp 1087 ‘wikipedia:[[:alnum:]_]+’. We will write a function that looks for a 1088 match surrounding point, and returns a dotted list of the form ‘'(url 1089 URL-OF-THE-PAGE START . END)’ where ‘START’ and ‘END’ are the buffer 1090 positions bounding the target, and are used by Embark to highlight it if 1091 you have ‘embark-highlight-indicator’ included in the list 1092 ‘embark-indicators’. (There are a couple of other options for the 1093 return value of a target finder: the bounding positions are optional and 1094 a single target finder is allowed to return multiple targets; see the 1095 documentation for ‘embark-target-finders’ for details.) 1096 1097 (defun my-short-wikipedia-link () 1098 "Target a link at point of the form wikipedia:Page_Name." 1099 (save-excursion 1100 (let* ((start (progn (skip-chars-backward "[:alnum:]_:") (point))) 1101 (end (progn (skip-chars-forward "[:alnum:]_:") (point))) 1102 (str (buffer-substring-no-properties start end))) 1103 (save-match-data 1104 (when (string-match "wikipedia:\\([[:alnum:]_]+\\)" str) 1105 `(url 1106 ,(format "https://en.wikipedia.org/wiki/%s" 1107 (match-string 1 str)) 1108 ,start . ,end)))))) 1109 1110 (add-to-list 'embark-target-finders 'my-short-wikipedia-link) 1111 1112 1113 File: embark.info, Node: How does Embark call the actions?, Next: Embark Marginalia and Consult, Prev: Advanced configuration, Up: Top 1114 1115 4 How does Embark call the actions? 1116 *********************************** 1117 1118 Embark actions are normal Emacs commands, that is, functions with an 1119 interactive specification. In order to execute an action, Embark calls 1120 the command with ‘call-interactively’, so the command reads user input 1121 exactly as if run directly by the user. For example the command may 1122 open a minibuffer and read a string (‘read-from-minibuffer’) or open a 1123 completion interface (‘completing-read’). If this happens, Embark takes 1124 the target string and inserts it automatically into the minibuffer, 1125 simulating user input this way. After inserting the string, Embark 1126 exits the minibuffer, submitting the input. (The immediate minibuffer 1127 exit can be disabled for specific actions in order to allow editing the 1128 input; this is done by adding the ‘embark--allow-edit’ function to the 1129 appropriate entry of ‘embark-target-injection-hooks’). Embark inserts 1130 the target string at the first minibuffer opened by the action command, 1131 and if the command happens to prompt the user for input more than once, 1132 the user still interacts with the second and further prompts in the 1133 normal fashion. Note that if a command does not prompt the user for 1134 input in the minibuffer, Embark still allows you to use it as an action, 1135 but of course, never inserts the target anywhere. (There are plenty of 1136 examples in the default configuration of commands that do not prompt the 1137 user bound to keys in the action maps, most of the region actions, for 1138 instance.) 1139 1140 This is how Embark manages to reuse normal commands as actions. The 1141 mechanism allows you to use as Embark actions commands that were not 1142 written with Embark in mind (and indeed almost all actions that are 1143 bound by default in Embark’s action keymaps are standard Emacs 1144 commands). It also allows you to write new custom actions in such a way 1145 that they are useful even without Embark. 1146 1147 Emacs has a variable ‘y-or-n-p-use-read-key’, which when set to ‘t’ 1148 causes ‘y-or-n-p’ to use ‘read-key’ instead of ‘read-from-minibuffer’. 1149 Setting ‘y-or-n-p-use-read-key’ to ‘t’ is recommended for Embark users 1150 because it keeps Embark from attempting to insert the target at a 1151 ‘y-or-n-p’ prompt, which would almost never be sensible. Also consider 1152 this as a warning to structure your own action commands so that if they 1153 use ‘y-or-n-p’, they do so only after the prompting for the target. 1154 1155 Here is a simple example illustrating the various ways of reading 1156 input from the user mentioned above. Bind the following commands to the 1157 ‘embark-symbol-map’ to be used as actions, then put the point on some 1158 symbol and run them with ‘embark-act’: 1159 1160 (defun example-action-command1 () 1161 (interactive) 1162 (message "The input was `%s'." (read-from-minibuffer "Input: "))) 1163 1164 (defun example-action-command2 (arg input1 input2) 1165 (interactive "P\nsInput 1: \nsInput 2: ") 1166 (message "The first input %swas `%s', and the second was `%s'." 1167 (if arg "truly " "") 1168 input1 1169 input2)) 1170 1171 (defun example-action-command3 () 1172 (interactive) 1173 (message "Your selection was `%s'." 1174 (completing-read "Select: " '("E" "M" "B" "A" "R" "K")))) 1175 1176 (defun example-action-command4 () 1177 (interactive) 1178 (message "I don't prompt you for input and thus ignore the target!")) 1179 1180 (keymap-set embark-symbol-map "X 1" #'example-action-command1) 1181 (keymap-set embark-symbol-map "X 2" #'example-action-command2) 1182 (keymap-set embark-symbol-map "X 3" #'example-action-command3) 1183 (keymap-set embark-symbol-map "X 4" #'example-action-command4) 1184 1185 Also note that if you are using the key bindings to call actions, you 1186 can pass prefix arguments to actions in the normal way. For example, 1187 you can use ‘C-u X2’ with the above demonstration actions to make the 1188 message printed by ‘example-action-command2’ more emphatic. This 1189 ability to pass prefix arguments to actions is useful for some actions 1190 in the default configuration, such as ‘embark-shell-command-on-buffer’. 1191 1192 * Menu: 1193 1194 * Non-interactive functions as actions:: 1195 1196 1197 File: embark.info, Node: Non-interactive functions as actions, Up: How does Embark call the actions? 1198 1199 4.1 Non-interactive functions as actions 1200 ======================================== 1201 1202 Alternatively, Embark does support one other type of action: a 1203 non-interactive function of a single argument. The target is passed as 1204 argument to the function. For example: 1205 1206 (defun example-action-function (target) 1207 (message "The target was `%s'." target)) 1208 1209 (keymap-set embark-symbol-map "X 4" #'example-action-function) 1210 1211 Note that normally binding non-interactive functions in a keymap is 1212 useless, since when attempting to run them using the key binding you get 1213 an error message similar to “Wrong type argument: commandp, 1214 example-action-function”. In general it is more flexible to write any 1215 new Embark actions as commands, that is, as interactive functions, 1216 because that way you can also run them directly, without Embark. But 1217 there are a couple of reasons to use non-interactive functions as 1218 actions: 1219 1220 1. You may already have the function lying around, and it is 1221 convenient to simply reuse it. 1222 1223 2. For command actions the targets can only be simple string, with no 1224 text properties. For certain advanced uses you may want the action 1225 to receive a string _with_ some text properties, or even a 1226 non-string target. 1227 1228 1229 File: embark.info, Node: Embark Marginalia and Consult, Next: Related Packages, Prev: How does Embark call the actions?, Up: Top 1230 1231 5 Embark, Marginalia and Consult 1232 ******************************** 1233 1234 Embark cooperates well with the Marginalia 1235 (https://github.com/minad/marginalia) and Consult 1236 (https://github.com/minad/consult) packages. Neither of those packages 1237 is a dependency of Embark, but both are highly recommended companions to 1238 Embark, for opposite reasons: Marginalia greatly enhances Embark’s 1239 usefulness, while Embark can help enhance Consult. 1240 1241 In the remainder of this section I’ll explain what exactly Marginalia 1242 does for Embark, and what Embark can do for Consult. 1243 1244 * Menu: 1245 1246 * Marginalia:: 1247 * Consult:: 1248 1249 1250 File: embark.info, Node: Marginalia, Next: Consult, Up: Embark Marginalia and Consult 1251 1252 5.1 Marginalia 1253 ============== 1254 1255 Embark comes with actions for symbols (commands, functions, variables 1256 with actions such as finding the definition, looking up the 1257 documentation, evaluating, etc.) in the ‘embark-symbol-map’ keymap, and 1258 for packages (actions like install, delete, browse url, etc.) in the 1259 ‘embark-package-keymap’. 1260 1261 Unfortunately Embark does not automatically offers you these keymaps 1262 when relevant, because many built-in Emacs commands don’t report 1263 accurate category metadata. For example, a command like 1264 ‘describe-package’, which reads a package name from the minibuffer, does 1265 not have metadata indicating this fact. 1266 1267 In an earlier Embark version, there were functions to supply this 1268 missing metadata, but they have been moved to Marginalia, which augments 1269 many Emacs command to report accurate category metadata. Simply 1270 activating ‘marginalia-mode’ allows Embark to offer you the package and 1271 symbol actions when appropriate again. Candidate annotations in the 1272 Embark collect buffer are also provided by the Marginalia package: 1273 1274 • If you install Marginalia and activate ‘marginalia-mode’, Embark 1275 Collect buffers will use the Marginalia annotations automatically. 1276 1277 • If you don’t install Marginalia, you will see only the annotations 1278 that come with Emacs (such as key bindings in ‘M-x’, or the unicode 1279 characters in ‘C-x 8 RET’). 1280 1281 1282 File: embark.info, Node: Consult, Prev: Marginalia, Up: Embark Marginalia and Consult 1283 1284 5.2 Consult 1285 =========== 1286 1287 The excellent Consult package provides many commands that use minibuffer 1288 completion, via the ‘completing-read’ function; plenty of its commands 1289 can be considered enhanced versions of built-in Emacs commands, and some 1290 are completely new functionality. One common enhancement provided in 1291 all commands for which it makes sense is preview functionality, for 1292 example ‘consult-buffer’ will show you a quick preview of a buffer 1293 before you actually switch to it. 1294 1295 If you use both Consult and Embark you should install the 1296 ‘embark-consult’ package which provides integration between the two. It 1297 provides exporters for several Consult commands and also tweaks the 1298 behavior of many Consult commands when used as actions with ‘embark-act’ 1299 in subtle ways that you may not even notice, but make for a smoother 1300 experience. You need only install it to get these benefits: Embark will 1301 automatically load it after Consult if found. 1302 1303 The ‘embark-consult’ package provides the following exporters: 1304 1305 • You can use ‘embark-export’ from ‘consult-line’, ‘consult-outline’, 1306 or ‘consult-mark’ to obtain an ‘occur-mode’ buffer. As with the 1307 built-in ‘occur’ command you use that buffer to jump to a match and 1308 after that, you can then use ‘next-error’ and ‘previous-error’ to 1309 navigate to other matches. You can also press ‘e’ to activate 1310 ‘occur-edit-mode’ and edit the matches in place! 1311 1312 • You can export from any of the Consult asynchronous search 1313 commands, ‘consult-grep’, ‘consult-git-grep’, or ‘consult-ripgrep’ 1314 to get a ‘grep-mode’ buffer. Here too you can use ‘next-error’ and 1315 ‘previous-error’ to navigate among matches, and, if you install the 1316 wgrep 1317 (http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el) 1318 package, you can use it to edit the matches in place. 1319 1320 In both cases, pressing ‘g’ will rerun the Consult command you had 1321 exported from and re-enter the input you had typed (which is similar to 1322 reverting but a little more flexible). You can then proceed to 1323 re-export if that’s what you want, but you can also edit the input 1324 changing the search terms or simply cancel if you see you are done with 1325 that search. 1326 1327 The ‘embark-consult’ also contains some candidates collectors that 1328 allow you to run ‘embark-live’ to get a live-updating table of contents 1329 for your buffer: 1330 1331 • ‘embark-consult-outline-candidates’ produces the outline headings 1332 of the current buffer, using ‘consult-outline’. 1333 • ‘embark-consult-imenu-candidates’ produces the imenu items of the 1334 current buffer, using ‘consult-imenu’. 1335 • ‘embark-consult-imenu-or-outline-candidates’ is a simple 1336 combination of the two previous functions: it produces imenu items 1337 in buffers deriving from ‘prog-mode’ and otherwise outline 1338 headings. 1339 1340 The way to configure ‘embark-live’ (or ‘embark-collect’ and 1341 ‘embark-export’ for that matter) to use one of these function is to add 1342 it at the end of the ‘embark-candidate-collectors’ list. The 1343 ‘embark-consult’ package by default adds the last one, which seems to be 1344 the most sensible default. 1345 1346 Besides those exporters and candidate collectors, the 1347 ‘embark-consult’ package provides many subtle tweaks and small 1348 integrations between Embark and Consult. Some examples are: 1349 1350 • When used as actions, the asynchronous search commands will search 1351 only the files associated to the targets: if the targets _are_ 1352 files, it searches those files; for buffers it will search either 1353 the associated file if there is one, else all files in the buffer’s 1354 ‘default-directory’; for bookmarks it will search the file they 1355 point to, same for Emacs Lisp libraries. This is particularly 1356 powerful when using ‘embark-act-all’ to act on multiple files at 1357 once, for example you can use ‘consult-find’ to search among file 1358 _names_ and then ‘embark-act-all’ and ‘consult-grep’ to search 1359 within the matching files. 1360 1361 • For all other target types, those that do not have a sensible 1362 notion of associated file, a Consult search command 1363 (asynchronous or not) will search for the text of the target 1364 but leave the minibuffer open so you can interact with the 1365 Consult command. 1366 1367 • ‘consult-imenu’ will search for the target and take you directly to 1368 the location if it matches a unique imenu entry, otherwise it will 1369 leave the minibuffer open so you can navigate among the matches. 1370 1371 1372 File: embark.info, Node: Related Packages, Next: Resources, Prev: Embark Marginalia and Consult, Up: Top 1373 1374 6 Related Packages 1375 ****************** 1376 1377 There are several packages that offer functionality similar to Embark’s. 1378 1379 Acting on minibuffer completion candidates 1380 The popular Ivy and Helm packages have support for acting on the 1381 completion candidates of commands written using their APIs, and 1382 there is an extensive ecosystem of packages meant for Helm and for 1383 Ivy (the Ivy ones usually have “counsel” in the name) providing 1384 commands and appropriate actions. 1385 Acting on things at point 1386 The built-in ‘context-menu-mode’ provides a mouse-driven 1387 context-sensitive configurable menu. The ‘do-at-point’ package by 1388 Philip Kaludercic (available on GNU ELPA), on the other hand is 1389 keyboard-driven. 1390 Collecting completion candidates into a buffer 1391 The Ivy package has the command ‘ivy-occur’ which is similar to 1392 ‘embark-collect’. As with Ivy actions, ‘ivy-occur’ only works for 1393 commands written using the Ivy API. 1394 1395 1396 File: embark.info, Node: Resources, Next: Contributions, Prev: Related Packages, Up: Top 1397 1398 7 Resources 1399 *********** 1400 1401 If you want to learn more about how others have used Embark here are 1402 some links to read: 1403 1404 • Fifteen ways to use Embark 1405 (https://karthinks.com/software/fifteen-ways-to-use-embark/), a 1406 blog post by Karthik Chikmagalur. 1407 • Protesilaos Stavrou’s dotemacs (https://protesilaos.com/dotemacs/), 1408 look for the section called “Extended minibuffer actions and more 1409 (embark.el and prot-embark.el)” 1410 1411 And some videos to watch: 1412 1413 • Embark and my extras 1414 (https://protesilaos.com/codelog/2021-01-09-emacs-embark-extras/) 1415 by Protesilaos Stavrou. 1416 • Embark – Key features and tweaks (https://youtu.be/qpoQiiinCtY) by 1417 Raoul Comninos on the Emacs-Elements YouTube channel. 1418 • Livestreamed: Adding an Embark context action to send a stream 1419 message (https://youtu.be/WsxXr1ncukY) by Sacha Chua. 1420 • System Crafters Live! - The Many Uses of Embark 1421 (https://youtu.be/qk2Is_sC8Lk) by David Wilson. 1422 • Marginalia, Consult and Embark by Mike Zamansky. 1423 1424 1425 File: embark.info, Node: Contributions, Next: Acknowledgments, Prev: Resources, Up: Top 1426 1427 8 Contributions 1428 *************** 1429 1430 Contributions to Embark are very welcome. There is a wish list 1431 (https://github.com/oantolin/embark/issues/95) for actions, target 1432 finders, candidate collectors and exporters. For other ideas you have 1433 for Embark, feel free to open an issue on the issue tracker 1434 (https://github.com/oantolin/embark/issues). Any neat configuration 1435 tricks you find might be a good fit for the wiki 1436 (https://github.com/oantolin/embark/wiki). 1437 1438 Code contributions are very welcome too, but since Embark is now on 1439 GNU ELPA, copyright assignment to the FSF is required before you can 1440 contribute code. 1441 1442 1443 File: embark.info, Node: Acknowledgments, Prev: Contributions, Up: Top 1444 1445 9 Acknowledgments 1446 ***************** 1447 1448 While I, Omar Antolín Camarena, have written most of the Embark code and 1449 remain very stubborn about some of the design decisions, Embark has 1450 received substantial help from a number of other people which this 1451 document has neglected to mention for far too long. In particular, 1452 Daniel Mendler has been absolutely invaluable, implementing several 1453 important features, and providing a lot of useful advice. 1454 1455 Code contributions: 1456 1457 • Daniel Mendler (https://github.com/minad) 1458 • Clemens Radermacher (https://github.com/clemera/) 1459 • José Antonio Ortega Ruiz (https://codeberg.org/jao/) 1460 • Itai Y. Efrat (https://github.com/iyefrat) 1461 • a13 (https://github.com/a13) 1462 • jakanakaevangeli (https://github.com/jakanakaevangeli) 1463 • mihakam (https://github.com/mihakam) 1464 • Brian Leung (https://github.com/leungbk) 1465 • Karthik Chikmagalur (https://github.com/karthink) 1466 • Roshan Shariff (https://github.com/roshanshariff) 1467 • condy0919 (https://github.com/condy0919) 1468 • Damien Cassou (https://github.com/DamienCassou) 1469 • JimDBh (https://github.com/JimDBh) 1470 1471 Advice and useful discussions: 1472 1473 • Daniel Mendler (https://github.com/minad) 1474 • Protesilaos Stavrou (https://gitlab.com/protesilaos/) 1475 • Clemens Radermacher (https://github.com/clemera/) 1476 • Howard Melman (https://github.com/hmelman/) 1477 • Augusto Stoffel (https://github.com/astoff) 1478 • Bruce d’Arcus (https://github.com/bdarcus) 1479 • JD Smith (https://github.com/jdtsmith) 1480 • Karthik Chikmagalur (https://github.com/karthink) 1481 • jakanakaevangeli (https://github.com/jakanakaevangeli) 1482 • Itai Y. Efrat (https://github.com/iyefrat) 1483 • Mohsin Kaleem (https://github.com/mohkale) 1484 1485 1486 1487 Tag Table: 1488 Node: Top220 1489 Node: Overview1842 1490 Node: Acting on targets3148 1491 Node: The default action on a target8690 1492 Node: Working with sets of possible targets10597 1493 Node: Selecting some targets to make an ad hoc candidate set14873 1494 Node: embark-live a live-updating variant of embark-collect18326 1495 Node: Switching to a different command without losing what you've typed20021 1496 Node: Quick start22595 1497 Node: Advanced configuration27511 1498 Node: Showing information about available targets and actions28093 1499 Node: Selecting commands via completions instead of key bindings30912 1500 Node: Selecting commands via completion outside of Embark33997 1501 Node: Quitting the minibuffer after an action35529 1502 Node: Running some setup after injecting the target37982 1503 Node: Running hooks before after or around an action41597 1504 Node: Creating your own keymaps46473 1505 Node: Defining actions for new categories of targets47377 1506 Node: New minibuffer target example - tab-bar tabs48146 1507 Ref: Telling Embark about commands that prompt for tabs by name49047 1508 Ref: Defining and configuring a keymap for tab actions51910 1509 Node: New target example in regular buffers - short Wikipedia links53701 1510 Node: How does Embark call the actions?55961 1511 Node: Non-interactive functions as actions60273 1512 Node: Embark Marginalia and Consult61627 1513 Node: Marginalia62355 1514 Node: Consult63859 1515 Node: Related Packages68618 1516 Node: Resources69712 1517 Node: Contributions70843 1518 Node: Acknowledgments71553 1519 1520 End Tag Table 1521 1522 1523 Local Variables: 1524 coding: utf-8 1525 End: