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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 - Fatal编程技术网

如何删除vim中当前行下方的行?

如何删除vim中当前行下方的行?,vim,Vim,是否有命令删除紧靠当前行下方的一行(或几行)? 目前我的工作是: jdd,然后。根据需要重复。 是否有一个命令可以将所有这些结合起来 更新:我之所以希望有这样的命令,是因为我不想离开当前位置,但可以删除下面的行。只是为了好玩,你可以定义一个小函数,它可以 与您描述的完全相同:删除下一行n 当前行并恢复光标的初始位置 function! DeleteNextLines(n, reg) let l = line('.') let m = min([a:n, line('$')-l])

是否有命令删除紧靠当前行下方的一行(或几行)? 目前我的工作是: jdd,然后。根据需要重复。 是否有一个命令可以将所有这些结合起来


更新:我之所以希望有这样的命令,是因为我不想离开当前位置,但可以删除下面的行。

只是为了好玩,你可以定义一个小函数,它可以 与您描述的完全相同:删除下一行
n
当前行并恢复光标的初始位置

function! DeleteNextLines(n, reg)
    let l = line('.')
    let m = min([a:n, line('$')-l])
    if m > 0
        let c = col('.')
        exe '+,+'.m 'd' a:reg
        call cursor(l, c)
    endif
endfunction
此外,还可以定义接受行数的命令 删除(一个,如果省略)和用作 可选参数(与
:delete
命令类似)

:命令-范围=1-寄存器-条D调用DeleteNextLines(,)
此外,您可以定义一个映射来触发上述
:D
命令,如有必要。

您可以输入要删除的行数:j 20 dd k.

这将删除当前行以下的所有行:

jdG

不幸的是,删除后会将光标移到当前行的开头。

这是标记作业

尝试
maj20dd`a

ma
设置特定于文件的标记'a',
j20dd
执行您想要的删除操作(本例中为20行),并且
`a
将您恢复到标记的位置(行和列)


显然,在返回标记之前,此模式可以扩展为执行任何您想要的操作。如果您使用
mA
(或任何其他大写字母),则标记在文件中实际上是唯一的,因此您甚至可以在返回之前在其他位置进行编辑。如果使用频率很高,可以按照上面的建议将其设置为宏。

delete ex命令会很好地工作

:+,$d
这将删除从当前+1到结尾($)的所有行

要删除接下来的两行,以下范围将起作用,
+1、+2
或速记
+,+2

:+,+2d
如@ib所述,
:delete
:d
命令将光标移动到已删除文本旁边的行的开头。(即使使用
nopartofline
set)。为了克服这个问题,我们可以发出
`
normalmode命令
`
将跳回最后一次跳转之前的确切位置,在这种情况下,使用
:d
命令。我们的司令部现在在

:+,+2输入``

或者作为一个前指挥官

:+,+2d|norm! ``
为了简化此过程,我们将所有这些都封装在一个命令中:

command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``
此命令还可以执行
{reg}
操作,如
:delete
:yank
操作。因此,将接下来的4行删除到寄存器
a
将是:

:4D a
更多信息

:h :d
:h :command
:h :command-register
:h :command-count
:h ``

其他解决方案提供了丰富的信息,但我觉得使用宏来实现这一点更简单:

qq
(开始录制)

jddk
(向下,删除该行,然后再向上返回-即您想做的事情)

q
(结束录制)

现在您可以执行
@q
来执行此操作,将光标保持在当前位置。您还可以执行类似于
5@q
删除光标下方的5行


最后,如果您多次重复该操作,您可以在第一次运行
@q
后键入
@
(这会重复上次使用的宏-在本例中为
q

好的,只需使用xxdd命令即可。大多数时候,我知道(至少有一个想法)我正在编辑的脚本的大小。因此,下面的命令通常就足够了:

  • 99dd
  • 999dd以从光标位置开始删除999line
  • 9999dd
  • 99999 DD用于非常长的脚本;)
dG应该可以工作。

这意味着从当前光标删除所有行,直到文件结束。

Final
k
将光标移到初始行上方。此外,由于
dd
@ib:Not在我的测试中,它不会丢失光标列位置。你真的试过吗?请注意初始的j。很抱歉,我的第一点是错误的(当我尝试执行该命令时,我没有注意到我指定的计数('20',在您的示例中)大于缓冲区结束前的行数)。但第二个问题仍然存在:光标的列位置在
dd
之后发生变化(我相信是删除行旁边行的第一个非空字符)。@ib:是的,我同意列位置发生变化。请对您的答案进行无关紧要的编辑,以便我可以对其进行投票。我认为你的答案根本不应该是一个否定的等级。并且会删除每一行,直到缓冲区结束。我误读了原来的问题,对不起。我认为OP想要删除当前行下面的所有行。更改了我的帖子。请注意,这是一个相当简单的解决方案,可以“开箱即用”,并且可以推广到其他命令(例如,
:+1,+5s!a!b!g
将在光标后的4行上用b替换a)。有关更多示例,请参阅:help命令范围。如果不移动光标,这个简单的解决方案将非常好。至少,该命令应该看起来像
:+,$d| norm``。顺便说一句,如问题中所述,问题的作者希望删除当前行下方的几行,不一定一直到文件末尾。@ib:如果对范围进行更详细的解释,答案会更好吗?也许
设置sol
?如何使用
`
标记?@Peter:可能吧。顺便说一句,单独关闭
sol
并不能解决问题:当一个人使用
:+,+3d
删除三行时,光标会移到被删除行的下一行。@ib:我已将您的建议纳入我的答案中。感谢您的反馈。例如,要映射到逗号,请按“,”键,然后按d键)插入以下行(输入ab后
:4D a
:h :d
:h :command
:h :command-register
:h :command-count
:h ``