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

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

/home/rafid/myproject

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

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

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

website/editpage.php

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


person Rafid    schedule 24.12.2010    source источник


Ответы (6)


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

:echo expand("%")
person icecrime    schedule 24.12.2010
comment
Вы также можете использовать <c-r>% в режиме вставки, чтобы вставить текущее имя файла. - person Peter Rincker; 24.12.2010
comment
Это не всегда работает и зависит от того, как вы изначально открыли файл. См. Ответ @joeytwiddle на этот вопрос для более полного решения. - person senbrow; 25.04.2016

Хотя 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>

person joeytwiddle    schedule 28.06.2014
comment
Спасибо, что указали мне правильное направление. Для справки, похоже, что модификаторы также могут быть расширены напрямую с помощью :echo expand("%:~:."). Дополнительную информацию можно найти на :help filename-modifiers. - person Adam Byrtek; 24.05.2020
comment
Спасибо за этот ответ! Я работаю в vim и пытаюсь выполнить команду внутри контейнера докеров (запустить определенный тестовый файл), поэтому абсолютный путь для меня не работает. Docker не видит полный путь, а мой тестовый запуск внутри контейнера выдает ошибку, потому что не может найти файл. fnamemodify сработало отлично! - person latortuga; 22.07.2020

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

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

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

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

person nimrodm    schedule 24.12.2010

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

person Lloyd Moore    schedule 25.12.2010
comment
следующему пользователю на этой странице — ознакомьтесь с этим советом по vim, чтобы узнать больше о настройке cd с помощью autocmd vim. wikia.com/wiki/Set_working_directory_to_the_current_file - person molicule; 12.06.2011

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

:аргументы

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

person kvista    schedule 24.12.2010
comment
Обратите внимание, что мне нужно не только имя файла, мне нужен относительный путь. Так что не просто editpage.php, а «веб-сайт/editpage.php». - person Rafid; 24.12.2010
comment
Да, это будет учитываться. Вы пробовали? - person kvista; 24.12.2010

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

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

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

но

for vi /tmp/foo expand("%") will be /tmp/foo
person CansasCity    schedule 04.04.2014
comment
Не здесь. Если я нахожусь в /tmp и делаю vi /tmp/foo, тогда Vim определяет относительный путь, и expand("%") показывает мне foo. Однако если я оставлю vim открытым в /tmp и сделаю :e /tmp/bar то expand("%") покажет полный путь. - person joeytwiddle; 06.04.2014