Swapping characters, words and lines

From Vim Tips Wiki

Jump to: navigation, search
Tip 47 Printable Monobook Previous Next

created 2001 · complexity basic · version 6.0


[edit] Normal-mode commands

Swap the current character (the character under the cursor) with the next:

xp

Swap the current character with the previous:

Xp

Swap the current line with the next (but see below for a better method):

ddp

Swap the current line with the previous:

ddkP or ddkkp

Swap the current word with the next (see note):

dawwP
dawelp
hdeep                (works at start of first word)
"xdiwdwep"xp         (works with most punctuations too)

Swap the current word with the previous (see note):

dawbP

Note: These swap-word techniques don't work with punctuation. Use the mappings below to more intelligently move words. However, for many more complex swaps, several plugins are available with often do a better job.

[edit] Mappings

See moving lines up or down for the best method to move lines.

To use gc to swap the current character with the next, without changing the cursor position:

:nnoremap <silent> gc xph

To use gw to swap the current word with the next, without changing cursor position: (See note.)

:nnoremap <silent> gw "_yiw:s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l>
" This version will work across newlines:
:nnoremap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l>

To use gl to swap the current word with the previous, keeping cursor on current word: (This feels like "pushing" the word to the left.) (See note.)

:nnoremap <silent> gl "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l>

To use gr to swap the current word with the next, keeping cursor on current word: (This feels like "pushing" the word to the right.) (See note.)

:nnoremap <silent> gr "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o>/\w\+\_W\+<CR><c-l>

To use g{ to swap the current paragraph with the next:

:nnoremap g{ {dap}p{

Note: Mappings above which perform a search-and-replace (ones containing :s//) will operate incorrectly on words with accented characters. To adjust the mappings above to work with your locale, replace all \w with [alphabet] and \W with [^alphabet], where alphabet is the set of characters in your alphabet. :help /\w

[edit] Visual-mode swapping

To use this mapping: first, delete some text (using a command such as daw or dt in normal mode, or x in visual mode). Then, use visual mode to select some other text, and press Ctrl-X. The two pieces of text should then be swapped.

:vnoremap <C-X> <Esc>`.``gvP``P

[edit] Related plugins

[edit] See also

[edit] Comments

[edit] Swap all lines in a visual selected block

When working with arrays I sometimes realize that I have to do things in the opposite order. To easily change this I created this small function:

function SwapAll() range
  if a:firstline != a:lastline
    if a:firstline < a:lastline
      let first=a:firstline
      let last=a:lastline
    else
      let first=a:lastline
      let last=a:firstline
    endif
    while first < last
      exec first.'m'.last.'|'.(last-1).'m'.(first-1)
      let first=first+1
      let last=last-1
    endwhile
  endif
endfunction

vmap     <silent> <C-s>   :call SwapAll()<CR>
vnoremap <silent> <C-x>   :call SwapAll()<CR>

--December 4, 2013

Personal tools