在vim中,我经常需要删除或拉大文本块。

我可以计算文本行并输入类似50dd的内容来删除50行。 >但这有点痛苦。如何删除此大块文本,而不必事先知道要删除多少行?

评论

你怎么知道终点在哪里?如果可以描述目的,则可以删除到这一点。如果您能描述如何继续前进。然后删除到末尾与移到末尾没有什么不同。

@Loki,移至末尾通常只是使用下一页和箭头键,直到到达那里为止。它可以是第一行或第十行,也可以是第一个闭合括号。底线是,它变化很大。

还要检查以下答案:stackoverflow.com/a/16407391/164835

#1 楼

转到块的起始行,然后键入ma(标记“ a”,尽管您当然可以使用不同的字母,甚至多个字母用于不同的标记,但前提是您可以将其直接记在脑海中,每个字母代表)。

然后转到最后一行并输入d'a(删除以标记“ a”)或y'a(拖动以标记“ a”)(a)。

这将从当前行到已标记的行(包括两端)中删除/添加所有行。 />
还与vivim兼容,以免您的环境不适合后者。


(a)我也用它来如果我不得不去别处寻找诸如复制粘贴要调用的函数的定义之类的内容,则将其保存在文件中。妈,然后漫步去寻找您想要的东西。

然后,一旦我找到并复制到寄存器后,我只需输入'a即可返回标记为“ a”,这是我预先保存的行,然后可以在其中粘贴。

评论


还可以为此使用可视模式,对吗?

– jmc
15年2月19日在8:14

这是一种方式,jmc,但我不确定标准vi是否具有可视模式。

–user579
15年2月19日在8:52

自从大约一年前我从视觉选择转向标记和相对行号以来,我发现vi motion命令比视觉选择要快捷,高效。即使每次按v键都比较容易,但我还是问自己是否真的需要它,还是有更好的运动方式?

– Sukima
2015年2月19日在14:21

是的,以同样有趣的方式,@ Sukima,即使在GUI中,使用鼠标也越少,我的效率就会越高。如果我能继续使用键盘,我会发现自己会更快。

–user579
15年2月19日在21:14

如果您要编辑的行真的很长,那么反引号版本也可能会派上用场(这是指行内的位置,而不是整行)。

–msouth
2015年2月20日在7:31



#2 楼

在Vim中,使用可视行模式:


将光标置于文本/代码块的顶行以删除
按V(大写的“ V”: + v)
将光标向下移动到文本/代码块的底部以删除
按d


要删除大块文本,首选通过简单的可视模式,因为您无需担心光标位于哪一列。

评论


在步骤3中,可以使用对象运动来更快地移动。例如,可以使用}选择整个段落,或使用)来选择句子。还有更多内容,您可以在:h object-motions中阅读它们

–mxlian
15年5月14日在18:55

另外,使用/ something 搜索子字符串是一种非常有效的方法,可以到达选择块的末尾

–mxlian
15年5月14日在18:59



这是我的首选方法。但是,也可以不必重复按j向下移动光标(第3步),而可以键入行号,然后键入G以选择直到该行。示例:V150Gd

–Ranhiru Jude Cooray
16 Mar 5 '16 at 16:08



#3 楼

您可以很容易地知道它的结构来删除大块文本。

