Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

NonGNU ELPA MELPA Build Status

English is not my first language, so feel free to correct any of my mistake.


Easy text exchange operator for Evil. This is the port of vim-exchange by Tom McDonald.

Default bindings

gx (evil-exchange)

On the first use, define (and highlight) the first {motion} to exchange. On the second use, define the second {motion} and perform the exchange.

gX (evil-exchange-cancel)

Clear any {motion} pending for exchange.


  • gx (and gX) can also be used from visual mode, which is sometimes easier than coming up with the right {motion}
  • If you're using the same motion again (e.g. exchanging two words using gxiw), you can use . (evil-repeat) the second time.
  • gxx works as you expect.


  • Unlike the original vim plugin's buffer local behaviour, this extension allows you to exchange texts across buffers.
  • Works correctly even when text insertion/deletion occurs between two evil-exchange invokes.


(require 'evil-exchange)
;; change default key bindings (if you want) HERE
;; (setq evil-exchange-key (kbd "zx"))

evil-exchange is also available in melpa and is shipped with spacemacs.


You can change the default bindings by customizing evil-exchange-key and/or evil-exchange-cancel-key BEFORE evil-exchange-install is called.

Vim-compatible key bindings

Due to the way how evil (and emacs) implements key bindings, evil-exchange can't be bound to cx (which is the default bindings of the original vim plugin) by customizing evil-exchange-key option. If you prefer the key bindings suggested by vim-exchange, you can try the settings below:

(require 'evil-exchange)

The evil-exchange-cx-install function tries to mimic the original vim plugin's behaviour, i.e. cx in normal state bound to evil-exchange, cxc in normal state bound to evil-exchange-cancel, and X in visual state bound to evil-exchange.

Known Issues

  • Some packages may redefine c (evil-change) in normal state or/and x in operator state, which will conflict with the vim style bindings (cx and cxc). In this case, you may have to unbind them to make evil-exchange-cx-install work. Any PRs are welcome for compatibility.


Port of vim-exchange






No releases published


No packages published