在Vim中上下移动整行

在Notepad ++中,我可以使用Ctrl + Shift + 向上 /向下来上下移动当前行。 在Vim中有类似的命令吗? 我已经看过无尽的指南,但什么都没有find。

如果没有,我怎么能把这个动作绑定到这个组合键上?

编辑:Mykola的答案适用于所有行,除了在缓冲区的开始和结束。 将第一行向下移动或向下移动删除行,当移动底行时,最初跳转两个空格,就像一个棋子! 任何人都可以提供任何改进?

把下面的内容放到你的.vimrc中去完成这个工作

noremap <cs-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR> noremap <cs-down> ddp 

消失的行看起来像一个Vim的错误。 我把一个黑客来避免它。 可能有一些更准确的解决scheme。

更新

仅仅使用Vim组合就有很多原因不明的困难。 这些是缺less线路和额外的线路跳跃。

所以这里是脚本解决scheme,可以放在.vimrc或〜/ .vim / plugin / swap_lines.vim

 function! s:swap_lines(n1, n2) let line1 = getline(a:n1) let line2 = getline(a:n2) call setline(a:n1, line2) call setline(a:n2, line1) endfunction function! s:swap_up() let n = line('.') if n == 1 return endif call s:swap_lines(n, n - 1) exec n - 1 endfunction function! s:swap_down() let n = line('.') if n == line('$') return endif call s:swap_lines(n, n + 1) exec n + 1 endfunction noremap <silent> <cs-up> :call <SID>swap_up()<CR> noremap <silent> <cs-down> :call <SID>swap_down()<CR> 

如果我想用上面的行换一行,我通常会做以下操作

 ddkP 

说明

  • dd将删除该行并将其添加到默认的registry中。
  • k将上移一行(j将下移一行)
  • P将粘贴在当前行的上方

假设光标在你想要移动的那一行上。

上下移动:m移动

:m +1 – 向下移动1行

:m -2 – 向上移动1行

(请注意,您可以用任何数字replace+1,具体取决于您想要向上或向下移动的行数,即+2会将其向下移动2行,-3会将其向上移动2行)

移动到特定的行

:set number – 显示号码行(更容易看到你移动到哪里)

:m 3 – 在第三行之后移动行(将3replace为您想要的行)

移动多行:

V (即ShiftV )并上下移动select器以在VIM中select多行

一旦选中hit 并运行上面的命令, m +1

排队: ddkP

向下移动一行: ddp

这对我工作:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

顺便说一句,如果你想使用ALT + some_key和你的terminal(urxvt这样做)拒绝遵守,你应该在你的.vimrc中input这样的内容:

 " For moving lines (^] is a special character; use <Mk> and <Mj> if it works) nnoremap ^]k mz:m-2<CR>`z== inoremap ^]j <Esc>:m+<CR>==gi inoremap ^]k <Esc>:m-2<CR>==gi vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z nnoremap ^]j mz:m+<CR>`z== vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z 

其中^]是代表ALT键的单个字符 。 要input该字符,请在Vim中使用C + v,EscC + q, Windows上的Esc )。

在命令模式下,将光标定位在要向下移动的行上,然后

 ddp 

说明:dd将当前行删除到通用缓冲区p在光标位置之后,或者在整行的情况下,将其放回到下一行。

关于命令p和p在许多文档中有一些混淆。 实际上在光标后面贴上P贴,在P上贴上光标。

将以下内容添加到〜/ .vimrc文件(确保没有n,m的映射)

 nmap n :m +1<CR> nmap m :m -2<CR> 

现在按n键将会移动一条线, m将移动一条线。

只需将此代码添加到.vimrc(或.gvimrc)

 nnoremap <Aj> :m+<CR>== nnoremap <Ak> :m-2<CR>== inoremap <Aj> <Esc>:m+<CR>==gi inoremap <Ak> <Esc>:m-2<CR>==gi vnoremap <Aj> :m'>+<CR>gv=gv vnoremap <Ak> :m-2<CR>gv=gv 

在这个真棒插件中find了什么 : https : //github.com/vim-scripts/upAndDown

下面是MacVim的一个简化版本,使用Wikia文章的例子(参见的评论链接)。

 " Move selection up/down (add =gv to reindent after move) :vmap <DS-Up> :m-2<CR>gv :vmap <DS-Down> :m'>+<CR>gv 

我只使用块select变体,因为它只需要Shift-V来select当前行,并可select上/下光标来select更多的行。

根据上面的快捷键,按下Cmd-Shift-Up / Down将上下移动块select。 “D”是MacVim中的命令键,对于Windows,尝试“C”(控制)或“A”(Alt)(例如,<CAf>将是Control Alt f)。

Wikia文章中增加了“= gv”,这个function可以根据周围的文字调整移动后的缩进。 这是令人困惑的,所以我删除它,并添加快捷方式来快速缩进select。

 " Indent selection left/right (Cmd Shift Left/Right is used for Tab switching) :vmap <DA-Left> <gv :vmap <DA-Right> >gv 

注意,使用<<和>>也可以做到这一点,但是select会丢失,所以上面的这些快捷方式允许多次缩进,并且由于select被保留而仍然移动块。

我的MacVim被configuration为切换选项卡Cmd的Shift +左/右,所以我用Cmd-Alt-左/右。

这里是MacVim的Tab切换(在上面的其余部分放入.gvimrc):

 :macm Window.Select\ Previous\ Tab key=<DS-Left> :macm Window.Select\ Next\ Tab key=<DS-Right> 

我把以下放在我的.vimrc文件的末尾:

 noremap H ddkkp noremap N ddp 

所以现在“H”和“N”分别上下移动当前行。

一个简单的解决方法是把你的.vimrc放在这些行中:

 nmap <C-UP> :m-2<CR> nmap <C-DOWN> :m+1<CR> 

:m。+ 1或:m.-2会在你移动一行时做。 这是我的脚本移动多行。 在视觉模式下,Alt-up / Alt-down会将包含视觉select的线向上/向下移动一行。 在插入模式或正常模式下,如果没有给出计数前缀,Alt-up / Alt- down将移动当前行。 如果有一个计数前缀,Alt-up / Alt-down将从当前行开始向上/向下移动一行。

 function! MoveLines(offset) range let l:col = virtcol('.') let l:offset = str2nr(a:offset) exe 'silent! :' . a:firstline . ',' . a:lastline . 'm' \ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset) exe 'normal ' . l:col . '|' endf imap <silent> <M-up> <CO>:call MoveLines('-2')<CR> imap <silent> <M-down> <CO>:call MoveLines('+1')<CR> nmap <silent> <M-up> :call MoveLines('-2')<CR> nmap <silent> <M-down> :call MoveLines('+1')<CR> vmap <silent> <M-up> :call MoveLines('-2')<CR>gv vmap <silent> <M-down> :call MoveLines('+1')<CR>gv 

在正常模式下,您可以按下: Shift + j

vim插件unimpaired.vim [e和] e

崇高文本中的VIM模式2

不是VIM,但我到了这里寻找一种在ST2的复古模式中做到这一点的方法,所以它可能对其他人有用。

对于那些使用Sublime Text 2,你可以使用…

控制 + 命令 + 向上 / 向下

…分别向上或向下移动一条线