如果是段落,请使用:d {(例如,您可以在段落前面加上前缀)

如果是段落的括号内的代码,请使用:d%

如果文本出现到文件末尾,请使用:dG

如果您知道它的结尾,请使用:d /并键入结束文字,然后按Enter键(您也可以使用正则表达式,因此可能性无穷)。

或者使用可视模式(V)并使用运动键快速选择文本(例如,按{}和删除它(d)。

或按照Lie Ryan的建议,使用d/search-string/e从当前光标删除文本到搜索的字符串。

有关更多信息,请参见::help d:help motion

评论


还有d / search-string / e可从当前光标删除到搜索字符串的末尾,包括搜索字符串本身,而c / search-query可在删除后进入插入模式。将d /与set incsearch一起使用是一种巧妙的组合,因为它可以交互式地确定您是否在正确的文本范围内进行操作,并帮助您知道何时停止键入搜索查询以避免输入过多的内容。

– Lie Ryan
15年2月20日在15:17

我还发现d(外部)或i(内部)和对象说明符非常有用。对象,例如w表示单词,p表示段落,(或b表示(...),[表示[...],{或B表示{...})等。

– Shahbaz
2015年2月23日在15:13



请注意,d%适用于代码中的块注释。

–peter.babic
20 Aug 26'8:06



#4 楼

您可以:set relativenumber,所以您不必计数。 ;)

评论


或:set号,然后使用d35G删除直到第35行。

–Random832
15年2月20日在16:22

Deliciousmanager的答案中推荐使用numbers.vim插件,例如relativenumber,但效果更好:-)

–马丁·图尔诺伊(Martin Tournoij)
2015年2月25日在12:54

#5 楼

您可以使用动作和/或文本对象。例如,您可以使用d}删除从光标到下一个空白行的所有内容。如果光标位于段落中,则可以使用dipdap删除该段落。如果光标位于HTML标记内,则可以使用ditdat删除它。 />

#6 楼

我通常会做

:<start>,<end>d


,这将删除提供的开始和结束行号之间的每一行(包括给定的行)。 startend都可以是绝对行号,图案或到另一个位置的偏移量。

另请参阅doubleDown关于查看Vim范围文档的评论,其中有一些有用的提示。

示例:

假设您拥有以下文件:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.


然后,如果要使用以下命令,请使用命令:2,3d:/fox/,/over/d:/quick/+1,/lazy/-1:+1,+2d在第一行上,或者如果在第三行上,则以:-1,.d结尾,结果是:

1. The quick brown
4. lazy dog.


评论


但这意味着您仍然需要数行吗?还是我误会了你的答案?

–马丁·图尔诺伊(Martin Tournoij)
2015年2月19日在10:51



您不需要计算行数,但是您确实需要知道行号。

– jmc
15年2月19日在10:55

首先执行:set标尺,然后转到文本的顶部和底部以查找开始和结束行号,然后执行: d

–roblogic
2015年2月20日在6:46



您也可以使用相对行号:+ 12,+ 24d

–rpattabi
15年3月22日在6:39

实际上,您可以为此使用一对行号,一对模式或混合对。有关参考,请参见:h [range]。因此,它实际上比您想象的要灵活得多。

– doubleDown
15-10-27在12:21

#7 楼

如果您要处理的是定界的块(例如,代码或XML / HTML标记),则可以将光标置于该块的开头,并使用可视模式和%快速选择整个代码块,点击d将其删除。

评论


另外,您可以使用dap删除段落,da(,da {,da [,删除由括号,花括号或方括号组成的块。对于html,有dat可以删除标签,da'和da删除字符串。还有dip,di(等)变体,它们将删除定界符内的所有内容,但保留定界符完整。或者,您可以使用vap(resp vip)选择所有(resp内部)段落。因此存在va(和vi(。)。此外,还有cap和cip(或ca(和ci())要删除并进入插入模式(即“更改”)。

– jmc
15年2月19日在8:12

我认为他较早的注释中描述的某些绑定@jmc来自Tim Pope的Surround.vim插件。我建议安装这个很棒的插件,但这确实意味着这些绑定不是默认vim安装的一部分。

–海因
17-10-2在18:33

#8 楼

除了所有其他好的建议,我还要添加d + Shift + L来删除从当前光标位置到屏幕上最后一个可见行的所有内容。重复执行该命令会使您相对较慢。

#9 楼

numbers.vim插件对此非常有用。这是在每行之前加上行号的一种增强方法。就像'number''relativenumber'一样,它们都合而为一!

在正常模式下,它看起来与set number相似:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'


它显示相对行号,除了光标所在的行,它显示绝对行号(在这种情况下为7)。

如果然后切换到插入模式,它将表现为:set relativenumber始终显示绝对行号:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'


还有更多选项和一些命令(请检查主页),但默认设置适用于大多数人。

评论


起初我以为这个答案有点离题,但是后来我安装了插件,不得不说这对我来说是改变游戏规则的人。我过去经常手动进行交换,而额外的思维步骤意味着我回避使用那些动作。谢谢!

– Sukima
15年2月19日在15:16

这听起来像一个InsertEnter / InsertLeave autocmd可以切换相对行号的功能。我想念什么吗?

–本
15年2月27日在1:16

我参加聚会的时间很晚,但是@Ben是对的,这只是几个自动命令行。例如,在我的vimrc中,我设置了编号,设置了relativenumber然后设置了autocmd InsertEnter *:set norelativenumber和autocmd InsertLeave *:set relativenumber

– B层
18年4月17日在3:53



#10 楼

另一种方法是,如果您尝试删除为特定的模式,则只需键入d / delim Enter。

#11 楼

您可以使用输入d并加上运动的常规过程(如其他答案中所述)。 EasyMotion插件提供了可以使用的新动作,可以快速轻松地解决您的问题。

如果要从当前光标位置删除到键盘上任何给定单词的末尾,请执行以下操作:屏幕上,运动键为<Leader> q 4312079q e(类似于正常的<Leader>运动)。然后键入出现在相关单词末尾的突出显示的字母。还有一个换行动作,因此您可以使用e <Leader> j将当前行删除到有问题的行。

我将<Leader>键设置为。因此,完整的命令是d <Leader> <Leader> e {突出显示的字母}。

来自<Leader>


EasyMotion提供了一种更简单的使用某些方法的方法vim中的动作。通过突出显示所有可能的
选择并允许您按一个键直接跳到目标,从而从:help easymotion w或<number> f中删除<number>

触发可用的动作,淡出光标之前或之后的所有可见文本,并突出显示动作目标。


编辑:

EasyMotion的github资料库位于https://github.com/Lokaltog/vim-easymotion。

有关人们使用easymotion的reddit可能很有趣。

#12 楼

有一个简单的解决方案可以解决您的问题。

将光标置于要删除的文本块的开头,然后执行d50gg

这将从当前位置到文本的第50行删除所有行。

eq:如果光标位于第46行,则d50gg将删除4行。

评论


我建议使用G而不是gg,因为它在vi中也可以使用,当然:set number对于查找您要转到的行的行号总是很有用的。

–Random832
2015年2月20日在16:24

这个问题的全部要点是,您不知道要删除多少行。

– 200_success
15年2月20日在17:30

200_success,您不必知道要用我发布的答案删除多少行。所有您需要知道的是“您想删除到哪一行”

– Geee
15年2月20日在18:15

#13 楼

将视觉模式与突出显示的行一起使用。


将光标置于文本/代码块的顶行以删除
按Shift + v
移动光标向下移至文本/代码块的底部以删除
按d


我更喜欢这种方法来删除代码块,因为与仅使用可视化代码相比,它会删除整行模式,您必须将光标放在右列中才能删除所需的内容。

评论


您基本上可以通过@ 200_success重复答案。

–马丁·施罗德(MartinSchröder)
15年2月22日,0:55

#14 楼

我不喜欢一直使用relativenumber,所以我将Vim配置为仅在处于可视模式时才启用它:容易:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END


因为打到V后您可以看到目标线有多远。 (启用/禁用relativenumber时,文本左右移动),但到目前为止,我还是很喜欢它。

评论


我认为您使用v d50j?

–马丁·图尔诺伊(Martin Tournoij)
15年2月26日在11:59

谢谢,我确实写错了。实际上,如果我知道要进行逐行运算,那么我将从V开始,然后我可以将d保留到最后,以获得更大的信心。

– joeytwiddle
2015年2月26日在16:18



我的回答似乎是一个穷人对number.vim插件的近似。 ;-)

– joeytwiddle
2015年3月1日,7:57

#15 楼

vi最适合我的是什么:



:set number查看行号,直到我要删除的地方;

+1289 idle 
+1289 idle 
+1290 # <- I want to delete until here
+1291 if [[ ! -z "$SFIN" ]]


返回删除必须开始的行
在正常模式下从当前行使用删除> d1290G



#16 楼

您也可以搜索您的文本。例如在要删除的地方开始光标。然后,进入可视模式:
Shift + V

现在,搜索要结束的短语。例如,如果要在下一个括号处结束:
/)

按Enter,相应的部分将突出显示。您可以通过点击n循环浏览搜索结果。突出显示相关部分后,您可以立即轻松删除选择:
d