Emacs: Tabs, Space, Indentation Setup
Setting Up Indent
How to set indentation to always use space?
Put this in your emacs init.
(progn ;; make indentation commands use space only (never tab character) (setq-default indent-tabs-mode nil) ;; emacs 23.1 to 26, default to t ;; if indent-tabs-mode is t, it means it may use tab, resulting mixed space and tab )
How to set indentation to always use tab?
There is no easy way to do it globally.
You need to look into each mode's documentation, and see if the mode supports that feature.
A simple workaround, is just to insert/delete literal tab yourself for indentation.
You can insert a literal tab by Ctrl+q Tab or Ctrl+q Ctrl+i.
Or, you can make the Tab key always insert a literal tab.
(defun my-insert-tab-char () "Insert a tab char. (ASCII 9, \t)" (interactive) (insert "\t")) (global-set-key (kbd "TAB") 'my-insert-tab-char) ; same as Ctrl+i
How to set default tab display width?
;; set default tab char's display width to 4 spaces (setq-default tab-width 4) ; emacs 23.1 to 26 default to 8 ;; set current buffer's tab char's display width to 4 spaces (setq tab-width 4)
How to make the Tab key always do indent or completion?
Here's the official GNU Emacs's convention for controlling what the Tab key does, globally for programing language major modes:
;; make tab key always call a indent command. (setq-default tab-always-indent t) ;; make tab key call indent command or insert tab character, depending on cursor position (setq-default tab-always-indent nil) ;; make tab key do indent first then completion. (setq-default tab-always-indent 'complete)
Note:
- To set globally, use
setq-default
(but major modes may override it.) - To set for current buffer only, use
setq
- To set for specific major mode only, use
setq
in a hook. [see Emacs: What's Hook?] - Major mode may not respect these settings (either because it has its own design, or because of bad quality). (most or all bundled GNU Emacs major modes for programing languages do conform.)
- Major modes may have its own idea of indentation or system to control whether indentation insert tab char or space.
- Major modes may have its own idea of controlling whether the Tab key should do indentation or completion.
If you really want to control what the Tab key does, just hard set that key directly to a command of your choice. The disadvantage is that completion packages such as yasnippet that by default uses tab key, may not work automatically.
here's examples:
(global-set-key (kbd "TAB") 'my-command) ; same as Ctrl+i (global-set-key (kbd "<tab>") 'my-command) ;; • the syntax (kbd "TAB") corresponds to ASCII 9 control character, which is also equivalent to (kbd "C-i"). At the core, Emacs uses characters with control bits to represent key press. ;; • the syntax (kbd "<tab>") is the tab key, higher level. when emacs is running in GUI, it can distinguish <tab> key vs the ASCII control character ASCII 9. ;; • by default (kbd "<tab>") is translated to (kbd "TAB"). ;; example of a function that just insert a tab char (defun insert-tab-char () "insert a tab char. (ASCII 9, \t)" (interactive) (insert "\t") )
How to make Return key also do indent of previous line?
;; make return key also do indent, for current buffer only (electric-indent-local-mode 1) ;; make return key also do indent, globally (electric-indent-mode 1)
Indent Commands
How to insert Tab character or Newline character?
The following method works everywhere (also works in minibuffer).
To insert a literal tab char, press 【Ctrl+q Tab】.
To insert a newline char, type 【Ctrl+q Ctrl+j】.
You need to use the above method to insert these characters, because for example in minibuffer, pressing Tab does name completion and pressing Enter finishes the prompt. In most programing language modes, pressing Enter or Tab also does some auto indenting.
How to indent current line?
Alt+x indent-for-tab-command
【Tab】.
How to indent a text selection of source code?
Alt+x indent-region
【Ctrl+Alt+\】.
More indentation commands:
indent-relative
indent current line like previous non-blank line.indent-relative-maybe
likeindent-relative
indent current line like previous non-blank line, only if the previous line has more indent than current line.indent-rigidly
move all lines in a region, right or left.
How to convert tabs to space in source code?
Select a region first, then Alt+x untabify
or tabify
.
How to show whitespaces?
Alt+x whitespace-mode
How to delete trailing whitespaces?
Completion
How to do completion?
Alt+x completion-at-point
【Ctrl+Alt+i】. Or Alt+x complete-symbol
.
Whitespace Topic
Emacs Customization
- Emacs init file
- What's Major Mode
- What's Minor Mode
- M-x customize
- Organize Init File
- Byte Compile Elisp
- What's Hook
- Avoid Lambda in Hook
- Environment Variables in Emacs
- Check OS, Version, Host Name
- Check Defined/Loaded
packages
text editing
- Define Keys
- Set Mouse Buttons
- Tabs, Space, Indentation Setup
- auto bracket pair
- Copy/Cut Line If No Selection
- Isearch space for - _
- Ido Completion
- Icomplete Completion
- Move Cursor by camelCase
- Stop Cursor Going into Minibuffer Prompt
- Sync Clipboard with Linux X11
file
- Default Major Mode
- Auto Backup Off
- Auto Save
- Restore Opened Files
- Save Cursor Position
- Dired Customization
- Open Recently Opened
- Open Last Closed File
appearance
- Show Line Numbers
- Show Cursor Position
- Visual Line Mode, Wrap Lines
- High Light Current Line
- Make Whitespaces Visible
- Set Default Window Size
- Font Setup
- Line Spacing
- Set Color Theme
- Highlight Paren
- Show lambda as λ
- Color CSS Hex Code
misc
If you have a question, put $5 at patreon and message me.
Or Buy Xah Emacs Tutorial
Or buy a nice keyboard:
Best Keyboards for Emacs