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

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

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

评论

如果您的问题是映射移动了光标,为什么不执行nnoremap d kddj和nnoremap D jddk?

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

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

@PhilippFrank或者我可以使用``来返回光标而不占用寄存器(不是我使用任何:))。

不,那是行不通的,k不是跳跃,所以您不能使用``。
返回

#1 楼

:-d


剪切当前行上方的行。


:-5d


剪切当前行上方的第5行(但将光标)。


:-5,-d


剪切当前行上方的5行。


:+,+5d


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

评论


但是,那仍然可以移动光标。

– PhilippFrank
15年8月5日在6:27

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

– romainl
2015年8月5日在7:51

谢谢!我一直在寻找这种“ vim方式”。我将与``结合使用以使光标返回到原来的位置。

–马丁·托斯(MartinTóth)
2015年8月5日在8:44



#2 楼

如果我们使用小的删除寄存器“-”,则可以在删除n行以上之后恢复光标位置。例如,d0dgk” -P删除1行以上并将光标恢复到原来的位置。


d0将光标中的字符删除到该行的第一个字符。由于0是互斥运动,因此光标下的字符不会被删除。并将删除的字符放入小的删除注册器“-..
dgk删除1行以上。这将保留当前行,因为gk不是逐行的和排他的。小的删除寄存器“-。

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

评论


不错的解决方案!尽管我认为您希望“ -P而不是” -p。后者使文本有些混乱。

–詹姆斯
16年6月21日在20:07

@DJMcMayhem你是对的。我纠正了答案。感谢您指出。

– MS.Kim
16年6月23日在5:48

#3 楼

编辑我不知道@Romainl在他的答案中建议的内置功能:当然应该首选-d+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选项。

–丰富
18 Mar 23 '18 at 15:07

#4 楼

如果不怕...跳跃,也许可以改善工作流程:)

示例:

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替换为Enter78gg,以直接跳转到该行号。

#5 楼

基于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吗?

–丰富
18年3月23日在15:11

#6 楼

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

:g/any part of the string/d


示例:

在命令模式下

:g/I want to delete/d


如果最初只想获取字符串列表:

:g/I want to delete/p


评论


我不太确定这如何回答提出的问题?

–马丁·图尔诺伊(Martin Tournoij)
17年2月23日在16:02