vim 高级编辑功能

Vim、Emacs配置和使用
回复
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

vim 高级编辑功能

#1

帖子 hjjdebug » 2010-11-29 17:25

有这个一个文件叫1.txt, 内容如下:
就是一个目录列表文件。

代码: 全选

1 Getting started with Windows Forms 3
1.1 Programming in C# 4
1.2 Adding controls 13
1.3 Loading files 18
1.4 Resizing forms 26
1.5 Recap 33
2 Getting started with Visual Studio .NET 34
2.1 Programming with Visual Studio .NET 35
2.2 Adding controls 43
2.3 Loading files 54
2.4 Resizing forms 61
2.5 Recap 65
....
其中 尾部数字为页号。
现在发现尾部页号小了15页, vim 有什么方法能够方便的修改。
正确的结果应该是这样的。

代码: 全选

1 Getting started with Windows Forms  18
1.1 Programming in C#  19
1.2 Adding controls  28
1.3 Loading files  33
1.4 Resizing forms  41
1.5 Recap  48
2 Getting started with Visual Studio .NET  49
2.1 Programming with Visual Studio .NET  50
2.2 Adding controls  58
2.3 Loading files  69
2.4 Resizing forms  76
2.5 Recap  80
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 高级编辑功能

#2

帖子 hjjdebug » 2010-11-29 17:33

这个问题我可以用perl 解决,但是我忽然想能不能直接用vim 解决。
方法1:用宏结合上函数匹配,计算。 (估计该方法可能最简单)
方法2:用脚本解决。

用perl 解决问题很简单,附上代码启发一下思路

代码: 全选

#!/usr/bin/perl -w
#
open FDR,"1.txt" || die "error $!";
while(<FDR>)
{
	if(m/(\d+)$/)
	{
		$num=$1+15;    # 对于匹配到的页号,我们加上15
		print "$` $num\n";
	}
}
print "end\n";
如果用vim 能直接解决问题,我就不用劳驾perl 了。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#3

帖子 lilydjwg » 2010-11-29 18:28

AWK 版

代码: 全选

%!awk '{ORS=""}{for(i=1;i<NF;i++){print $i" "}print ($NF+15)"\n"}'
Vimscript 版

代码: 全选

:for i in range(line('$'))
:  let s=split(getline(i))
:  let s[-1] += 15
:  call setline(i, join(s))
:endfor
Python 版

代码: 全选

import vim
b = vim.current.buffer
for i in range(len(b)):
  l = b[i].split()
  l[-1] = str(int(l[-1])+15)
  b[i] = ' '.join(l)
Vim 正则表达式版

代码: 全选

%s/\d\+$/\=submatch(0)+15
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#4

帖子 lilydjwg » 2010-11-29 18:33

最直观的是用 AWK 处理,其次用更麻烦的 Python/Vimscript/Perl/Ruby/Lua/Tcl/PHP/... 的脚本工具,最简洁的是 Vim 内建功能,最后一个想到。。。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#5

帖子 lilydjwg » 2010-11-29 21:34

晕,代码写多了最简洁直观的方法忘了——

代码: 全选

ggqqqqq$15<C-A>j@qq@q
<C-A> 当然是代表 Ctrl-A 了。
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 高级编辑功能

#6

帖子 hjjdebug » 2010-11-30 10:14

thanks lilydjwg , 强!
最简单的是记录宏。 ggqq$15<C-A>j@qq@q 使用了内建功能<C-A>
最实用的是 %s/\d\+$/\=submatch(0)+15/ 使用了内建功能s/// 并使用了=寄存器和submatch 函数
最通用的是vim script ,我欣赏。

至于其它语言,各有各的妙处。但都算外援了。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#7

帖子 lilydjwg » 2010-11-30 13:04

hjjdebug 写了:thanks lilydjwg , 强!
最简单的是记录宏。 ggqq$15<C-A>j@qq@q 使用了内建功能<C-A>
最实用的是 %s/\d\+$/\=submatch(0)+15/ 使用了内建功能s/// 并使用了=寄存器和submatch 函数
最通用的是vim script ,我欣赏。

至于其它语言,各有各的妙处。但都算外援了。
那个 \= 不算是寄存器吧,见 :help sub-replace-\=

觉得你有些瞧不起使用外部工具/其它脚本啊。
至少Lua是可以完全嵌入到Vim的(不需要任何额外的东西)
另外,对于一个Linux用户来说,会些简单的 sed awk grep uniq sort 之类的也是好的(不信你可以比较下用Vim和命令行工具处理1000+个文件的效率 http://www.vimer.cn/2010/01/%E6%93%8D%E ... s-vim.html
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 高级编辑功能

#8

帖子 hjjdebug » 2010-11-30 13:55

"= 不是真正的寄存器,它并不储存东西,仅仅代表“计算”的意思,见help "=
与help sub-replace-\= 解释似乎并不矛盾。

另外,我只想用尽可能简单的办法搞定一件事情,决无轻视外部工具及脚本。
例如 sed awk grep uniq sort, 前三者号称文本处理三剑客,后两者是帮凶。 我也常用。

lua 倒是没有使用过, 有机会再补补。 说实话,跟老兄讲话还是获益不浅!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: vim 高级编辑功能

#9

帖子 eexpress » 2010-11-30 14:09

nnnnd vim都研究透彻了。
这个呸服。
● 鸣学
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#10

帖子 lilydjwg » 2010-11-30 16:18

eexpress 写了:nnnnd vim都研究透彻了。
这个服。
:em20 .....
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 高级编辑功能

#11

帖子 hjjdebug » 2010-11-30 18:12

eexpress 写了:nnnnd vim都研究透彻了。
这个呸服。
vim 是个大百货店,想要什么就拿点什么。
想什么都要,买不起啊! 得花多少时间啊。
:em03
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 高级编辑功能

#12

帖子 hjjdebug » 2010-11-30 19:03

hjjdebug 写了: vim 是个大百货店,想要什么就拿点什么。
想什么都要,买不起啊! 得花多少时间啊。
如果掌握了它的script , 就可以运行自如了。
如果还不满足,就要研究它的代码了。
lilydjwg 老兄可能快接近目标了!
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 高级编辑功能

#13

帖子 lilydjwg » 2010-11-30 19:15

hjjdebug 写了: 如果掌握了它的script , 就可以运行自如了。
如果还不满足,就要研究它的代码了。
lilydjwg 老兄可能快接近目标了!
我倒是想研究下它的代码,7.3 开 ruby perl 和 largefile 支持(默认开启)后,在调用 ruby 时总是崩溃,而且函数栈里竟然能看到毫无关系的 Perl 调用。。。
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

Re: vim 高级编辑功能

#14

帖子 gzbao9999 » 2010-12-01 9:47

代码: 全选

cat 1.txt |grep -Po '.*\ '>head1.txt;
cat 1.txt |grep -Po '\d+$'|while read i;do echo $[i+15];done>tail1.txt;
paste -d '' head1.txt tail1.txt >1.txt;
:em06 看了你们的真是简洁的牛鼻
气血鼓荡,身体发胀,偶飘上头,三时舒畅
回复