在Vim中上下移动整条线

use*_*812 301 vi vim

在Notepad ++中,我可以使用Ctrl+ Shift+ Up/ Down来上下移动当前行.在Vim中有类似的命令吗?我看过无尽的向导,却一无所获.

如果没有,我怎么能将动作绑定到该组合键?

编辑:Mykola的答案适用于所有行,除了缓冲区的开头和结尾处.向上移动第一行或向下移动底线会删除该行,当向下移动底线时,它最初会跳转两个空格,就像一个棋子!任何人都可以提供任何改进吗?

Jar*_*Par 553

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

ddkP
Run Code Online (Sandbox Code Playgroud)

说明

  • dd将删除该行并将其添加到默认寄存器.
  • k将向上移动一条线(j将向下移动一条线)
  • P将粘贴在当前行之上

  • 并且'ddp`向下移动一行(删除行并粘贴在当前行下面) (68认同)
  • 而且它总是可用的.:-) (4认同)
  • 要移动一堆行,请说 4,“4 dd”,然后移动到,说 2 行,然后是“:2”您要粘贴的位置和“P”。 (2认同)
  • @Guru应该是'4dd`而不是`4 dd`? (2认同)
  • 并且`dd <number> jp`将当前行<number> +1行向下移动.并且`dd <number> kp`来移动当前行<number>的行. (2认同)

Ser*_*erg 218

假设光标位于您想要移动的线上.

上下:m移动: 移动

:m +1 - 向下移动1行

:m -2 - 向上移动1行

(注意你可以用任何数字替换+1,具体取决于你想要向上或向下移动多少行,即+2将它向下移动2行,-3将它向上移动2行)

移动到特定的行

:set number - 显示数字行(更容易看到你移动到的地方)

:m 3 - 在第3行之后移动线(将3替换为您想要的任何线)

移动多行:

V(即Shift- V)并上下移动courser以在VIM中选择多行

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

  • 对我来说:m -2只向上移动一行. (13认同)
  • 我认为这是真正的“移动 x 行”运动,因为它也不会将选择放入您的复制寄存器中 (4认同)
  • 我把这个方法放在我的vimrc中,但后来我不能使用'.'重复命令.有谁知道那是为什么? (2认同)
  • 使用该命令移动,如果你想在绑定中使用它,比如来自Notepad ++的绑定,你需要在.vimrc中输入以下内容:`noremap <cs-up>:m -2 <CR> noremap <cs-down>:m +1 <CR>` (2认同)

Myk*_*yev 80

将以下内容放在.vimrc中以完成工作

noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
Run Code Online (Sandbox Code Playgroud)

消失的线看起来像Vim bug.我放了一个黑客来避免它.可能有一些更准确的解决方案.

更新

使用Vim组合有很多无法解释的困难.这些是线缺失和额外的线跳跃.

所以这里是脚本解决方案,可以放在.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> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,非常适合 git rebase --interactive 。必须绑定到 &lt;cj&gt; 和 &lt;ck&gt;。cs-上/下不起作用。 (2认同)
  • 如果有人想要一个不同的快捷方式:c用于控制,A用于替代,我使用eclipse中使用的&lt;A-up&gt;`。 (2认同)

jac*_*eon 72

移动一行: ddkP

向下移动一行: ddp


emi*_*hev 15

这对我有用:

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

顺便说一句,如果您想使用ALT + some_key并且您的终端(urxvt这样做)拒绝遵守,您应该在.vimrc中输入类似的内容:

" For moving lines (^] is a special character; use <M-k> and <M-j> 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
Run Code Online (Sandbox Code Playgroud)

其中^]是表示ALT键的单个字符.要输入该字符,请C+v, Esc在Vim中使用(C+q, Esc在Windows上).


小智 12

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

ddp
Run Code Online (Sandbox Code Playgroud)

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

关于许多文档中的命令p和P存在一些混淆.实际上p贴在AFTER光标和P AT光标上.


Gaj*_*ena 12

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

nmap n :m +1<CR>
nmap m :m -2<CR>
Run Code Online (Sandbox Code Playgroud)

现在按下n键会向下移动一条线并向上m移动一条线.

  • 这将与默认的键绑定冲突:在使用“/pattern”搜索文档后,使用“n”键“转到下一个搜索结果”。 (5认同)

Bis*_*ash 10

最简单的方法和vscode一样。将以下行添加到 .vimrc

"Ctrl+Shift+up move line above"
nmap <C-S-Up> :m -2<CR>

"Ctrl+Shift+down move line below
nmap <C-S-Down> :m +1<CR>
Run Code Online (Sandbox Code Playgroud)


ale*_*xkv 8

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

nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv
Run Code Online (Sandbox Code Playgroud)

  • 在 Mac 上 &lt;A-something&gt; 不起作用,我不知道为什么。我已替换为 &lt;Cj&gt; &lt;Ck&gt;,并且使用 Ctrl 键效果很好。 (4认同)
  • 根据http://vim.wikia.com/wiki/Moving_lines_up_or_down#Mappings_to_move_lines,请参阅那里的全面解释。 (2认同)

tim*_*ley 5

正是你在这个很棒的插件中寻找的东西:https://github.com/vim-scripts/upAndDown

  • [这个](https://github.com/matze/vim-move) 在我看来更好 (2认同)

Ger*_*iro 5

一个简单的解决方案就是放入.vimrc以下行:

nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>
Run Code Online (Sandbox Code Playgroud)


ako*_*ako 5

当您点击命令:help movevim,结果如下:

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

例如: 将当前行向下移动一行 => :m+1

例如: 将编号为 100 的行移到编号为 80 => 的行下方 :100 m 80

例如: 将编号为 100 的行移到编号为 200 => 的行下方 :100 m 200

例如: 将编号在 [100, 120] 范围内的行移至编号 200 => 的行下方 :100,120 m 200


Dav*_*ért 5

您的光标可以位于任何行上。打开线路编号可以轻松识别线路位置。
第一种情况:假设我在第 7 行,想要将第 3 行移动到第 9 行,将其移至页面下方。

  • :3m 9 完成移动。

第二种情况:我仍在第 7 行,但现在我想将第 9 行移动到第 3 行,将其显示在页面上。

  • :9m 2 完成移动。请注意,目的地使用 2 而不是 3。

注:光标将移动到移动目标位置。如果我想要返回到第 7 行,只需使用 :7

第三种情况: 移动一定范围的线。比如说,9 到 12,第 9 行在第 3 行结束