<!DOCTYPE HTML> <html lang="en" class="light sidebar-visible" dir="ltr"> <head> <!-- Book generated using mdBook --> <meta charset="UTF-8"> <title>emacs - Notes</title> <!-- Custom HTML head --> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="theme-color" content="#ffffff"> <link rel="icon" href="../favicon.svg"> <link rel="shortcut icon" href="../favicon.png"> <link rel="stylesheet" href="../css/variables.css"> <link rel="stylesheet" href="../css/general.css"> <link rel="stylesheet" href="../css/chrome.css"> <link rel="stylesheet" href="../css/print.css" media="print"> <!-- Fonts --> <link rel="stylesheet" href="../FontAwesome/css/font-awesome.css"> <link rel="stylesheet" href="../fonts/fonts.css"> <!-- Highlight.js Stylesheets --> <link rel="stylesheet" href="../highlight.css"> <link rel="stylesheet" href="../tomorrow-night.css"> <link rel="stylesheet" href="../ayu-highlight.css"> <!-- Custom theme stylesheets --> <!-- Provide site root to javascript --> <script> var path_to_root = "../"; var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; </script> <!-- Start loading toc.js asap --> <script src="../toc.js"></script> </head> <body> <div id="body-container"> <!-- Work around some values being stored in localStorage wrapped in quotes --> <script> try { var theme = localStorage.getItem('mdbook-theme'); var sidebar = localStorage.getItem('mdbook-sidebar'); if (theme.startsWith('"') && theme.endsWith('"')) { localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); } if (sidebar.startsWith('"') && sidebar.endsWith('"')) { localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); } } catch (e) { } </script> <!-- Set the theme before any content is loaded, prevents flash --> <script> var theme; try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } if (theme === null || theme === undefined) { theme = default_theme; } const html = document.documentElement; html.classList.remove('light') html.classList.add(theme); html.classList.add("js"); </script> <input type="checkbox" id="sidebar-toggle-anchor" class="hidden"> <!-- Hide / unhide sidebar before it is displayed --> <script> var sidebar = null; var sidebar_toggle = document.getElementById("sidebar-toggle-anchor"); if (document.body.clientWidth >= 1080) { try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } sidebar = sidebar || 'visible'; } else { sidebar = 'hidden'; } sidebar_toggle.checked = sidebar === 'visible'; html.classList.remove('sidebar-visible'); html.classList.add("sidebar-" + sidebar); </script> <nav id="sidebar" class="sidebar" aria-label="Table of contents"> <!-- populated by js --> <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox> <noscript> <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe> </noscript> <div id="sidebar-resize-handle" class="sidebar-resize-handle"> <div class="sidebar-resize-indicator"></div> </div> </nav> <div id="page-wrapper" class="page-wrapper"> <div class="page"> <div id="menu-bar-hover-placeholder"></div> <div id="menu-bar" class="menu-bar sticky"> <div class="left-buttons"> <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> <i class="fa fa-bars"></i> </label> <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> <i class="fa fa-paint-brush"></i> </button> <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> </ul> <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> <i class="fa fa-search"></i> </button> </div> <h1 class="menu-title">Notes</h1> <div class="right-buttons"> <a href="../print.html" title="Print this book" aria-label="Print this book"> <i id="print-button" class="fa fa-print"></i> </a> <a href="https://github.com/johannst/notes" title="Git repository" aria-label="Git repository"> <i id="git-repository-button" class="fa fa-github"></i> </a> </div> </div> <div id="search-wrapper" class="hidden"> <form id="searchbar-outer" class="searchbar-outer"> <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> </form> <div id="searchresults-outer" class="searchresults-outer hidden"> <div id="searchresults-header" class="searchresults-header"></div> <ul id="searchresults"> </ul> </div> </div> <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> <script> document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); }); </script> <div id="content" class="content"> <main> <h1 id="emacs1"><a class="header" href="#emacs1">emacs(1)</a></h1> <h2 id="help"><a class="header" href="#help">help</a></h2> <pre><code class="language-markdown"> C-h ? list available help modes C-h e show message output (`*Messages*` buffer) C-h f describe function C-h v describe variable C-h w describe which key invoke function (where-is) C-h c <KEY> print command bound to <KEY> C-h k <KEY> describe command bound to <KEY> C-h b list buffer local key-bindings <kseq> C-h list possible key-bindings with <kseq> eg C-x C-h -> list key-bindings beginning with C-x </code></pre> <h2 id="package-manager"><a class="header" href="#package-manager">package manager</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------------------ package-refresh-contents refresh package list package-list-packages list available/installed packages `U x` to mark packages for Upgrade & eXecute </code></pre> <h2 id="window"><a class="header" href="#window">window</a></h2> <pre><code class="language-markdown"> key fn description ---------------------------------------------- C-x 0 delete-window kill focused window C-x 1 delete-other-windows kill all other windows C-x 2 split-window-below split horizontal C-x 3 split-window-right split vertical C-x o other-window other window (cycle) </code></pre> <h2 id="minibuffer"><a class="header" href="#minibuffer">minibuffer</a></h2> <pre><code class="language-markdown"> key description ---------------------------- M-e enter edit minibuffer edit mode M-up focus previous completion M-down focus next completion M-ret select focused completion </code></pre> <h2 id="buffer"><a class="header" href="#buffer">buffer</a></h2> <pre><code class="language-markdown"> key fn description --------------------------------------------- C-x C-q read-only-mode toggle read-only mode for buffer C-x k kill-buffer kill buffer C-x s save-some-buffers save buffer C-x w write-file write buffer (save as) C-x b switch-to-buffer switch buffer C-x C-b list-buffers buffer list </code></pre> <h2 id="ibuffer"><a class="header" href="#ibuffer">ibuffer</a></h2> <p>Builtin advanced buffer selection mode</p> <pre><code class="language-markdown"> key fn description -------------------------------------- ibuffer enter buffer selection h ibuffer help o open buffer in other window C-o open buffer in other window keep focus in ibuffer s a sort by buffer name s f sort by file name s v sort by last viewed s v sort by major mode , cycle sorting mode = compare buffer against file on disk (if file is dirty `*`) /m filter by major mode /n filter by buffer name /f filter by file name // remove all filter /g create filter group /\ remove all filter groups </code></pre> <h2 id="goto-navigation"><a class="header" href="#goto-navigation">goto navigation</a></h2> <pre><code class="language-markdown"> key fn description ---------------------------------------- M-g g goto-line go to line M-g M-n next-error go to next error (grep, xref, compilation, ...) M-g M-p previous-error go to previous error M-g i imenu go to place in buffer (symbol, ...) </code></pre> <h2 id="isearch"><a class="header" href="#isearch">isearch</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------------------- C-s isearch-forward search forward from current position (C-s to go to next match) C-r isearch-backward search backwards from current position (C-r to go to next match) C-w isearch-yank-word-or-char feed next word to current search (extend) M-p isearch-ring-advance previous search input M-n isearch-ring-retreat next search input M-e isearch-edit-string edit search string again M-s o occur open search string in occur </code></pre> <h2 id="occur"><a class="header" href="#occur">occur</a></h2> <pre><code class="language-markdown"> key fn description ----------------------------------- M-s o occur get matches for regexp in buffer use during `isearch` to use current search term e enter occur edit mode (C-c C-c to quit) n move to next entry and keep focus in occur buffer p move to previous entry and keep focus in occur buffer C-n goto next line C-p goto previous line o open match in other window C-o open match in other window keep focus in ibuffer </code></pre> <pre><code class="language-markdown"> key fn description --------------------------------------------------------- multi-occur-in-matching-buffers run occur in buffers matching regexp </code></pre> <h2 id="grep"><a class="header" href="#grep">grep</a></h2> <pre><code class="language-markdown"> key fn description ----------------------------------- rgrep recursive grep find-grep run find-grep result in *grep* buffer n/p navigate next/previous match in *grep* buffer q quit *grep* buffer </code></pre> <h2 id="yankpaste"><a class="header" href="#yankpaste">yank/paste</a></h2> <pre><code class="language-markdown"> key fn description --------------------------------------------- C-<SPACE> set-mark-command set start mark to select text M-w kill-ring-save copy selected text C-w kill-region kill selected text C-y yank paste selected text M-y yank-pop cycle through kill-ring (only after paste) </code></pre> <h2 id="register"><a class="header" href="#register">register</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------------------ C-x r s <reg> copy-to-register save region in register <reg> C-x r i <reg> insert-register insert content of register <reg> </code></pre> <h2 id="bookmarks"><a class="header" href="#bookmarks">bookmarks</a></h2> <pre><code> key fn description ------------------------------------------- C-x r m bookmark-set set a bookmark C-x r b bookmark-jump jump to a bookmark C-x r l bookmark-bmenu-list list all bookmarks </code></pre> <h2 id="blockrect"><a class="header" href="#blockrect">block/rect</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------------------ C-x <SPC> rectangle-mark-mode activate rectangle-mark-mode string-rectangle insert text in marked rect </code></pre> <h2 id="mass-edit"><a class="header" href="#mass-edit">mass edit</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------------------ C-x h mark-whole-buffer mark whole buffer delete-matching-line delete lines matching regex replace-string replace unconditional M-% query-replace search & replace C-M-% query-replace-regexp search & replace regex </code></pre> <h2 id="narrow"><a class="header" href="#narrow">narrow</a></h2> <pre><code class="language-markdown"> key fn description --------------------------------------------- C-x n n narrow-to-region show only focused region (narrow) C-x n w widen show whole buffer (wide) </code></pre> <h2 id="org"><a class="header" href="#org">org</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------------ M-up/M-down re-arrange items in same hierarchy M-left/M-right change item hierarchy C-RET create new item below current C-S-RET create new TODO item below current S-left/S-right cycle TODO states </code></pre> <h3 id="org-source"><a class="header" href="#org-source">org source</a></h3> <pre><code class="language-markdown"> key fn description ------------------------------ <s TAB generate a source block C-c ' edit source block (in lang specific buffer) C-c C-c eval source block </code></pre> <h2 id="project"><a class="header" href="#project">project</a></h2> <pre><code class="language-markdown"> key fn description ---------------------------------------------------------- C-x p p project-switch-project switch project C-x p f project-find-file find file in project C-x p r project-query-replace-regexp query replace on project C-x p x project-execute-extended-command exec command on project C-x p ! project-shell-command shell command on project C-x p & project-async-shell-command async shell command on project </code></pre> <h2 id="company"><a class="header" href="#company">company</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------- C-s search through completion candidates C-o filter completion candidates based on search term <f1> get doc for completion condidate M-<digit> select completion candidate </code></pre> <h2 id="tags"><a class="header" href="#tags">tags</a></h2> <p>To generate <code>etags</code> using <code>ctags</code></p> <pre><code class="language-markdown"> ctags -R -e . generate emacs tag file (important `-e`) </code></pre> <p>Navigate using tags</p> <pre><code class="language-markdown"> key fn description ----------------------------------------------- M-. xref-find-definitions find definition of tag (C-u prefix to enter symbol manually) xref-find-apropos find symbols matching regexp M-? xref-find-references find references of tag </code></pre> <h2 id="lisp"><a class="header" href="#lisp">lisp</a></h2> <pre><code class="language-markdown"> key fn description ------------------------------ ielm open interactive elips shell </code></pre> <p>In <code>lisp-interaction-mode</code> (<code>*scratch*</code> buffer by defult)</p> <pre><code class="language-markdown"> key fn description ----------------------------------------------------------- C-j eval-print-last-sexp evaluate & print preceeding lisp expr C-x C-e eval-last-sexp evaluate lisp expr C-u C-x C-e eval-last-sexp evaluate & print C-c C-e elisp-eval-region-or-buffer eval buffer or region (elisp mode) </code></pre> <h2 id="ido"><a class="header" href="#ido">ido</a></h2> <p>Builtin fuzzy completion mode (eg buffer select, dired, ...).</p> <pre><code class="language-markdown"> key fn description ------------------------------------------ ido-mode toggle ido mode <Left>/<Right> cycle through available competions <RET> select completion </code></pre> <p>There is also <code>fido</code>, which is the successor of <code>ido</code>, which also supports <code>fido-vertical-mode</code> in case vertical mode is preferred.</p> <h2 id="evil"><a class="header" href="#evil">evil</a></h2> <pre><code class="language-markdown"> key fn description -------------------------- C-z toggle emacs/evil mode C-^ toggle between previous and current buffer C-p after paste cycle kill-ring back C-n after paste cycle kill-ring forward </code></pre> <h2 id="dired"><a class="header" href="#dired">dired</a></h2> <pre><code class="language-markdown"> key fn description -------------------------- i open sub-dir in same buffer + create new directory C copy file/dir R move file/dir (rename) S absolute symbolic link Y relative symbolic link d mark for deletion m mark file/dir u un-mark file/dir U un-mark all x execute marked actions q quit </code></pre> <h2 id="info"><a class="header" href="#info">info</a></h2> <pre><code class="language-markdown"> key fn description --------------------------------------- n Info-next next page p Info-prev previous page l Info-history-back history go back r Info-history-forward history go forward ^ Info-Up up in info node tree m Info-menu goto menu (by minibuf completion) s Info-search search info g Info-goto-node goto info node (by minibuf completion) Info-history open info history in buffer </code></pre> <h2 id="shell-commands"><a class="header" href="#shell-commands">shell commands</a></h2> <pre><code class="language-markdown"> key fn description --------------------------------------------- M-! shell-command run shell command synchronously M-& async-shell-command run shell command asynchronously M-| shell-command-on-region run shell command on region; prefix with C-u to replace region with output of the command </code></pre> </main> <nav class="nav-wrapper" aria-label="Page navigation"> <!-- Mobile navigation buttons --> <a rel="prev" href="../tools/screen.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> <i class="fa fa-angle-left"></i> </a> <a rel="next prefetch" href="../tools/gpg.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> <i class="fa fa-angle-right"></i> </a> <div style="clear: both"></div> </nav> </div> </div> <nav class="nav-wide-wrapper" aria-label="Page navigation"> <a rel="prev" href="../tools/screen.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> <i class="fa fa-angle-left"></i> </a> <a rel="next prefetch" href="../tools/gpg.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> <i class="fa fa-angle-right"></i> </a> </nav> </div> <script> window.playground_copyable = true; </script> <script src="../elasticlunr.min.js"></script> <script src="../mark.min.js"></script> <script src="../searcher.js"></script> <script src="../clipboard.min.js"></script> <script src="../highlight.js"></script> <script src="../book.js"></script> <!-- Custom JS scripts --> </div> </body> </html>