如何删除光标上方/下方的行,而不是当前行?


11

是否有删除当前行上方的一行(或n行)的命令?以上=当前不包括在内。

即,是否有dk不删除当前行的替代方法?与o/ Op/的P工作方式类似,但具有删除功能。

目前,我正在执行kdd,它将光标向上移动一行并删除它。我可以nnoremap <Leader>d kddnnoremap <Leader>D jdd-,但是有一个不移动光标的替代品似乎是一个更好的选择。有这样吗?


如果你的问题是,你的映射移动光标你为什么不这样做nnoremap <Leader>d kddj,并nnoremap <Leader>D jddk
statox

使用kddj或时jddk,不会保留列位置。我并不是说这是一个大问题,但这很烦人。为了进行记录,kddj将光标移动到原始位置下方1行。并且jdd-似乎是更好的选择,jddk因为至少我要返回第一个非空白字符。如果要删除的行下方的行为空,则将我留在行的开头。
马丁·托斯(MartinTóth)

在地图上使用makdd`a怎么样?设置一个标记,然后返回它。不过,您可能希望将其更改为较少使用的字符。
PhilippFrank

@PhilippFrank或者我可以使用``来返回游标而不占用寄存器(不是我使用任何:))。
马丁·托斯(MartinTóth)

不,那是行不通的,k不是跳跃,因此您不能使用``返回。
PhilippFrank

Answers:


30
:-d

剪切当前行上方的行。


:-5d

在当前行上方剪切第5行(但移动光标)。


:-5,-d

在当前行上方剪切5行。


:+,+5d

在当前行下方剪切5条线。


2
不过,那仍然可以移动光标。
PhilippFrank

1
您无法避免移动光标。最好的办法是将光标移回
romainl

谢谢!我一直在寻找这种“ vim方式”。我将与``结合使用以使光标返回到原来的位置。
马丁·托斯(MartinTóth)2015年

6

如果使用小的删除寄存器“-”,则可以在删除n行以上后恢复光标位置。

例如,d0dgk"-P删除1行以上并将光标恢复到原来的位置。

  1. d0从光标删除字符到行的第一个字符。由于0是排他性动作,因此不会删除光标下的字符。并将已删除的字符放入小的删除注册器“-”中。

  2. dgk删除1行以上。这将保留当前行,因为gk不是逐行和排他的。

  3. "-P 将小删除寄存器“-”中的文本放入。

这是一种骇客。但是,如果您要查找非ex命令,请考虑使用它。


不错的解决方案!虽然我想你想"-P"-p。后者使文本有些混乱。
詹姆斯

@DJMcMayhem你是对的。我纠正了答案。感谢您指出这一点。
金先生(M.Kim)2013年

5

编辑我不知道@Romainl在他的答案中建议的内置功能:当然应该首选-dand +d方法,因为它比向您的函数添加功能更简单.vimrc

也许向您添加类似的内容.vimrc可能就是您想要的:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

这些功能删除当前行下方或上方的行,并返回到删除前的位置。

对于该功能,DeleteOver()我们需要normal k在删除后上一行,因为删除会更改原本不会发生的行数DeleteUnder()

您也可以将其添加到您的 .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

创建调用函数的映射。


保存/恢复光标位置的另一种方法是取消设置/恢复该nostartofline选项。
Rich

2

如果不害怕...跳转,也许您会改善工作流程:)

例:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

你的行为(正常模式下,光标上_/I want Enter 5dd Ctrl-o。而已。

当然,如果您要删除整行,则romainl答案是最好的,并且您可以轻松计算其偏移量(例如,使用相对行号)。上面是“操作”的一种更通用的方法:使用算作跳转的内容去那里:这意味着您可以在修改文本后始终跳回去。

例如,如果您使用绝对行号,可以更换/I want Enter喜欢的东西78gg78G直接在该行号跳跃。


0

基于ms-kim解决方案,我开发了一种略有不同的变体,可以节省位置。

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS:我也已将此帖子用作参考。


您是说@statox而不是@ MS.Kim吗?
Rich

-1

如果要删除整个文件中的重复行,请执行以下操作:

:g/any part of the string/d

例:

在命令模式下

:g/I want to delete/d

如果您最初只想要一个字符串列表:

:g/I want to delete/p

3
我不确定这将如何回答所提问题?
Martin Tournoij
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.