在Vim中上下移动整条线

时间:2009-04-12 14:02:53

标签: vim vi

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

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

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

19 个答案:

答案 0 :(得分:538)

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

ddkP

解释

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

答案 1 :(得分:77)

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

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

该行的消失看起来像一个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>

答案 2 :(得分:70)

向上移动一行:ddkP

向下移动一行:ddp

答案 3 :(得分: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

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

答案 4 :(得分:12)

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

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

现在按n键会向下移动一行,m会向上移动一行。

答案 5 :(得分:11)

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

ddp

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

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

答案 6 :(得分:7)

只需将此代码添加到.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

答案 7 :(得分:5)

这个真棒插件中您正在寻找的内容https://github.com/vim-scripts/upAndDown

答案 8 :(得分:5)

简单解决方案是将.vimrc这些行放入:

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

答案 9 :(得分:2)

我将以下内容放在.vimrc文件的末尾:

noremap H ddkkp
noremap N ddp

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

答案 10 :(得分:1)

这是MacVim的简化版本,使用了Wikia文章示例(参见 gun 评论中的链接)。

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

我只使用块选择变体,因为只需使用Shift-V选择当前行,然后选择向上/向下光标以选择更多行。

根据上面的快捷方式,按Cmd-Shift-Up / Down将向上/向下移动块选择。 “D”是MacVim中的Command键,对于Windows,尝试“C”(控制),或“A”(Alt)(例如,&lt; C-A-f&gt;将是Control Alt f)。

Wikia文章为这些文章添加了“= gv”,它可以根据周围文本调整移动后块的缩进。这很令人困惑所以我删除了它,并添加了快捷方式来快速缩进选择。

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

介意,同样可以用&lt;&lt;和&gt;&gt;但选择将会丢失,因此上面的这些快捷方式允许多次缩进并仍然移动块,因为选择得以保留。

我的MacVim配置为使用Cmd-Shift-Left / Right切换选项卡,因此我使用了Cmd-Alt-Left / Right。

这是MacVim的Tab切换(放入.gvimrc,其余为上面):

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

答案 11 :(得分:1)

对我而言,ddkkp做到了这一点(而不是使用大写字母P的ddkP也可以)。

答案 12 :(得分:1)

当您点击#r "System.IO" #r "Newtonsoft.Json" #r "Microsoft.WindowsAzure.Storage" using System; using System.Data.SqlClient; using Newtonsoft.Json; using Dapper; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using Microsoft.WindowsAzure.Storage.Shared.Protocol; public static async Task Run(TimerInfo myTimer, TraceWriter log) { var archiveStorageAccount = CloudStorageAccount.Parse("{storageConnectionString}"); CloudBlobClient blobClient = archiveStorageAccount.CreateCloudBlobClient(); // Retrieve a reference to a container. CloudBlobContainer container = blobClient.GetContainerReference(containerName); // Retrieve reference to a blob. CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); try { //Fill blob properties await blockBlob.FetchAttributesAsync(); if (blockBlob.Properties.StandardBlobTier.HasValue && blockBlob.Properties.StandardBlobTier.Value == StandardBlobTier.Cool) { //Blob ready } //Blob still rehydrating } catch (StorageException ex) { throw; } } 中的命令:help move时,结果如下:

vim

E.g: 将当前行向下移动一行=&gt; :[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

E.g: 在数字80 =&gt; :m+1的行下方移动数字100的行。

E.g: 在数字200 =&gt; :100 m 80的行下方移动数字100的行。

E.g: 在数字200 =&gt; :100 m 200的行下方[100,120]内移动数字。

答案 13 :(得分:0)

最简单的方法和 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>

答案 14 :(得分:0)

答案 15 :(得分:0)

以下是适用于我的计算机的解决方案  :运行VIM 8.1的MacBook Pro

这些命令不会删除缓冲区顶部或底部的行。

使用Alt-J和Alt-K输出的实际符号是一种解决方法,因为它们的键码在我的环境中无法正确映射。

将其放在旧的 .vimrc 中,看看是否适合您。

" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap ∆ :m .+1<CR>==
nnoremap ˚ :m .-2<CR>==
inoremap ∆ <Esc>:m .+1<CR>==gi
inoremap ˚ <Esc>:m .-2<CR>==gi
vnoremap ∆ :m '>+1<CR>gv=gv
vnoremap ˚ :m '<-2<CR>gv=gv

答案 16 :(得分:0)

如果您想在与特定搜索匹配的多行上执行此操作:

  • 向上::g/Your query/ normal ddp:g/Your query/ m -1
  • 向下:g/Your query/ normal ddp:g/Your query/ m +1

答案 17 :(得分:0)

:m。+ 1或:m.-2如果你移动一行就行。这是我移动多行的脚本。在可视模式下,Alt-up / Alt-down将包含视觉选择的线向上/向下移动一行。在插入模式或正常模式下,如果没有给出计数前缀,则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> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>: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

答案 18 :(得分:0)

vim plugin unmpaired.vim [e和] e