NonGNU ELPA - evil-exchange


Exchange text more easily within Evil
evil-exchange-0.41.tar (.sig), 2024-Mar-31, 20.0 KiB
Dewdrops <>
Atom feed
Browse ELPA's repository
CGit or Gitweb

To install this package from Emacs, use package-install or list-packages.

Full description

MELPA Build Status

English is not my first language, so feel free to correct me of any 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.


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

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:

lisp (require 'evil-exchange) (evil-exchange-cx-install)

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.