2

我通常使用打开多个选项卡的 GVim,并且我通常在我正在处理的任何缓冲区上手动切换我的工作目录。

然后每个选项卡从我的缓冲区中获取它们各自文件的相对路径作为标签。但是,这仅在其他文件位于文件夹中更下方时才有效,而其他文件显示从我的主文件夹开始的完整路径。

是否可以根据需要使用 vim 显示相对于 :pwd 的所有路径..

例子:

:pwd -> /home/files/folder1

tab1label = file1
tab2label = ../folder2/file2

编辑:我实际上刚刚意识到 GVim 的默认行为正是我想要的,但是一旦我:cd到另一个文件夹就..消失了。

4

4 回答 4

1

我编写了自己的解决方案.. 因为这是我第一次尝试 vim 编码可能不是最好的,但它工作正常。

function RelativePathString(file)
    let filelist=split(a:file,'/')
    if len(filelist) == 0
        return "[No name]"
    endif

    let dir=getcwd()
    let dirlist=split(dir,'/')

    let finalString=""

    let i = 0
    for str in dirlist
        if str !=# filelist[i]
            break
        else
            let i += 1
        endif
    endfor

    let j=0
    let k=len(dirlist)-i
    while j < k
        let finalString .= "../"
        let j += 1
    endwhile

    let j=len(filelist)-1
    while i < j
        let finalString .= filelist[i] . "/"
        let i += 1
    endwhile
    let finalString .= filelist[i]

    return finalString
endfunction

let &guitablabel="%!RelativePathString(expand('%:p'))"
于 2013-06-06T22:48:56.090 回答
1

你检查过邮件列表吗?我找到了两个有用的答案,但也许你会找到更多。

我不确定这些是否能回答您的问题,但它们可能有助于引导您朝着正确的方向前进。

于 2013-06-06T20:00:24.047 回答
0

与 Svalorzen 的相比,此解决方案的运行速度几乎快两倍:

fu! RelativePathString(file)
    if strlen(a:file) == 0
        retu "[No Name]"
    en
    let common = getcwd()
    let result = ""
    while substitute(a:file, common, '', '') ==# a:file
        let common = fnamemodify(common, ':h')
        let result = ".." . (empty(result) ? '' : '/' . result)
    endw
    let forward = substitute(a:file, common, '', '')
    if !empty(result) && !empty(forward)
        retu result . forward
    elsei !empty(forward)
        retu forward[1:]
    en
endf
于 2014-10-30T10:01:33.647 回答
0
substitute(expand('%:p'), getcwd(), '..', '')

/home/romainl

作为工作目录,上面的短片变成了

/home/romainl/.vim/helpers/functions.vim

进入

../.vim/helpers/functions.vim

显然,当您编辑工作目录之外的文件时,它不会很有用。

于 2013-06-06T21:39:55.340 回答