m (Reverted edits by 194.14.32.4 (talk | block) to last version by 46.5.18.121) |
|||
(22 intermediate revisions by 13 users not shown) | |||
Line 6: | Line 6: | ||
|complexity=basic |
|complexity=basic |
||
|author= |
|author= |
||
− | |version= |
+ | |version=6.0 |
|rating=15/14 |
|rating=15/14 |
||
|category1=Usage |
|category1=Usage |
||
Line 15: | Line 15: | ||
<pre> |
<pre> |
||
xp |
xp |
||
− | Shakespeare ensures that another significant moment |
||
</pre> |
</pre> |
||
− | Swap the '''current |
+ | Swap the '''current character''' with the previous: |
+ | <pre> |
||
+ | Xp |
||
+ | </pre> |
||
+ | |||
+ | Swap the '''current line''' with the next (but see [[#Mappings|below]] for a better method): |
||
<pre> |
<pre> |
||
ddp |
ddp |
||
Line 25: | Line 29: | ||
Swap the '''current line''' with the previous: |
Swap the '''current line''' with the previous: |
||
<pre> |
<pre> |
||
− | ddkP |
+ | ddkP or ddkkp |
</pre> |
</pre> |
||
Line 32: | Line 36: | ||
dawwP |
dawwP |
||
dawelp |
dawelp |
||
+ | hdeep (works at start of first word) |
||
"xdiwdwep"xp (works with most punctuations too) |
"xdiwdwep"xp (works with most punctuations too) |
||
</pre> |
</pre> |
||
Line 40: | Line 45: | ||
</pre> |
</pre> |
||
− | ''Note:'' These swap-word techniques don't work with punctuation. Use the mappings below to more intelligently move words. |
+ | ''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 [[#Related plugins|plugins]] are available which often do a better job. |
+ | ==Mappings== |
||
− | ==Normal-mode mappings== |
||
+ | See [[moving lines up or down]] for the best method to '''move lines'''. |
||
⚫ | |||
+ | |||
⚫ | |||
<pre> |
<pre> |
||
:nnoremap <silent> gc xph |
:nnoremap <silent> gc xph |
||
</pre> |
</pre> |
||
− | To use |
+ | To use <code>gw</code> to swap the '''current word''' with the next, without changing cursor position: (See note.) |
<pre> |
<pre> |
||
:nnoremap <silent> gw "_yiw:s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l> |
:nnoremap <silent> gw "_yiw:s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l> |
||
Line 55: | Line 62: | ||
</pre> |
</pre> |
||
− | To use |
+ | To use <code>gl</code> to swap the '''current word''' with the previous, keeping cursor on current word: (This feels like "pushing" the word to the left.) (See note.) |
<pre> |
<pre> |
||
:nnoremap <silent> gl "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l> |
:nnoremap <silent> gl "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o><c-l> |
||
</pre> |
</pre> |
||
− | To use |
+ | To use <code>gr</code> to swap the '''current word''' with the next, keeping cursor on current word: (This feels like "pushing" the word to the right.) (See note.) |
<pre> |
<pre> |
||
:nnoremap <silent> gr "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o>/\w\+\_W\+<CR><c-l> |
:nnoremap <silent> gr "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><c-o>/\w\+\_W\+<CR><c-l> |
||
</pre> |
</pre> |
||
− | To use |
+ | To use <code>g{</code> to swap the '''current paragraph''' with the next: |
<pre> |
<pre> |
||
:nnoremap g{ {dap}p{ |
:nnoremap g{ {dap}p{ |
||
</pre> |
</pre> |
||
− | ''Note:'' Mappings above which perform a search-and-replace (ones containing < |
+ | ''Note:'' Mappings above which perform a search-and-replace (ones containing <code>:s//</code>) will operate incorrectly on words with accented characters. To adjust the mappings above to work with your locale, replace all <code>\w</code> with [''alphabet''] and <code>\W</code> with <code>[^''alphabet'']</code>, where ''alphabet'' is the set of characters in your alphabet. {{help|/\w}} |
==Visual-mode swapping== |
==Visual-mode swapping== |
||
− | To use this mapping: first, delete some text (using |
+ | To use this mapping: first, delete some text (using a command such as <code>daw</code> or <code>dt</code> in normal mode, or <code>x</code> 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. |
<pre> |
<pre> |
||
:vnoremap <C-X> <Esc>`.``gvP``P |
:vnoremap <C-X> <Esc>`.``gvP``P |
||
</pre> |
</pre> |
||
+ | |||
+ | ==Related plugins== |
||
⚫ | |||
+ | *{{script|id=3250|text=Swap plugin}} provides mappings to swap adjacent words or selected text around a "pivot" |
||
+ | *{{script|id=3656|text=Transpose words plugin}} swap two words as M-t (transpose words) in Emacs or bash |
||
+ | *{{script|id=3708|text=Swap two columns plugin}} swap two columns (words) in one line or multiple selected lines |
||
+ | *{{script|id=4020|text=Flipwords plugin}} swap delimited words |
||
==See also== |
==See also== |
||
+ | *[[VimTip646|Moving lines up or down]] mappings to move lines up/down, with re-indenting |
||
*[[VimTip191|Transposing]] script to move current or selected lines up/down |
*[[VimTip191|Transposing]] script to move current or selected lines up/down |
||
⚫ | |||
==Comments== |
==Comments== |
||
+ | ===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: |
||
+ | |||
+ | <pre> |
||
+ | 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> |
||
+ | </pre> |
||
+ | --December 4, 2013 |
Revision as of 14:55, 7 April 2016
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 which often do a better job.
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
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
Related plugins
- Visual Mode Based Swapping script by Chip Campbell to swap visually-selected text
- Swap plugin provides mappings to swap adjacent words or selected text around a "pivot"
- Transpose words plugin swap two words as M-t (transpose words) in Emacs or bash
- Swap two columns plugin swap two columns (words) in one line or multiple selected lines
- Flipwords plugin swap delimited words
See also
- Moving lines up or down mappings to move lines up/down, with re-indenting
- Transposing script to move current or selected lines up/down
Comments
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