在vim中,我经常需要删除或拉大文本块。
我可以计算文本的行数,然后输入类似50dd
删除50行的内容。
但这有点痛苦。如何删除此大块文本,而不必事先知道要删除多少行?
在vim中,我经常需要删除或拉大文本块。
我可以计算文本的行数,然后输入类似50dd
删除50行的内容。
但这有点痛苦。如何删除此大块文本,而不必事先知道要删除多少行?
Answers:
转到块的起始行,然后键入ma(标记“ a”,尽管您当然可以使用不同的字母,甚至多个字母用于不同的标记,但前提是您可以将它直接记在脑海中,每个字母代表一个标记) 。
然后转到最后一行,并输入d'a(删除以标记“ a”)或y'a(拉动以标记“ a”)(a)。
这将从当前行到已标记行(包括端)中的所有行删除/添加。
然后,您可以使用常规粘贴命令将其粘贴到其他位置,例如p或P。
它也与vi
和兼容,vim
以免您的环境没有幸免于后者。
(a)如果我不得不去别处寻找诸如复制粘贴要调用的函数的定义之类的东西,我也用它来保存我在文件中的位置。
我只是以相同的方式标记当前行ma,然后徘徊以查找所需的内容。
然后,一旦找到它并将其复制到寄存器中,我就输入'a回去标记“ a”,这是我预先保存的行,然后可以在其中粘贴。
v
我还是问自己是否真的需要它,还是有更好的运动方式?
在Vim中,使用视线模式:
对于删除大块文本,这比简单的可视模式更可取,因为您无需担心光标位于哪一列。
}
用来选择整个段落或)
句子。还有更多内容,您可以在:h object-motions
/something<CR>
也是一种非常有效的方法,可以到达选择块的末尾
j
以向下移动光标(第3步),而可以键入行号,然后G
选择直到该行。示例:V150Gd
您可以:set relativenumber
,所以您不必数数。;)
:set number
,然后用d35G删除,直到第35行
relativenumber
,但效果更好:-)
您可以在知道其结构的情况下轻松删除大块文本。
如果是段落,请使用:(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/
with set incsearch
是一个巧妙的组合,因为它可以交互式地确定您是否在正确的文本范围内进行操作,并帮助您知道何时停止键入搜索查询,以避免键入不必要的内容。
您可以使用动作和/或文本对象。例如,您可以使用删除从光标到下一个空白行的所有内容d}
。如果光标位于段落中,则可以使用dip
或删除该段落dap
。如果光标在HTML标记内,则可以使用dit
或删除它dat
。
这些良好的助记“ d elete 我 n面”和“ Ð elete 一圆”(段/标签/括号)。
我通常会
:<start>,<end>d
它将删除提供的开始和结束行号之间的每一行(包括给定的行)。
请注意,start
和end
都可以是绝对行号,样式或与另一个位置的偏移量。
另请参见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.
:set ruler
,然后转到文本的顶部和底部以查找start
和end
行号,然后执行:<start>,<end>d
:+12,+24d
<start>
和<end>
这一点。供参考,请参阅:h [range]
。因此,它实际上比您想象的要灵活得多。
如果您要处理的是定界的块(例如:代码或XML / HTML标记),则可以将光标定位在块的开头,并使用可视模式以及%
快速选择整个代码块,然后点击d
删除它们。
dap
删除一个段落,da(
,da{
,da[
,删除括号,括号或方括号delimeted块。对于html,有dat
,它删除标记,da'
并da"
删除字符串。还有dip
。di(
,etc变体,它将删除定界符内的所有内容,但保留定界符不变。或者,您可以使用vap
(resp vip
)选择所有(resp内部)段落。(还有va(
和vi(
。)此外,还有cap
和cip
(或ca(
和ci(
)要删除并进入插入模式(即“更改”)。并yap
致谢
该numbers.vim插件正是这个非常有用的。这是在每行之前加上行号的一种增强方法。就像'number'
和一样'relativenumber'
,都扮演了一个角色!
它在安装后默认情况下set number
处于启用状态,如果还没有,您还想添加到vimrc中,因为如果没有它,它的行为会很奇怪。
在正常模式下,它类似于:set relativenumber
:
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)。
如果我们随后切换到插入模式,它的行为就像number
总是通过显示绝对行号进行设置一样:
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'
还有更多选项和一些命令(请查看主页),但是默认设置适用于大多数人。
set number
,set relativenumber
然后autocmd InsertEnter * :set norelativenumber
和autocmd InsertLeave * :set relativenumber
您可以使用输入d加动作的常规步骤(如其他答案中所述)。EasyMotion插件提供了可以使用的新动作,可以快速轻松地解决您的问题。
假设您要从当前光标位置删除到屏幕上任何给定单词的末尾,则动作键将为<Leader>
<Leader>
e(类似于正常e
动作)。然后键入出现在相关单词末尾的突出显示的字母。还有一个直线运动,因此您可以使用删除当前行,直到相关的行<Leader>
<Leader>
j。
我的<Leader>
密码设置为,。因此,完整的命令是d<Leader>
<Leader>
e{突出显示的字母}。
来自:help easymotion
:
EasyMotion提供了一种在vim中使用某些动作的简单得多的方法。它采用
<number>
了的<number>
w或<number>
˚F{char}
突出显示所有可能的选择,并允许您按一个键直接跳转到目标。触发可用运动之一时,光标之前或之后的所有可见文本都将淡入淡出,并突出显示运动目标。
编辑:
EasyMotion的github存储库位于https://github.com/Lokaltog/vim-easymotion。
这对使用的EasyMotion人reddit的可能是一个有趣的阅读。
有一个简单的解决方案可以解决您的问题。
将光标放在要删除的文本块的开头,然后执行d50gg
。
这将从当前位置到文本的第50行删除所有行。
eq:如果光标在第46行,d50gg
将删除4行。
G
而不是gg,因为它也可以在vi中使用,并且:set number
对于查找您要转到的行的行号当然总是有用的。
使用视觉模式加亮线。
我更喜欢这种方法来删除代码块,因为与简单地使用可视模式相比,它必须删除整行,在可视模式下,您必须将光标置于右列以删除所需的内容。
我不喜欢一直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
这使您的任务变得容易:
V49jd
因为点击后V您可以看到目标线有多远。
从长远来看,这可能会令人讨厌(当启用/禁用relativenumber时,文本左右移动),但是到目前为止,我还是很喜欢的。
v<Esc>d50j
?
V
如果我知道将要进行逐行操作,那么我将首先开始,然后我可以将其保留d
到最后,以获得更大的信心。
move
到最后。然后删除到末尾与移到末尾没有什么不同。