mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-11-22 21:52:31 +03:00
321 lines
12 KiB
Markdown
321 lines
12 KiB
Markdown
---
|
|
category: tool
|
|
tool: emacs
|
|
filename: emacs.txt
|
|
contributors:
|
|
- ["Joseph Riad", "https://github.com/Joseph-Riad"]
|
|
---
|
|
|
|
Emacs started its life as ["the extensible, customizable display
|
|
editor"](https://www.gnu.org/software/emacs/emacs-paper.html) and grew
|
|
over the years into a full-blown ecosystem. Many tasks, usually
|
|
relegated to a diverse set of tools can be accomplished from within
|
|
Emacs in a consistent, familiar interface. Examples include directory
|
|
management, viewing PDF documents, editing files over SSH, managing git
|
|
repos,… (the list is quite long). In short, Emacs is yours to make of it
|
|
what you will: the spectrum of users varies from those who use it to
|
|
edit text files to extreme purists who use it to virtually replace their
|
|
operating system.
|
|
|
|
Emacs is extensible via a specialized dialect of Lisp known as Emacs
|
|
Lisp (Elisp) which has a lot of macros geared towards editing text and
|
|
managing text buffers. Any key (combination) you use in Emacs is bound
|
|
to an Emacs Lisp function and may be remapped to any other function,
|
|
including ones you write
|
|
yourself.
|
|
|
|
# Key Notation
|
|
|
|
```text
|
|
The Emacs manual and the community in general uses a convention to refer to different key combinations used within Emacs. Specifically, Emacs has the notion of a "modifier key" that is pressed along with another key to modify its action.
|
|
|
|
An example of this notation is "C-c". In this key combination "C" is the modifier and stands for the "Ctrl" key and "c" is the key whose action is being modified (the literal character "c").
|
|
|
|
The modifier shorthand:
|
|
"C-" --> The "CTRL" key
|
|
"M-" --> The "Meta" key (usually, the "Alt" key)
|
|
"s-" --> The "Super" key (the "Cmd" key on Macs and the "Windows" key on PCs)
|
|
|
|
There are other, less commonly used modifiers that I will not get into here.
|
|
|
|
The key combination "C-x C-s" means you press "Ctrl+x" followed by "Ctrl+s"
|
|
|
|
In addition to the above modifiers, the special keys "Esc", "Return (Enter)" and "Shift" are denoted by "ESC", "RET" and "S", respectively.
|
|
```
|
|
|
|
# Basic Emacs Concepts
|
|
|
|
Here, I discuss some basic Emacs concepts and terminology that may be
|
|
confusing to newcomers (especially to people used to Vim terminology)
|
|
|
|
- A bunch of text that Emacs is editing is known as a **buffer**
|
|
- A buffer does not necessarily correspond to an actual file on disk.
|
|
It may be just a bunch of text in memory.
|
|
- When a buffer corresponds to a file on disk, we say that the buffer
|
|
is **visiting** that file.
|
|
- Emacs typically has many buffers open at once.
|
|
- The display of Emacs may be split into different **windows** (not to
|
|
be confused with your operating system's windows: the operating
|
|
system window for Emacs can have multiple Emacs windows inside it).
|
|
- An operating system window for Emacs is called an Emacs **frame**.
|
|
Thus, when the Emacs manual talks about opening a new frame, this
|
|
essentially means opening a new OS *window* containing an(other)
|
|
instance of Emacs.
|
|
- The concepts conventionally known as cutting and pasting are
|
|
referred to as **killing** and **yanking**, respectively in Emacs
|
|
parlance.
|
|
- The current position of the cursor is called the **point** in Emacs.
|
|
Technically, **point** is defined as the position right before the
|
|
character where the cursor currently is.
|
|
- Finally, each buffer may have several **modes** associated with it:
|
|
a **major mode** and possibly several **minor modes**.
|
|
- The **major mode** defines the main behavior of Emacs in the
|
|
currently selected buffer. This can be roughly thought of as the
|
|
file type. For example, if you're editing a Python file, the major
|
|
mode is (by default) `python-mode` which causes Emacs to highlight
|
|
Python syntax and automatically indent and outdent your code blocks
|
|
as syntactically required by your Python code.
|
|
- **Minor modes** define subtle changes in behavior and several minor
|
|
modes may be active at once in the same buffer. An example minor
|
|
mode is `flyspell-mode` which automatically highlights spelling
|
|
errors in your
|
|
buffer.
|
|
|
|
# Navigation Basics
|
|
|
|
```text
|
|
The GUI version of Emacs can be navigated with the mouse like you would expect from a conventional GUI text editor.
|
|
|
|
The aim here is to focus on navigation solely using the keyboard as this enhances productivity immensely.
|
|
|
|
|
|
* Line movement
|
|
|
|
C-n --> Next line
|
|
C-p --> Previous line
|
|
|
|
* Character movement
|
|
|
|
C-f --> Go forward one character
|
|
C-b --> Go backward one character
|
|
|
|
* Word movement
|
|
|
|
M-f --> Go forward one word
|
|
M-b --> Go backward one word
|
|
|
|
* Sentence movement
|
|
|
|
M-a --> Move to the beginning of the sentence
|
|
M-e --> Move to the end of the sentence
|
|
|
|
* Beginning and end of line
|
|
|
|
C-a --> Move to the beginning of the line
|
|
C-e --> Move to the end of the line
|
|
|
|
* Beginning and end of buffer
|
|
|
|
M-< ("Meta+Shift+,") --> Go to the beginning of the buffer
|
|
M-> ("Meta+Shift+.") --> Go to the end of the buffer
|
|
|
|
* Screen movement
|
|
|
|
C-v --> Scroll down by one screen-full (the last two lines of the previous screen are kept as overlap for a smoother transition)
|
|
M-v --> Scroll up by one screen-full (same as above but with the first two lines)
|
|
|
|
* Centering the screen
|
|
|
|
C-l --> Move current line to the screen's center
|
|
|
|
The above key combination actually cycles through different states depending on how many times it's been pressed.
|
|
|
|
C-l --> Move current line to the screen's center
|
|
C-l C-l --> Move current line to the top of the screen
|
|
C-l C-l C-l --> Restore the position of the current line to where it was before the first C-l was pressed
|
|
|
|
If you press "C-l" a 4th time, it cycles back to centering the current line.
|
|
|
|
* Repeating movement commands
|
|
|
|
Most movement commands take a numerical prefix argument that says "repeat the following command that many times".
|
|
|
|
Example:
|
|
|
|
C-u 3 C-p --> Go up 3 lines
|
|
C-u 5 C-f --> Go forward 5 characters
|
|
|
|
One notable exception are the screen scrolling commands:
|
|
|
|
C-u 3 C-v --> Scroll downward 3 lines (maintaining the position of the cursor)
|
|
```
|
|
|
|
Bonus: many of the above navigation commands are the default navigation
|
|
commands in Bash (e.g. pressing "C-b" while entering a Bash command
|
|
takes you back one
|
|
character).
|
|
|
|
# File editing basics
|
|
|
|
```text
|
|
* Quitting Emacs [ Now you can't say you don't know how to quit Emacs :-) ]
|
|
|
|
C-x C-c --> Quit Emacs and get prompted to save any unsaved files (buffers not visiting a file will simply be discarded unless you're running in client-server mode)
|
|
|
|
* Saving a buffer
|
|
|
|
C-x C-s --> Save the current buffer. If not visiting a file, it will prompt you for a file name to use to save the buffer.
|
|
|
|
* Searching within a buffer
|
|
|
|
C-s --> Search forwards within the buffer. Search is incremental and case-insensitive by default.
|
|
Press C-s to move to the next match.
|
|
If you press "RET", point is moved to the currently highlighted word and the search ends.
|
|
C-r --> Same as C-s except it searches backward
|
|
|
|
C-_ or C-/ --> Undo the last action. Keep pressing it to move up the undo tree.
|
|
C-? or M-_ --> Redo the previous change
|
|
|
|
The "undo" and "redo" commands can take prefix numerical arguments to undo or redo that many actions:
|
|
|
|
C-u 3 C-_ --> Undo the last 3 changes.
|
|
```
|
|
|
|
# Executing Elisp Functions
|
|
|
|
```text
|
|
You can execute any currently loaded Elisp functions (including ones you have written yourself) via "M-x"
|
|
|
|
M-x RET --> Prompts you for name of function to execute (Tab completion is available).
|
|
|
|
Example:
|
|
|
|
M-x RET search-forward-regexp RET --> Prompts you for a regular expression and searches forward in the buffer for it
|
|
```
|
|
|
|
# Emacs Configuration
|
|
|
|
Emacs is configured using Elisp. On startup, it looks for a
|
|
configuration file either in `~/.emacs` or `~/.emacs.d/init.el` where
|
|
`~` refers to your home directory. If you're on Windows, consult [this
|
|
article](https://www.gnu.org/software/emacs/manual/html_node/efaq-w32/Location-of-init-file.html)
|
|
for the appropriate location of your configuration file.
|
|
|
|
# Vim inside Emacs
|
|
|
|
If you are considering the transition from Vim to Emacs and you're put
|
|
off by the non-modal nature of Emacs editing, there is an Emacs
|
|
extension known as `evil-mode` which lets you have many Vim concepts
|
|
inside Emacs. Here are some things added to Emacs by `evil-mode`:
|
|
|
|
- Modal editing: you get normal, insert, visual and block visual modes
|
|
like Vim. In addition, you get an "Emacs" mode where movement and
|
|
navigation follow the Emacs bindings.
|
|
- Same movement keys as Vim in normal mode
|
|
- Leader key combinations
|
|
- Pressing ":" in normal mode allows you to execute commands
|
|
(including system commands)
|
|
|
|
In my own experience, `evil-mode` helps make the transition seamless and
|
|
allows you to blend the arguably more intuitive and ergonomic
|
|
keybindings of Vim with the unbridled power of Emacs for a truly
|
|
superior editing experience.
|
|
|
|
# Discoverable Help
|
|
|
|
Emacs features a pretty powerful help system that allows you to discover
|
|
new functionality all the
|
|
time.
|
|
|
|
```text
|
|
Obtaining help on specific topics. Tab completion is available for function and variable names.
|
|
|
|
C-h f RET --> Prompts you for the name of an elisp function and
|
|
displays help text on it along with a clickable link
|
|
to its source code.
|
|
C-h v RET --> Same as above with variables
|
|
|
|
C-h k RET --> Allows you to enter a key combination and displays the
|
|
name of the elisp function bound to it.
|
|
|
|
Searching for help:
|
|
|
|
C-h a --> Prompts you for a string to search for a command in the
|
|
help system. Similar to the 'apropos' or 'man -k'
|
|
commands in Unix systems.
|
|
|
|
Starting a tutorial:
|
|
|
|
C-h C-t --> Starts a tutorial designed to familiarize you with
|
|
basic Emacs functionality.
|
|
```
|
|
|
|
# Emacs "Killer Apps"
|
|
|
|
As I hinted above, Emacs functionality goes way beyond being a mere text
|
|
editor. I will list here a couple of Emacs "apps" that are fairly
|
|
powerful and popular and may interest you in and of themselves.
|
|
|
|
## Org
|
|
|
|
Technnically, `org-mode`, a major mode for buffer editing that provides
|
|
organizational tools. It is very difficult to succinctly describe what
|
|
Org can do because it's a behemoth of a tool that has many diverse uses
|
|
to different people. I will attempt to describe the main features I use
|
|
briefly.
|
|
|
|
- Divide your file into sections and sub-sections for easy outlining
|
|
and organizing of concepts.
|
|
- Different headings in the outline are foldable/expandable so that
|
|
you can focus on what you need to focus on and eliminate
|
|
distractions.
|
|
- You can maintain a TODO list within Org
|
|
- You can compile TODO lists from many files into an agenda
|
|
- Track the time you spend on each TODO task
|
|
- Manage tables in plain text (including spreadsheet-like
|
|
capabilities)
|
|
- Using the extension `org-babel`, write and execute code blocks in
|
|
your file. The results are captured and are re-usable within the
|
|
file itself. Think Jupyter notebook for any language.
|
|
- Display inline images and LaTeX formulas as images within your file
|
|
(makes for a great note-taking system and/or personal wiki)
|
|
- Export your file into many different formats (LaTeX, PDF, html,…)
|
|
|
|
Org mode is a very powerful tool to add to your productivity arsenal
|
|
and, on a personal note, was the reason that caused me to start using
|
|
Emacs after years of using Vim.
|
|
|
|
## Magit
|
|
|
|
This is a frontend to `git` from within Emacs. It features a very
|
|
intuitive and discoverable interface, yet exposes very powerful
|
|
functionality that allows you to manage commits at the chunk level,
|
|
inspect diffs, rebase, cherry-pick, … all from within the comfort of
|
|
your own editor.
|
|
|
|
# A Word of Advice
|
|
|
|
If you are considering using Emacs, a common trap that beginning users
|
|
fall into is to copy someone else's configuration file and use it as is.
|
|
I highly recommend against doing this for several reasons:
|
|
|
|
- It will discourage you from learning and finding things out for
|
|
yourself
|
|
- Someone else's configuration will probably contain many things
|
|
relevant to them that you won't need or ever use.
|
|
- It defeats the purpose of having a customizable text editor that can
|
|
fit your own needs.
|
|
|
|
What I encourage you to do is to look at other people's configurations
|
|
and seek to understand them and adapt only what makes sense to you. You
|
|
can find out about new features of Emacs through many YouTube videos,
|
|
screencasts or blog posts and then learn for yourself how to add them to
|
|
your configuration and workflow. This way, you grow your configuration
|
|
incrementally while increasing your knowledge of Emacs along the way.
|
|
|
|
# Additional Resources
|
|
|
|
- [The GNU Emacs Manual](https://www.gnu.org/software/emacs/manual/emacs.html)
|
|
- [Emacs Stack Exchange](https://emacs.stackexchange.com/)
|
|
- [Emacs Wiki](https://www.emacswiki.org/emacs/EmacsWiki)
|