在Notepad ++中,我可以使用Ctrl+ Shift+ Up/ Down上下移动当前行。在Vim中有与此类似的命令吗?我浏览了无休止的指南,但一无所获。
如果没有,如何将操作绑定到该组合键?
编辑:Mykola的答案适用于所有行,除了缓冲区开头和结尾处的行。向上移动第一行或向下移动底部行会删除该行,而向上移动底部线则会首先跳两个空格,就像典当一样!谁能提供任何改进?
在Notepad ++中,我可以使用Ctrl+ Shift+ Up/ Down上下移动当前行。在Vim中有与此类似的命令吗?我浏览了无休止的指南,但一无所获。
如果没有,如何将操作绑定到该组合键?
编辑:Mykola的答案适用于所有行,除了缓冲区开头和结尾处的行。向上移动第一行或向下移动底部行会删除该行,而向上移动底部线则会首先跳两个空格,就像典当一样!谁能提供任何改进?
Answers:
将以下内容放入您的.vimrc以完成工作
noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
该行的消失看起来像是Vim错误。我放了一个hack来避免它。可能有一些更准确的解决方案。
更新资料
仅使用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>
<A-up>
类似eclipse中的用法。
如果我想与上面的一行交换一行,我通常会执行以下操作
ddkP
说明
ddp
移动一条线(删除线和粘贴当前行下)
4 dd
然后移动到2线,然后:2
是要粘贴的位置P
。
4dd
代替4 dd
吗?
dd<number>jp
当前行的<number> +1行向下移动。和dd<number>kp
移动当前行<编号>线组成。
假设光标在您要移动的线上。
上下:m
移动:
移动
:m +1
-下移1行
:m -2
-上移1行
(请注意,您可以根据需要向上或向下移动几行来用任何数字替换+1,即+2可以将其向下移动2行,-3可以将其向上移动2行)
移至特定行
:set number
-显示数字行(便于查看将其移动到的位置)
:m 3
-将行移动到第三行之后(将3替换为您想要的任何行)
移动多行:
V
(即Shift- V),然后上下移动课程练习器,以在VIM中选择多行
一旦选择击中:并运行上面的命令,m +1
等等
noremap <c-s-up> :m -2<CR> noremap <c-s-down> :m +1<CR>
向上移动一行: ddkP
向下移动一行: ddp
.
重复使用,可以将命令包装在函数中。
这为我工作:
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键的单个字符。要输入该字符,请C+v, Esc在Vim中使用(C+q, Esc在Windows上)。
[niv]noremap
是法线|插入|视觉模式的重映射。<CR>
是Carriage Return
(Enter
键)。
将以下内容添加到〜/ .vimrc文件中(确保您没有n,m的映射)
nmap n :m +1<CR>
nmap m :m -2<CR>
现在n
按键将向下移动一行,m
并将向上移动一行。
只需将此代码添加到.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
一个简单的解决方案是放入您的.vimrc
这些行:
nmap <C-UP> :m-2<CR>
nmap <C-DOWN> :m+1<CR>
我将以下内容放在.vimrc文件的末尾:
noremap H ddkkp
noremap N ddp
因此,现在“ H”和“ N”分别将当前行向上和向下移动。
这是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)(例如,<CAf>将是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
请注意,使用<<和>>也可以进行相同的操作,但是选择将会丢失,因此上述这些快捷方式允许多次缩进,并且由于保留了选择,因此仍然可以移动该块。
我的MacVim配置为使用Cmd-Shift-左/右切换选项卡,因此我使用Cmd-Alt-左/右。
这是MacVim的Tab切换(将.gvimrc和上面的其余内容一起放入):
:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>
当您在中命中命令:help move
时vim
,结果如下:
:[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
。
例如: 将编号为200的行移动到[200,>]的下方[100,120]之内 :100,120 m 200
。
这是适用于我的机器的解决方案 :运行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
对我来说,ddkkp
这样做(而不是ddkP
使用大写字母P,也可以使用)。
如果只移动一行,则: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
如果要在与特定搜索匹配的多行中执行此操作:
:g/Your query/ normal ddp
或:g/Your query/ m -1
:g/Your query/ normal ddp
或:g/Your query/ m +1