Vim: `cd` к пути, хранящемуся в переменной - PullRequest
11 голосов
/ 04 января 2011

Я довольно новичок в vim, и мне трудно понять некоторые тонкости сценариев vim.В частности, у меня возникают проблемы при работе с командами, которые ожидают строку без кавычек (есть имя для этого?).Например,

cd some/unquoted/string/path

Проблема в том, что я хотел бы передать переменную, но вызов

let pathname = 'some/path'
cd pathname

попытается изменить текущий каталог на «путь» вместо «некоторый»/дорожка'.Одним из способов решения этой проблемы является использование

let cmd = 'cd ' . pathname
execute cmd

, но это кажется немного обходным. Этот вопрос StackOverflow на самом деле использует cd с переменной, но он не работает в моей системе ("a: путь" обрабатывается как путь, как описано выше).

IЯ использую cd в качестве конкретного примера, но это поведение не уникально для cd;например, команда edit также ведет себя так.(Есть ли название для этого типа команды?)

Ответы [ 3 ]

20 голосов
/ 04 января 2011

TL; DR : использовать execute 'cd' fnameescape(pathname)

Объяснение : множество базовых команд, которые принимают имена файлов в качестве аргумента, поддерживают синтаксис обратной косой черты:

command `shell command`

или

command `=vim_expression`

, поэтому ваш пример может быть записан как

cd `=pathname`

, если вы запускаете его в контролируемой среде.Вы не должны использовать этот вариант в плагинах , потому что a) есть настройка &wildignore, которая может помешать вам: set wildignore=*|cd <code>=pathname приведет к сбою cd независимо от того, что хранится в pathname и b) если путь содержит символы новой строки, он будет разбит на два или более каталогов.Таким образом, то, что вы должны использовать для любого фрагмента кода, которым вы намереваетесь поделиться, это

execute 'cd' fnameescape(pathname)

Обратите внимание, что вы не должны использовать execute "cd" pathname, поскольку он не заботится о специальных символах в имени пути (например, пробел).

4 голосов
/ 04 января 2011

Базовые команды в Vim никогда не выполняют никакой обработки переменных (как он узнает, что вы не хотели переходить в каталог путей вместо каталога some / path?).Вы не должны быть настолько обходными, как вы предлагали, вы можете просто сделать:

exe 'cd' pathname

Обратите внимание, что exe объединяет аргументы с пробелом автоматически, поэтому вы не нужно сделать:

exe 'cd ' . pathname
0 голосов
/ 04 января 2011

Много лет назад я написал этот плагин (функция FixPathName() для решения такого рода проблем. Теперь в vim появились некоторые новые функции, такие как shellescape(), когда путь должен использоваться с внешним команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...