Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Vim中上下移动整个管路_Vim_Vi - Fatal编程技术网

在Vim中上下移动整个管路

在Vim中上下移动整个管路,vim,vi,Vim,Vi,在记事本++中,我可以使用Ctrl+Shift+Up/Down上下移动当前行。Vim中是否有类似的命令?我查阅了无数的指南,但什么也没找到 如果没有,我如何将操作绑定到该组合键 编辑:Mykola的答案适用于所有行,除了缓冲区开头和结尾的行。向上移动第一行或向下移动底线会删除该行,向上移动底线时,它最初会跳两个空格,就像一个棋子!有人能提供一些改进吗?如果我想用上面的一行交换一行,我通常会做以下操作 ddkP 解释 dd将删除该行并将其添加到默认寄存器 k将向上移动一条线(j将向下移动一条线

在记事本++中,我可以使用Ctrl+Shift+Up/Down上下移动当前行。Vim中是否有类似的命令?我查阅了无数的指南,但什么也没找到

如果没有,我如何将操作绑定到该组合键


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

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

ddkP
解释

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

将以下内容放到.vimrc中以完成此项工作

noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
noremap:callfeedkeys(行('.')==1?''ddkP')
诺雷马克
线路的消失看起来像一个Vim错误。我放了一个黑客来避免它。也许有更精确的解决方案

更新

仅使用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>
函数!s:交换线(n1、n2)
设line1=getline(a:n1)
设line2=getline(a:n2)
呼叫设置线路(a:n1,线路2)
呼叫设置线路(a:n2,线路1)
端功能
功能!s:swap_up()
设n=直线('.'))
如果n==1
返回
恩迪夫
呼叫s:交换线路(n,n-1)
行政主任n-1
端功能
功能!s:swap_down()
设n=直线('.'))
如果n==行(“$”)
返回
恩迪夫
呼叫s:交换线路(n,n+1)
执行官n+1
端功能
noremap:调用swap_up()
noremap:调用swap_down()
这对我很有用:

顺便说一句,如果您想使用ALT+some_键,而您的终端(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
移动行的“
”(^]是一个特殊字符;如果有效,请使用和)
nnoremap^]k mz:m-2`z==
inoremap^]j:m+==gi
inoremap^]k:m-2==gi
vnoremap^]j:m'>+gv=`mzgv`yo`z
nnoremap^]jmz:m+`z==

vnoremap^]k:m'my`这是一个简化版本,用于MacVim,使用Wikia文章示例(参见gun评论中的链接)

“向上/向下移动所选内容(移动后添加=gv以重新登入)
:vmap:m-2gv
:vmap:m'>+gv
我只使用块选择变量,因为它只需要Shift-V选择当前行,还可以选择向上/向下光标选择更多行

根据上面的快捷方式,按Cmd Shift Up/Down将向上/向下移动块选择。“D”是MacVim中的命令键,对于Windows,请尝试“C”(控制)或“A”(Alt)(例如,将是控制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
“左/右缩进选择(Cmd Shift left/right用于切换制表符)
:vmap gv
请注意,使用>也可以这样做,但是选择将丢失,因此上面的这些快捷方式允许多次缩进,并且仍然会移动块,因为选择被保留

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

下面是MacVim的选项卡切换(与上面的其余部分一起放入.gvimrc):

:macm窗口。选择\Previous\Tab键=
:macm窗口。选择\Next\Tab键=

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

nnoremap:m+==
nnoremap:m-2==
inoremap:m+==gi
inoremap:m-2==gi
vnoremap:m'>+gv=gv
vnoremap:m-2gv=gv

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

ddp
说明: dd删除通用缓冲区的当前行 p将其放回光标位置之后,或者如果是整行,则放回下方一行

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

这正是您在这些插件中寻找的内容:


移动队列:
ddkP


向下移动一行:
ddp

vim plugin unpaired.vim[e和]e

: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
函数!移动行(偏移)范围
设l:col=virtcol('.'))
设l:offset=str2nr(a:offset)
exe'silent!:'.a:第一行','.a:最后一行。'm'
\(l:偏移>0?a:最后一行+l:偏移:a:第一行+l:偏移)
exe'normal'。l:col.。|'
endf
imap:调用MoveLines('-2')
imap:调用MoveLines(“+1”)
nmap:调用MoveLines('-2')
nmap:调用MoveLines(“+1”)
vmap:调用MoveLines('-2')gv
vmap:调用移动线路('+1')gv

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

上下移动: 搬家

:m+1
-向下移动1行

:m-2
-上移1行

(注意,根据要向上或向下移动的行数,可以将+1替换为任意数字,即+2将向下移动2行,-3将向上移动2行)

移动到特定行

-显示数字行(更容易看到移动到的位置)

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

移动的
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
ddp
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
noremap H ddkkp
noremap N ddp
nmap n :m +1<CR>
nmap m :m -2<CR>
nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>
" 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
:g/^/move 0