Получение относительных путей в Vim

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

/home/rafid/myproject

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

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

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

website/editpage.php

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

Ответ 1

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

:echo expand("%")

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

: арг

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

Ответ 6

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

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

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

но

for vi /tmp/foo expand("%") will be /tmp/foo