![[Home]](https://www.emacswiki.org/images/logo218x38.png)
This table does not cover basic commands like character motion
| Description | Vi | Emacs |
| transpose characters | xp | ‘C-t’ |
| transpose words | dwwp | ‘M-t’ |
| indent | >> | ‘C-x TAB’ |
| search | /pat | ‘C-s’ |
| substitute | :%s/pat/subs | `M-%’ or `C-M-%’ |
| substitute variables | :s/pat/\1 \2 | ‘M-x replace-regexp’, then \1 \2 |
| search word/identifier | /\<word\> | ‘C-s M-e C-w’ |
| delete lines | :g/pat/d | ‘M-x flush-lines’ |
| zap-to | cf | ‘M-z’ |
| set line numbers | :se nu | see LineNumbers |
| show tabs and newlines | :se list | see ShowWhiteSpace |
| change file formats | :se ff=unix/dos | ‘C-x RET f’ (TAB to choose) |
| shell command | :! command | `M-! command ‘ |
matching ({[ | % | ‘C-M-f/b’ |
| filename on bottom line | % | see code below |
| sort lines | n!!sort | ‘M-x sort-lines’ |
| 2-way pipe | n!! cmd | `C-u M-| cmd’, see also ExecuteExternalCommand |
| search word/identifier under cursor | * | ‘C-s C-w’, then ‘C-s’ |
| repeat last command | . | see RepeatingCommandsLikeVi |
| set file-local variables | :h modeline | see FileLocalVariables, LocalVariables |
In vi, % in the ‘:’ line gets substituted by the file name. This code does the same. It gets invoked by M-x M-! M-: and maybe others
(define-key minibuffer-local-map "%" (function (lambda () (interactive) (insert (file-name-nondirectory (buffer-file-name (window-buffer (minibuffer-selected-window))))))))
See Also: ViAndEmacs ViKeys