To Learn About
- ☒ Company-mode (completion framework for lots of stuff)
- ☒ YASnippets (templates)
- ☒ Auto-YASnippets (something like that—I installed it for temporary templates)
- ☒ Alchemist mode (integrates with company mode—tooling for Elixir)
- ☐ What do
M-.andM-,do? - ☐
font-lock-add-keywordswould let me add new keywords to a language - ☐ hi-lock
- ☐ highlight-phrase, unhighlight-regex
- ☒ Registers
- ☐ Auto-loading packages to make startup time shorter
Things that make me happy
- Undo in region (just highlight something and hit undo)
- Generate Backus-Nauer Forms with a slightly modified syntax with
ebnf-eps-buffer
Helm
You can filter buffers by pattern with Helm. Type: @pattern to find buffers matching pattern. If you want to have spaces in the pattern, you must escape them with a backslash.
Searching with the Silver Searcher
You’ll need helm-ag. After searching, you get the following keybindings:
Key Bindings
| Key | Action |
|---|---|
C-c o | Open other window |
C-l | Search in parent directory |
C-c C-e | Switch to edit mode |
C-x C-s | Save ag results to buffer(Ask save buffer name if prefix key is specified) |
C-c C-f | Enable helm-follow-mode |
C-c >, right | Move to next file |
C-c <, left | Move to previous file |
C-c ? | Show help message |
Edit mode keymap
| Key | Action |
|---|---|
C-c C-c | Commit changes |
C-c C-k | Abort |
C-c C-d | Mark delete line |
C-c C-u | Unmark |
Saved buffer keymap
| Key | Action |
|---|---|
RET | Jump to current line posion |
C-o | Jump to current line posion in other window |
g | Update result |
Registers
Any letter can be a register. (Uppercase and lowercase are distinct.) In the follinwg examples, <r> represents a register name.
Working with the point:
C-x r SPC <r>Store point in register (mnemonic: C-SPC saves current mark)C-x r j <r>Jump to point saved in register (mnemonic: jump)
Working with text:
C-x r s <r>Save region into registerC-x r i <r>Insert contents of register (also works for numbers)
Working with numbers:
C-u NUMBER C-x r n <r>Save a numberC-u NUMBER C-x r + <r>Increment register<r>byNUMBER(ifC-u NUMBERomitted, increments by 1)
Other:
C-x C-k r <r>Save last kbd macro to register
Special Modes
Racket
Start everything off right with M-x run-geiser RET racket RET.
C-c C-d TABOpen up documentation for command under point
Calc
TABrotate
Web Mode
I do a fair amount of web programming. web-mode is awesome! There are way too many keystrokes for me to list. Here are my favorite, though:
C-c C-e /Close element. (Mnemonic: C-element / (for closing HTML tags))C-c C-fFold. Collapses current tag and subtree. Same keystroke to unfold.
Markdown Mode
C-c C-]Complete markup of element. (e.g. sticks “###” at the end of a line on a h3 elementTABWhen called on a heading, collapses/expands the heading.Shift-TABCycles global folding/visibility
Text keys: (all start with C-c C-s)
C-c C-s sMake current word/region bold (sis for strong)C-c C-s eItalics. (efor emphasis)
Bookmarks
- I installed the
bmmodule. Runbm-toggleto book mark a line visually.
Native bookmarks:
C-x r mNew bookmark. Prompts for a name. Mnemonic: “mark”C-x r bJump to a bookmark. Mnemonic: “bookmark”, or “back to bookmark”C-x r lList bookmarks.
Jumping to a bookmark will do so in the current window, and will put you where the point last was in that buffer. If you are already in the buffer, then it will jump to the point where to bookmark was set.
Bookmarks persist over a session—I’m not sure where the file is, but they do get stored in some file.
Expansion
M-/ will do “dynamic expansion”—if there is a word in one of the buffers of the current session that starts with whatever your cursor is on, it will expand to that word. Multiple consecutive invocations of this function will cycle through available expansions.
There’s a way to do manual expansion, but I don’t know it.
Window enlargements
I’ve defined a few nice functions. Here they are:
(defun sticky-enlarge-window-horizontally (prefix)
(interactive "P")
(enlarge-window-horizontally (if prefix (car prefix) 1))
(unless (current-message)
(message "(Use `[' and `]' to adjust window size)"))
(let ((map (make-sparse-keymap)))
(define-key map (kbd "]") 'enlarge-window-horizontally)
(define-key map (kbd "[") 'shrink-window-horizontally)
(set-transient-map map t)))
(defun sticky-shrink-window-horizontally (prefix)
(interactive "P")
(shrink-window-horizontally (if prefix (car prefix) 1))
(unless (current-message)
(message "(Use `[' and `]' to adjust window size)"))
(let ((map (make-sparse-keymap)))
(define-key map (kbd "]") 'enlarge-window-horizontally)
(define-key map (kbd "[") 'shrink-window-horizontally)
(set-transient-map map t)))
(define-key global-map (kbd "C-x }") 'sticky-enlarge-window-horizontally)
(define-key global-map (kbd "C-x {") 'sticky-shrink-window-horizontally)
(define-key global-map (kbd "<f7>") 'shrink-window-horizontally)
(define-key global-map (kbd "<f8>") 'balance-windows)
(define-key global-map (kbd "<f9>") 'enlarge-window-horizontally)Functions
toggle-truncate-lineswill toggle how long lines are displayedC-x C-dis essentiallyls— lists the contents of a directoryC-u M-|pipe region to a shell command and replace it with the outputYou can get sweet
sed-like behavior with something like this:perl -ne 's/^(\d+)\.(\d+)/<<1 Thes. $1:$2>>/g; print'
Macro wisdom
Put cursor where it is supposed to go, begin recording (C-x (), do thingy, isearch to next location, and then stop recording. (C-x )) This lets you see what is going to be edited next, and hit C-s C-s if you want to skip to the next match.
<f3> Is a very fancy key. Normally, it will begin recording a macro. Once you are defining a macro, hitting <f3> again will insert the current macro counter.
<f4> is its best friend. Hitting <f4> while defining a macro will end the macro. Hitting <f4> otherwise will then run the last defined keyboard macro. Running C-u <f4> runs the second macro in macro ring. Running C-u 4 <f4> runs the first macro 4 times. (Adjust 4 as you will.)
You can use Lisp inside of a macro. For example, to insert incrementing numbers, do:
M-: (setq x 1) RET
C-(
C-u M-: x RET
M-: (setq x (+ x 1))
<whatever else>
C-)You can repeat a macro until an error is signaled with C-u 0 C-x e.
You can also run apply-macro-to-region-lines (C-x C-k r) to fire a macro on every line in the region.
To prompt a user for input while writing a macro, do: C-u C-x q. This is a variant of C-x q which queries the user.
Recursive editing
Hitting C-r will enter a recursive editing level when the macro is run, but not while you are recording.
C-x q enters a query state: y continues to execute the macro, n aborts the current iteration, and q aborts all together.
C-u C-x q lets you enter in some text.
To finish recursive editing, type C-M-c. To abort and halt execution, type C-].
Rectangles
To select text in a rectangle, use C-x SPC. The region will then highlight like a rectangle. The kill and yank commands will work like normal (i.e. hitting C-k will kill the rectangle.)
C-x r M-wCopy rectangle as kill. (ThinkM-w)C-x r NInserts numbered lines in the rectangle. Accepts a prefix argument to change at what number the lines start at.M-x string-insert-rectanglePrompts for a string and inserts it at the current rectangle. So you can go from this:one two three fourto this:
- one - two - three - fourby setting the mark on the
oofone, then moving to thefinfour, then running the command.
Misc. Keystrokes
C-x <right arrow>cycle through buffersC-x C-qtoggle read-only mode in current bufferC-x C-;to set comment column to cursor’s current columnC-x C-hReally<any prefix> C-hshows a listing of all possible completions after the prefix character.C-x 8 RETInsert arbitary unicode character by name. You can insert snowmen like this!C-x 8 <char>There are a bunch of characters that you can insert after this. “<” will insert “«”C-x n nOnly displays the region. Good for focusing. UseC-x n wto display everything.C-x $To hide lines in the current buffer, type ‘C-x $’ (‘set-selective-display’) with a numeric argument N. Then lines with at least N columns of indentation disappear from the screen.C-uPrefix argument. The default is 4. If you want to grow the current window by, say, 15 lines, do following:C-u 15 C-x ^.C-u <number> <key>Repeats<key><number>times. It’s different for inserting digits. If you wanted to insert5seven times, typeC-u 7 C-u 5.C-x C-k C-iInserts the current value of the keyboard macro counter and increments it. WhenC-uproceeds the command, the previous value is inserted, and the counter is not updated. A prefix argument specifies a different increment.C-x C-k C-cPrompts for the initial value of the keyboard macro. Must be called prior to starting macro definition to be used this way. It has another behavior if called during macro definition. See this page for help.C-x C-k nGive the last kbd macro a name, which you can then callESC-^Join this line to the previous and fix up whitespace at join. Useful ifauto-fill-modewas turned on and you need to unwrap a line.<f1>Run help<f2>Appears to be a prefix command, much likeC-x.<f10>Opens the menu. As in, the one at the top of the screen that you never have actually used. With ACTUAL GRAPHICS!!C-x RET fAllows you to set the encoding when saving the file. Useful for stripping bad line endings in DOS files.
Dired
C-oIn dired, opens the file the cursor is on in the other window.
Occur
C-u M-s o <pattern> RETCopies all strings mattching<pattern>(if you use.*thingy.*it will copy the whole line with “thingy” in it) into buffer called*Occur*### Regexes
Not like Perl. In (?:aaa|bbb), the characters (, ), and | all match themselves. If you want perl-like behavior, escape them: \(?:aaa\|bbb\).
But when you want to type that in a string literal, use "\\(?:aaa\\|bbb\\)".
Character Classes
Some common character classes:
.works as expected (any char)[[:ascii:]]+any ascii character[_A-Za-z0-9]+letters, digits, underscores"\([^"]+\)"capture text between double quotes (not accounting for escaped chars)
Regex search and replace:
M-x replace-regexp
Replace regexp: right\|left
Replace regexp with: \,(if (equal "right" \&) "left" "right")Looks like the \,(...) syntax says “evaluate me”. :)
Regex search and replace with captured bit
M-x replace-regexp
Replace regexp: subject(\([A-Za-z]+\))
Replace regexp with: \1That gets subject(*), and retuns *
Programming Languages
C
Compile (using make -k) with M-x compile.
Any errors will show up in a special buffer; visit with C-x `