Vimscript:正则表达式适用于:s但不适用于替换()

时间:2011-10-08 18:47:55

标签: regex variables vim

如果我将ls的输出粘贴到缓冲区中,则命令

:%s/.*\(\".*\"\).*/\1/

将输出减少到文件路径。想要在变量中实现这个结果,我做了

:redir => x|silent :ls|redir END
:let y = substitute(x, ".*\(\".*\"\).*", "\1", "g")

完全没有完成,y与x完全相同。我已经尝试了对该替换命令的无变化,只获得相同的结果或一堆错误消息。我该如何指定它?

3 个答案:

答案 0 :(得分:5)

你需要在引号中转义反斜杠。将\\(\\\"substitute()一起使用。

答案 1 :(得分:0)

你有两个错误:第一个是@Radu已经提到过,第二个是因为substitute()换行符匹配.,而:s则不是。:redir这就是为什么«只有最终的比赛才能交付»。我可以使用:lssubstitute()let buflist=map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), 'bufname(v:val)') 发布正确的解决方案,但建议如下:

:ls

如果您希望输出与bufname(v:val)几乎相同,请尝试将BufName(v:val)替换为function BufName(bnr) let bn=bufname(a:bnr) let bt=getbufvar(a:bnr, '&buftype') if empty(bn) return (empty(bt)?('[No Name]'):('[Scratch]')) elseif empty(bt) " This won't produce names like ../file, while :ls will " return fnamemodify(bn, ':~:.') elseif bt is# 'help' return fnamemodify(bn, ':t') else return bn endif endfunction

let bufliststr=join(buflist, "\n")

上面的命令会为您提供一个字符串列表。如果你想要一个换行符分隔的«list»,请使用

substitute()

如果您仍想使用:h /[],请参阅{{1}}。

答案 2 :(得分:0)

变量x包含

1 #    "~/Session.vim"                line 5
2      "~/.vimrc"                     line 34
3      ".vim/vscripts/makesess.vim"   line 4
4      "~/Documents/vimcht"           line 62
5      "~/.fluxbox/startup"           line 5
6      "~/Documents/Notes"            line 2604
7      "~/Documents/bashcht"          line 21
8 %a   "junk"                         line 10

通过我的阅读:h / [],特别是“...没有”_“或”\ n“该集合与行尾不匹配......”,那么

:let y = ""
:let y = substitute(x, '[.]*\("[.]*"\)[.]*', '\1', "g")

应该完成这项工作。但它交付了

"junk"

就像没有[]一样。 然后我尝试了

:let y = ""
:let y = substitute(x, '[^\n]*\("[^\n]*"\)[^\n]*', '\1', "g")

并得到完全相同的结果。

显然,vim内部不使用实际的换行符,既不用于变量也不用于寄存器。因此它将变量视为单行。这让我得到了这个解决方案

:let y = substitute(x, '[^"]*\("[^"]\+"\)[^"]*', ':tabe \1\n', 'g')

让y包含

:tabe "~/Session.vim"
:tabe "~/.vimrc"
:tabe ".vim/vscripts/makesess.vim"
:tabe "~/Documents/vimcht"
:tabe "~/.fluxbox/startup"
:tabe "~/Documents/Notes"
:tabe "~/Documents/bashcht"
:tabe "junk"

根据需要形成我的Session.vim文件