如果我将ls的输出粘贴到缓冲区中,则命令
:%s/.*\(\".*\"\).*/\1/
将输出减少到文件路径。想要在变量中实现这个结果,我做了
:redir => x|silent :ls|redir END
:let y = substitute(x, ".*\(\".*\"\).*", "\1", "g")
完全没有完成,y与x完全相同。我已经尝试了对该替换命令的无变化,只获得相同的结果或一堆错误消息。我该如何指定它?
答案 0 :(得分:5)
你需要在引号中转义反斜杠。将\\(
和\\\"
与substitute()
一起使用。
答案 1 :(得分:0)
你有两个错误:第一个是@Radu已经提到过,第二个是因为substitute()
换行符匹配.
,而:s
则不是。:redir
这就是为什么«只有最终的比赛才能交付»。我可以使用:ls
,substitute()
和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文件