vim script高手进来帮忙

Vim、Emacs配置和使用
回复
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

vim script高手进来帮忙

#1

帖子 acer4740 » 2011-12-02 23:54

代码: 全选

answer	
cookietime	2592000
formhash	b0985d1d
loginfield	username
password	11111111
questionid	 0
username	ffffffff

写一个vim函数,当选中这些行,执行这个函数后,这些行变成一个python字典
空白左边的是键,右面是键值

比如{"cookietime":"2592000","answer":""}
右边没有的键值是空白字符串

高手帮忙啊 :em01
头像
zkwlx
帖子: 988
注册时间: 2009-10-09 12:54
系统: debian
来自: 北京某胡同

Re: vim script高手进来帮忙

#2

帖子 zkwlx » 2011-12-03 0:27

acer4740 写了:

代码: 全选

answer	
cookietime	2592000
formhash	b0985d1d
loginfield	username
password	11111111
questionid	 0
username	ffffffff

写一个vim函数,当选中这些行,执行这个函数后,这些行变成一个python字典
空白左边的是键,右面是键值

比如{"cookietime":"2592000","answer":""}
右边没有的键值是空白字符串

高手帮忙啊 :em01
如果你是一次性用的话,还不如用python解析这个文本呢,本人不会vim脚本,帮顶 :em11
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim script高手进来帮忙

#3

帖子 fanhe » 2011-12-03 1:13

[vim]function! g:Fun()
let nStart = line("'<")
let nEnd = line("'>")
let lLines = getline(nStart, nEnd)

let dResult = {}
for sLine in lLines
let li = split(sLine)
let sKey = get(li, 0, '')
let sValue = get(li, 1, '')
let dResult[sKey] = sValue
endfor

return string(dResult)
endfunc
[/vim]

先选择,退出,然后 :echo g:Fun()
返回类似字典的字符串,如果想要字典,就把 return 行改为 return dResult
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

Re: vim script高手进来帮忙

#4

帖子 acer4740 » 2011-12-03 10:32

fanhe 写了:[vim]function! g:Fun()
let nStart = line("'<")
let nEnd = line("'>")
let lLines = getline(nStart, nEnd)

let dResult = {}
for sLine in lLines
let li = split(sLine)
let sKey = get(li, 0, '')
let sValue = get(li, 1, '')
let dResult[sKey] = sValue
endfor

return string(dResult)
endfunc
[/vim]

先选择,退出,然后 :echo g:Fun()
返回类似字典的字符串,如果想要字典,就把 return 行改为 return dResult

嗯,谢谢,不错,我用替换命令写了一个,
再试试这个
头像
acer4740
帖子: 1405
注册时间: 2010-09-13 19:04
来自: 0xFF00EE

Re: vim script高手进来帮忙

#5

帖子 acer4740 » 2011-12-03 11:30

代码: 全选

function Cont() range
    execute a:firstline . "," . a:lastline . 's/^\s*/"/'
    execute a:firstline . "," . a:lastline . 's/\s\+\|$/":"/'
    execute a:firstline . "," . a:lastline . 's/$/",\\/'
    execute a:firstline . 's/^/{/'
    execute a:lastline . 's/,\\$/}/'
    unsilent echo (a:lastline - a:firstline +1) . " item in dict"
endfunction
command -range TODict :silent <line1>,<line2>call Cont()
头像
rykka
帖子: 59
注册时间: 2011-06-24 9:14

Re: vim script高手进来帮忙

#6

帖子 rykka » 2011-12-04 1:52

如果只要文本转化的话

代码: 全选

vmap <leader>vs :'<,'>s/\(\S*\)\s*\(\S*\)/"\1":"\2",/<CR>\|:normal! `<I{<esc>`>A}<esc>
回复