Smart shift text left/right by current major mode indentation width.
Emacs Lisp
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Smart Shift

Smart Shift is a minor mode for conveniently shift the line/region to the left/right by the current major mode indentation width or shift line/region backwardly/forwardly by lines.



Once you have setup Melpa you can use package-install command to install. The package name is smart-shift.


(add-to-list 'load-path "/path/to/smart-shift")
(require 'smart-shift)
(global-smart-shift-mode 1)


Smart Shift will infer the indentation level of current major mode, if none of major modes listed below match, use the tab-width as default.

It can also be set to a number explictly.

(setq smart-shift-indentation-level 2)

Or, for some major mode we haven't support, add following snippets to your config file. Test it and send a PR.

(eval-after-load 'your-major-mode
     (add-to-list 'smart-shift-mode-alist
                  '(major-mode-or-derived-mode . customize-base-offset))))

Supported major modes

  • lisp-mode
  • emacs-lisp-mode
  • c-mode
  • c++-mode
  • objc-mode
  • java-mode
  • idl-mode
  • pike-mode
  • awk-mode
  • ruby-mode
  • python-mode
  • swift-mode
  • js-mode
  • js2-mode
  • coffee-mode
  • css-mode
  • scss-mode
  • slim-mode
  • html-mode
  • web-mode
  • sh-mode
  • yaml-mode
  • text-mode
  • markdown-mode
  • fundamental-mode

Interactive commands

Command Keybinding Description
smart-shift-left C-C <left> Shift the line or region ARG times to the left.
smart-shift-right C-C <right> Shift the line or region ARG times to the right.
smart-shift-up C-C <up> Shift the line or region ARG lines backwardly.
smart-shift-down C-C <down> Shift the line or region ARG lines forwardly.

After invoking smart-shift-<arrow> the first time, you can simply hit the <arrow> key to continuously shift, respectively.

If you use the key-chord like me. I strongly recommend you add the following snippets:

(key-chord-define-global "<<" 'smart-shift-left)
(key-chord-define-global ">>" 'smart-shift-right)


Forks and pull requests are welcome!