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?


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

Kill & Mark Things Easily in Emacs

Travis CI build status

Provide commands easy-kill and easy-mark to let users kill or mark things easily.

Comments, bug reports and patches are highly appreciated.


easy-kill is a drop-in replacement for kill-ring-save. To Use:

(global-set-key [remap kill-ring-save] 'easy-kill)

After this configuration, M-w serves as both a command and a prefix key for other commands. M-w alone saves in the order of active region, url, email and finally current line (See easy-kill-try-things). As a prefix key:

  1. M-w w: save word at point
  2. M-w s: save sexp at point
  3. M-w l: save list at point (enclosing sexp)
  4. M-w d: save defun at point
  5. M-w D: save current defun name
  6. M-w f: save file at point
  7. M-w b: save buffer-file-name or default-directory. - changes the kill to the directory name, + to full name and 0 to basename.

The following keys modify the selection:

  1. @: append selection to previous kill and exit. For example, M-w d @ will append current function to last kill.
  2. C-w: kill selection and exit
  3. +, - and 1..9: expand/shrink selection
  4. 0 shrink the selection to the initial size i.e. before any expansion
  5. SPC: cycle through things in easy-kill-alist
  6. C-SPC: turn selection into an active region
  7. C-g: abort
  8. ?: help

For example, M-w w saves current word, repeat w to expand the kill to include the next word. 5 to include the next 5 words etc. The other commands also follow this pattern.

+/- does expanding/shrinking according to the thing selected. So for word the expansion is word-wise, for line line-wise, for list or sexp, list-wise.

list-wise expanding/shrinking work well in lispy modes (elisp, Common Lisp, Scheme, Clojure etc.), smie-based modes (Prolog, SML, Modula2, Shell, Ruby, Octave, CSS, SQL etc.), Org mode, Nxml mode and Js2 mode.

To copy the enclosing list in lispy modes, I used to do a lot of C-M-u C-M-SPC M-w. Now the key sequence is replaced by M-w l (save list at point) as shown in screenshot:

``M-w l``


easy-mark is similar to easy-kill but marks the region immediately. It can be a handy replacement for mark-sexp allowing +/- to do list-wise expanding/shrinking and marks the whole sexp even when in the middle of one.

(global-set-key [remap mark-sexp] 'easy-mark)


easy-kill is part of GNU ELPA and is also available on MELPA.


New things can be defined by following package thingatpt.el's convention, or by defining new functions named like easy-kill-on-THING-NAME. See easy-kill-on-buffer-file-name and easy-kill-on-url for examples.



  1. [BREAKING] Emacs >= 25 required.
  2. [BREAKING] Remove deprecated format for easy-kill-alist.
  3. Include uuid in easy-kill-try-things and easy-mark-try-things.


  1. New user variable easy-kill-unhighlight-key.
  2. key D selects current defun name.
  3. Key SPC selects things in easy-kill-alist in turn.


  1. Key ? in easy-kill or easy-mark prints help info.
  2. M-w l can select the enclosing string.
  3. easy-mark learns exchanging point & mark.
  4. Key 0 now sets the selection to its initial size before any expansion.
  5. M-w l, M-w s and list-wise +/- now work in Org mode.


  1. - can move pass the first selection.
  2. +/- on sexp no longer change thing to list
  3. Mouse over the selection now shows description.
  4. Echo js2 node name.
  5. Append now uses sensible separator (customisable via easy-kill-alist).
  6. The format of easy-kill-alist has changed. The old (CHAR . THING) format is still supported but may be removed in future.