即dk是否有不删除当前行的替代方法?与o / O和p / P的工作方式类似,但具有删除功能。
当前,我正在执行kdd,它将光标向上移动一行并将其删除。我可以做
nnoremap <Leader>d kdd
和nnoremap <Leader>D jdd-
,但是有一个不移动光标的替代品似乎是一个更好的选择。有吗?#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
替换为Enter
或78gg
,以直接跳转到该行号。#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
评论
如果您的问题是映射移动了光标,为什么不执行nnoremap使用kddj或jddk都不会保留列位置。我并不是说这是一个大问题,但这很烦人。为了进行记录,kddj将光标移动到原始位置下方1行。而且jdd-似乎是jddk的更好替代方案,因为至少我要返回第一个非空白字符。如果要删除的行下方的行为空,则我留在行的开头。
在地图上使用makdd`a怎么样?设置一个标记,然后返回它。不过,您可能想将其更改为较少使用的字符。
@PhilippFrank或者我可以使用``来返回光标而不占用寄存器(不是我使用任何:))。
不,那是行不通的,k不是跳跃,所以您不能使用``。
返回