从 vim globpath 获得的 fnamemodify 文件名列表在 while 循环中给出错误

fnamemodify filename list obtained from vim globpath giving error inside while loop

我正在尝试从 viml 中的 globpath() 获取根文件名。 使用之前的 satting dir 和 fnm 名称,我有:

  echo dir
  echo fnm
  echo fnamemodify(globpath(dir, fnm), ':r:t')

这是给予

/Devel/IO_EOS/objs
*.mod
Devel/IO_EOS/objs/constants.mod
Devel/IO_EOS/objs/mpublic.mod
Devel/IO_EOS/objs/mutil

即扩展名仅从最后一个文件(mutil,也被命名为 mutil.mod

因此,我尝试将文件拆分为列表并将扩展名和路径设为:

  let files = filter(split(globpath(dir, fnm), '\n'), '!isdirectory(v:val)')
  echo files len(files)
  let c = 1
  while c <= len(files))
    files[c] = fnamemodify(files[c]), ':r:t')
    let c += 1
  endwhile

现在,这些文件是那些文件的列表,并且正确地作为一个列表,暂时不起作用。 引用的错误是:

list index out of range: 3 
invalid arguments for function fnamemodify(files[c]), ':r:t')
invalid expression: fnamemodify(files[c]), ':r:t')

请帮忙。 注意:标题变得有点复杂,因为不知何故 SO 对较短的标题不满意。抱歉。

在 Vimscript 中(与在大多数其他编程语言中一样),列表索引是基于 0 的。需要从0开始,用<比较:

let c = 0
while c < len(files)
    files[c] = fnamemodify(files[c], ':r:t')
    let c += 1
endwhile

但是,当您遍历并替换同一个列表时,您可以通过 map():

files = map(files, "fnamemodify(v:val, ':r:t')")