我有一个文件,说:
Program foo
Implicit None
integer::ab
End Program bar
现在,我希望最后一行中的“bar”为“foo”(即Program和End程序名称应该相同)。
我为此写了一个python
脚本,效果非常好:
#!/usr/bin/python
import fileinput
with open("i.f90") as inp:
for line in inp:
if line.startswith("Program"):
var = line.rsplit(' ', 1)[-1].strip()
if line.startswith("End Program"):
v2 = line.strip()
print v2
inp.close()
STR="End Program "+var
print STR
for line in fileinput.input("i.f90", inplace=True):
print line.replace(v2, STR).strip()
但是,正如我想从vim
称为ftplugin
,我把它放在vim的ftplugin中:
function! Edname()
python<<EOF
import vim
import fileinput
with open("i.f90") as inp:
for line in inp:
if line.startswith("Program"):
var = line.rsplit(' ', 1)[-1].strip()
if line.startswith("End Program"):
v2 = line.strip()
print v2
inp.close()
STR="End Program "+var
print STR
for line in fileinput.input("i.f90", inplace=True):
print line.replace(v2, STR).strip()
EOF
endfunction
正如您所看到的,我所做的唯一改变就是将其置于vim中。实际的python代码没有真正的变化。但在这种情况下,这是行不通的。它正确打印v2
和STR
,但文件中的行(或缓冲区)
没有得到更新。
有任何线索吗?
这主要与my earlier post有关。
但是现在,我找到了python
的部分解决方案,但是当从vim调用时它不起作用。
答案 0 :(得分:2)
如果这就是自动化的含义,则不需要Python。只需在ftplugin
中为您的文件类型添加类似内容:
function! s:FixName()
let [buf, l, c, off] = getpos('.')
call cursor([1, 1, 0])
let lnum = search('\v\c^Program\s+', 'cnW')
if !lnum
call cursor(l, c, off)
return
endif
let parts = matchlist(getline(lnum), '\v\c^Program\s+(\S*)\s*$')
if len(parts) < 2
call cursor(l, c, off)
return
endif
let lnum = search('\v\c^End\s+Program\s+', 'cnW')
call cursor(l, c, off)
if !lnum
return
endif
call setline(lnum, substitute(getline(lnum), '\v\c^End\s+Program\s+\zs.*', parts[1], ''))
endfunction
call s:FixName()
您也可以使用宏来实现,但这看起来并不像上面的功能那么聪明。 ;)像这样:
nnoremap <buffer> <silent> <C-p> /\v\c^Program\s+\zs<CR>"zy$/\v\c^End\s+Program\s+\zs<CR>D"zP