Получение относительных путей в Vim - PullRequest
12 голосов
/ 24 декабря 2010

Скажите, что я запускаю Vim, и pwd возвращает

/home/rafid/myproject

И скажите, что я сейчас редактирую файл

/home/rafid/myproject/website/editpage.php

Есть ли какая-нибудь команда, которая возвращает это для меня?

website/editpage.php

То есть путь к файлу относительно текущей папки.

Ответы [ 6 ]

16 голосов
/ 28 июня 2014

Хотя expand('%') часто работает, в редких случаях это не так.Но вы можете заставить Vim всегда указывать относительный путь, вызывая fnamemodify:

:echo fnamemodify(expand("%"), ":~:.")

Из руководства:

    :.      Reduce file name to be relative to current directory, if
            possible.  File name is unmodified if it is not below the
            current directory.
            For maximum shortness, use ":~:.".

:~ необязательно.Это уменьшит путь относительно вашей домашней папки, если это возможно (~/...).(К сожалению, это работает только на вашем доме; оно не превратится /home/fred в ~fred, если вы не вошли как fred.)

Если вы ограниченыдля пространства и может управлять «нечеткой» информацией о том, где находится файл, а затем проверить pathshorten(), который сжимает имена папок до одного символа:

:echo pathshorten('~/.vim/autoload/myfile.vim')
~/.v/a/myfile.vim

Ссылка: :h fnamem<Tab> и :h pathsh<Tab>

11 голосов
/ 24 декабря 2010

Другой вариант - написать функцию vim.Вот моя скромная попытка:

function! Relpath(filename)
    let cwd = getcwd()
    let s = substitute(a:filename, l:cwd . "/" , "", "")
    return s
endfunction

Вы вызываете Relpath с любым полным именем пути, и он удаляет имя текущего каталога из аргумента.

Например, попробуйте :echo Relpath(expand("%:p"))Модификатор :p просит Vim вернуть полный путь).Очевидно, это не является необходимым в вашем случае, так как % само по себе возвращает относительный путь.Однако в других случаях это может пригодиться.

5 голосов
/ 24 декабря 2010

Это работает для меня:

:echo expand("%")
1 голос
/ 25 декабря 2010

если вы используете autocmd, чтобы всегда устанавливать текущий каталог буфера, с которым вы работаете (cd%: p: h), тогда вы можете просто набрать: cd

0 голосов
/ 04 апреля 2014

Blockquote Это работает для меня:
: echo expand ("%")

Это работает, только если вы открыли этот файл с относительным файлом:

for vi ./foo, expand("%") will be ./foo

но

for vi /tmp/foo expand("%") will be /tmp/foo
0 голосов
/ 24 декабря 2010

Да, вы можете использовать

: args

Это даст вам имя текущего файла в информационных целях.

...