如何删除直到(但不包括)该行的最后一个字符?

3
我想删除以许多括号结尾的序列,而不是计算括号的确切数量来执行d[count]f),我想删除到一行中倒数第二个字符之前。我尝试过dt$,但没有成功。编辑:最终,我们可以排除更多的字符吗?

你的问题不够清晰。你在这里所说的“句子”是指:h sentence中的那个吗?还是其他什么意思? - Matt
我的问题与 vim 中定义的文本对象无关。我想删除到行尾,但保留最后一个字符。最后一个字符不一定是特定的标点符号,例如句号、问号或感叹号。它甚至可能出现在我想要删除的行的部分中。我必须键入删除命令吗?还是有一种方法可以告诉 vim,在正常模式下我想删除 [count] 个字符 之前 的行? - Dimitri Lesnoff
那么你能否重新表述你的问题,以便最终清楚你在询问什么?它不是“移动”,也不是“句子”。据我现在所理解的,“删除直到(不包括)该行的最后一个字符”。 - Matt
序列比句子更清晰吗?我删除了两个句子,以便让其他观众更简洁地提出问题。我还添加了一个问题,因为这似乎是下一个合乎逻辑的问题。 - Dimitri Lesnoff
我想这样做应该可以。关于排除几个字符,我认为最好不要去操作一些复杂的文本对象,而是在可视化模式下进行操作,比如 v$hh...d 或者类似的方式。 - Matt
2个回答

5

所以,我认为真正的问题是“如何删除直到(但不包括)行末最后一个字符。”

答案是:dv$。详见:h exclusive:h o_v


1
我喜欢这个简单易懂,但是在 VS Code 中它不起作用 :( - Obay Abd-Algader

1

您可以使用标记或可视选择。例如,使用标记:

ma$d`a

命令中的分割:

ma Mark the current cursor position with mark a
$ Go to the last character in the line
d`a Delete back to the mark a

如果您需要在行末保留一些字符,请在 $ 后添加 Nh。例如:
ma$3hd`a

视觉选择:
v$3hx

定义一个带有一个必需参数的命令:

function! DelToEOL(n)
    execute 'normal v$' . string(a:n + 1) . 'hx'
endfunction

command -nargs=1 DelToEOL :call DelToEOL(<args>)

+ 1是必需的,因为视觉选择会选择当前字符,而这个字符应该被排除在外。


这对我来说看起来几乎没问题。我避免使用标记来删除我想要删除的内容,因为它可能会擦除先前的标记,而且我喜欢保留字符作为我代码部分的助记符别名(例如m表示main,通常是函数,方法或类名称的第一个字母,我通常会跳转到该位置)。像 v$hd 这样的可视选择对我来说已经足够了。我如何将其制成一个带有计数器的命令? - Dimitri Lesnoff
谢谢,这个很好用。非常抱歉由于标题不清晰导致误解了问题,带给你麻烦。我很遗憾不能接受多个答案来感谢你,因为在编辑之前您已经回答了我的问题。 - Dimitri Lesnoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接