2010-04-19 115 views
4

我手工编辑CNC G代码文本文件,需要一种方法来引用文件和刀具路径中的位置。我想修改文本文件中的每一行,使其以大写N字符开头,后面跟随每行连续增加十行的行号,然后是一个空格,然后是原始文本文件。我可以在vi中做这个吗?前面加字符N后跟行号

回答

0

有两种可能的方式做到这一点,而无需使用外部工具:宏或Vim脚本。在我看来,第一种方式有点麻烦(可能不如下面列出的解决方案有效)。

第二种方式可以这样来实现的(把代码放到你的.vimrc或来源它的其他方式):

function! NumberLines(format) range 
    let lfmt = (empty(a:format) ? 'N%04d' : a:format[0]) . ' %s' 
    for lnum in range(a:firstline, a:lastline) 
     call setline(lnum, printf(lfmt, lnum, getline(lnum))) 
    endfor 
endfunction 

command! -range=% -nargs=? NumberLines <line1>,<line2>call NumberLines([<f-args>]) 

NumberLines函数枚举在一个给定的范围,该文件的所有线路预规划到每一行其编号根据给定的printf格式(默认为'N%04d')。为了简化这个函数的使用,我在这里创建一个新的命令,它接受要处理的行的范围(默认为整个文件)和行号的可选参数格式。

0

作弊答案:

:%!awk '{print "N" NR "0", $0}' 
+0

他特别问了这是否可能在vi中,所以这个答案是无益的恕我直言。 – 2010-04-28 09:11:17

+0

@Airir Rachum * *在*中。 – hobbs 2010-04-28 20:32:47

+0

这不就是在调用外部命令吗?无论如何,对于我的误解感到抱歉,我希望不会有任何冒犯。 – 2010-04-28 23:09:15

0

下面的命令将前面加上 'N < 行号* 10 >' 到每一行。

 
:g/^/exe 'normal! 0iN' . (line('.')*10) . ' ' 
+0

它比脚本慢得多。例如,在我的系统中,该命令处理100,000行文件需要6秒,而上面列出的脚本在不到2秒的时间内(当然是在同一文件中)。 – 2010-04-20 01:02:24

0

你可以用这个做很容易在Vim的:

:%s/^/\=line(".")*10 . " "/ 

这种替换,使该行数十倍的表达式的结果,每一行的开头,后面加一个空格。

我还没有计时,但我怀疑它比其他Vim解决方案明显更快。

相关问题