2013-05-10 5 views
2

Я хочу сделать то же самое, что команда bash dirname или python os.path.split()[0] в vimscript для любой строки пути (не обязательно путь к текущему файлу).Как получить родительский каталог строки пути

Образец желательное поведение:

  • /a/b/ ->/a
  • /a/b ->/a

Я попытался fnamemodify(), но мне его выход, кажется, зависит от того, существуют каталоги или нет:

:ec fnamemodify('/usr/idontexist', ':p:h') 

дает:

/usr 

это хорошо, но:

:ec fnamemodify('/usr/bin', ':p:h') 

дает:

/usr/bin 

, который не то, что я хочу, и я не могу понять, что это такое делает.

Надеюсь найти кросс-платформенное решение.

ответ

7

вы читали эту часть описания :h:

When the file name ends in a path separator, only the path 
      separator is removed. Thus ":p:h" on a directory name results 
     on the directory name itself (without trailing slash). 

вот причина:

:ec fnamemodify('/usr/bin/', ':p:h') "directory, ending with/
-> /usr/bin 
:ec fnamemodify('/usr/bin/', ':h') "directory, ending with/
-> /usr/bin 
:ec fnamemodify('/usr/bin', ':p:h') "directory, not ending with/
-> /usr/bin 
:ec fnamemodify('/usr/bin', ':h') "directory, not ending with/
-> /usr 

таким образом, есть два фактора, чтобы решить вывод.

  • если ваша строка заканчивается separator
  • если вы использовали :p

для достижения своей цели, вы можете удалить последний символ, если строка заканчивается / (или \ in win?), а затем перейти к функция без :p

+0

Я думаю, что это не было причиной моей проблемы, но я спрашивал себя, что так или иначе, так что +1. какое сложное поведение ... –

+0

t ake мой последний комментарий назад, это * была * основной причиной моей проблемы! использование ': p' является проблемой не только потому, что dir может не существовать, а потому, что использование': p: h' не делает то, что я хочу. Тот факт, что ': p' удалил часть« idontexist »и, похоже, сделал то, что я хотел, попал в неопределенное поведение и только смутил меня. –

4
fnamemodify('/usr/idontexist', ':h') 

Модификатор :p расширит путь до полного пути. Поэтому это должен быть реальный путь. Просто не используйте :p, если вы не возитесь с реальными путями.

См

:h filename-modifiers 
Смежные вопросы