What Makes Emacs Different and Unique

Created On: 2016-07-31 Updated On: 2021-08-11

Emacs is Highly Dynamic

In emacs, every keystroke and command can be customized (redefined) when the editor is still running, including typing characters, pressing arrow keys. Usually in an editor, you would expect typing character and moving cursor via arrow keys to be basic and not customizable. Not in emacs.

In emacs, typing a character most likely runs self-insert-command. As the name implies, it just insert the character itself. However, this binding is fully customizable just like your F6 key or other keys. There is nothing special for it. And in deed, in some built-in modes, pressing a character no longer does self-insert-command any more. For example, in electric-pair-mode, when you insert an open parenthesis, emacs automatically insert a matching closing parenthesis. When cursor is at a matching closing parenthesis, typing the closing parenthesis again will just move cursor after it instead of inserting an additional unwanted one. In viper mode, typing characters mimics their behavior in the VIM editor, which can do very different things than inserting characters.

This is all possible because the dynamic feature of the lisp language. Some low level infrastructure of the editor is bootstrapped using C, then everything else is either implemented directly in emacs lisp or is exposed via emacs lisp.

Major modes, minor modes, font faces, keymaps, almost everything defined in emacs can be redefined on the fly easily. There is even a built-in tetris game (run M-x tetris). So you get the idea how dynamic it is.

Text Based System is Powerful

Emacs has many built-in commands for moving cursor and manipulating text. Text, although lacking in multimedia capabilities like HTML, is still a very useful and powerful representation for different things.

There are a few things that are considerably more powerful when run in a text based system like emacs.

For example, running shells. Usually people run dedicated terminal emulators like rxvt-unicode or Konsole. Those are OK at running commands. But in emacs, there is a shell mode, which makes the shell's input and output as plain text in a emacs buffer. Scrolling, searching output, copying, pasting can't be easier. You have the full power of emacs such as word/path based cursor movement, input history, path expansion, e.g. cd /u/loc/bi TAB expanding to cd /usr/local/bin/. You can query replace substrings. Your abbreviations will just work. You can run many shells and switch between them the same way you switch between file buffers.

Another example is bulk file renaming, like removing a common prefix or renaming all .JPG files to .jpg. In emacs's file manager dired, renaming multiple files is as easy as editing the filename as text. You can do search & replace, downcase-word, rectangle editing. Any command that works on regular text buffer will work there. And full undo history is available as well. When you save the buffer, the files will get renamed. It's very convenient and intuitive.

Viewing man page in emacs is also much more pleasant than in terminal. Since the rendered result is just text, all emacs's search commands are available. You can use occur to find specific text or option, you can jump to man page sections, you can jump to other referenced man pages by clicking them, you can copy & paste or do cross buffer auto completion in shell buffer. On regular man command, the rendered result is just piped to less, which doesn't know about sections and links to other man pages at all.

Writing Email, git commit message, doing git rebase, chatting via IRC, they all have been easier in emacs because of the universal text interface.

Great Extensibility with Great Documentation

Emacs's built-in documentation covers the core editor's features and programming interfaces very well. That includes the info doc for emacs and elisp, the describe-function and describe-variable facility, which is bound on C-h f and C-h v respectively, and the source code (.el.gz) which is usually quite readable.

To change behavior of existing features, you just write and execute elisp code inside emacs. When you want to persist a change across restarts, you put them in ~/.emacs.d/init.el. To write new features, you can build on top of existing modes and a large collection of existing functions easily.

Emacs has many useful features during its many years of development. New modes and extensions are also being created from different people in different areas. The most important change for me in recent 2 or 3 years is the huge growth of org-mode and the package system (elpa and melpa). Org-mode is for keeping notes, maintaining TODO lists, planning projects, and authoring documents with a fast and effective plain-text system. The package system allows searching, distributing, installing and removing emacs extensions more easily. It also encourages code reuse. Emerging programming languages usually have an emacs mode to support syntax highlighting and other features, because it is a powerful editor and it is easy to add a major or minor mode.

In comparison, other editors and IDEs usually either lack in extensibility or documentation or both. Emacs is the only editor that I knows that doesn't distinguish between built-in features and user defined features. They are written in the same way, and loaded in the same way. When you add or change something, there is no need to compile it somewhere else or restart emacs. User defined code looks and works just like built-in code. Actually this is a feature of the lisp language. You can think of emacs as an editor DSL on top of emacs lisp. It just makes writing editor and related things easier. Your running emacs instance is just a lisp image that is configured to accept keyboard/mouse events and can load more elisp code.

Conclusion

Emacs is a highly dynamic, easily extensible and well documented text based system with good predefined text editing facilities. There are also bad things on emacs, but I will leave it for another day.

Is this post helpful?