假设我正在编辑以下文档(* = 光标):
Lions
Tigers
Kittens
Puppies
*
Humans
我可以使用什么序列来删除周围的空白,以便只剩下:
Lions
Tigers
Kittens
Puppies
*
Humans
注意:我正在寻找一个处理任意数量空行的答案,而不仅是这种情况的答案。
编辑1:行号未知,我只想影响我的光标所在的范围。
编辑2:编辑示例以显示我需要保留边缘上的前导空格
谢谢
假设我正在编辑以下文档(* = 光标):
Lions
Tigers
Kittens
Puppies
*
Humans
我可以使用什么序列来删除周围的空白,以便只剩下:
Lions
Tigers
Kittens
Puppies
*
Humans
注意:我正在寻找一个处理任意数量空行的答案,而不仅是这种情况的答案。
编辑1:行号未知,我只想影响我的光标所在的范围。
编辑2:编辑示例以显示我需要保留边缘上的前导空格
谢谢
简单易懂。在普通模式下,dipO<Esc>
即可实现。
解释:
dip
在一个空白行上删除它及其相邻的所有空白行。O<Esc>
打开一个新的空行,然后返回普通模式。更简洁的方式是,如 @Lorkenpeist 所建议的,cip<Esc>
可将这两个步骤合并为一步。
vipJ
就可以工作,并且它避免了进入插入模式。 - Peter Rinckercip<Esc>
- Lorkenpeistcip<esc>
可以用 .
重复!尽管如果我有一个完整的文件需要挤压空格,我仍然会使用 :v/./,//-j
。 - Peter Rincker:join
命令与范围一起使用::?.?+1,/./-1join!
说明:
[range]join!
将连接一组 [range]
的行。 !
表示不插入任何额外的空格。?.?+1
+1
中的 1
可以被假定,因此可以缩写为 ?.?+
/./-1
1
可以被假定,因此为 /./-
//-
:join
可以简写为 :j
最终缩短的命令:
:?.?+,//-j!
:h :j
:h [range]
:h :g
:h :v
c/dip
зҡ„зӯ”жЎҲжӣҙйҖӮеҗҲиҝҷдёӘй—®йўҳпјҢдҪҶдҪ еҗ‘еҗҺжҗңзҙўзҡ„?.?
д№ҹеҫҲеҘҪгҖӮжҲ‘жІЎжғіеҲ°гҖӮ+1 - Kent简短回答: ()V)kc<esc>
在正常模式下,如果您键入()
,光标将移动到第一行空行。 (
将光标移动到上一个非空白行块的开头,)
将光标移动到结束位置(具体而言,是在该块后面的第一行空行)。然后,简单的d)
将删除所有文本,直到下一个非空白行的开头。因此,完整的序列是()d)
。
编辑:你是对的,那会删除下一行非空白字符开始的空格。而不是d)
尝试使用V)kd
。 V
将您置于可视化行模式中,)
跳转到第一行非空白行(跳过行开头的空格),k
将光标向上移动一行。此时,您已选择所有空行,因此d
删除了选择。
最后,键入大写字母 O(capital O)
以创建一个新的空行来替换您删除的行。或者,用c<Escape>
替换dO<Escape>
可以减少一个按键,因此整个序列将是()V)kc<Esc>
。
kkd
会在只有一行空白的情况下删除非空格字符。 - Lorkenpeist这可能不是你想听到的答案,但我会利用范围。查看第一个空行的行号(例如为55),以及倒数第二个空行的行号(也许是67)。然后只需执行:55,67d
。
或者,也许你只想在整个文件中有一个空行。在这种情况下,你可以匹配任何出现一行或多行空行的情况,并将其替换为一个空行。
:%s/\(^$\n\)\+/\r/
如果您只想使用普通模式,可以搜索最后一行上的任何内容。例如,
/.<Enter>kkVNjd
function! DelWrapLines()
while match(getline('.'),'^\s*$')>=0
exe 'normal kJ'
endwhile
exe 'silent +|+,/./-1d|noh'
exe 'normal k'
endfunction
:call DelWrapLines()
。我知道这个问题已经解决了,但是我刚在“sed & awk, 2nd Ed.”(O'Reilly)中找到了一个很好的解决方案,我觉得值得分享。它完全不使用vim,而是使用sed。这个脚本将替换所有一个或多个空行的实例(假设这些行中没有空格),并用一个单独的空行代替。在命令行上:
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile
注意,如果您尝试直接将其写入myfile
,它将删除文件的所有内容,这显然不是您想要的!在将输出写入tempfile
后,您只需执行mv tempfile myfile
,就可以完成了!所有多个空行的实例都将替换为单个空行。
更好的方法:
cat -s myfile > temp
mv temp myfile
猫很棒,对吧?
最好的方法:
如果你想在vim中完成它,你可以使用vim方便的特性,在vim内执行shell命令替换多个空行实例为单个空行。
:%!cat -s
只需要这样做,你的整个文件就会被重新格式化得很好!