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

10

Как я могу вызвать путь к текущему файлу в командной строке, чтобы ввести аналогичное имя файла? Я не хочу аббревиатуру, которая будет заменена текущим именем файла, я хочу отредактировать имя файла вместе с путем к каталогу. Например, я хочу :editфайл с похожим именем или в аналогичном каталоге, например

vim src/submodule/frontend/frobnicate2.c

и теперь я хочу редактировать ../trunk/src/submodule/frontend/frobnicate.c, и я только хочу вставить ../trunkи удалить 2, а не перепечатывать полный путь.

Я, конечно, могу вернуться к оболочке и использовать историю команд, или я могу скопировать и вставить путь через графический интерфейс, но я ищу более эффективный способ, который не требует выхода из Vim.

Жиль "ТАК - перестань быть злым"
источник

Ответы:

11

В дополнение к вставке %реестра, как вы обнаружили себя, вы также можете использовать :edit %<Tab>.

От :help cmdline-special:

In Ex commands, at places where a file name can be used, the following
characters have a special meaning.  These can also be used in the expression
function `expand()`.

        %       Is replaced with the current file name.           :_% c_%

Так что вы можете, например, использовать:

:edit %.orig

редактировать file.txt.orig. Для вашего примера, вы должны ввести :e ../trunk/%, нажмите, <Tab>чтобы получить имя файла с относительным путем, и удалите 2перед нажатием <Enter>.

Вы можете добавить некоторые модификаторы к пути, чтобы изменить его; Я нашел :hособенно полезным, он получает "dirname" (или "head" в Vim-говорить ") текущего пути:

:edit file/in/a/deeply/nested/subdirectory/here.txt
:edit %:h/in_same_dir_as_above.txt

Вы даже можете использовать :hнесколько раз. Например:

:edit %:h:h:h/file.txt

Откроется file/in/a/deeply/file.txt

Также есть :pполный путь, который может быть полезен в вашем случае: введите :e %:p, нажмите <Tab>и измените путь по желанию. Вы даже можете использовать несколько модификаторов, например: :e %:p:h.

Смотрите :help filename-modifiersполный список.

Примечание: если вы <Tab>, Vim расширит %. Если вы используете <C-d>, Vim не будет расширять %(но заменяет %время завершения пути).

Мартин Турной
источник
5

Ой. Ищите «имя файла» в :help :! Это просто: вставить специальный г egister , что означает имя текущего файла.CTRL-R %%

Жиль "ТАК - перестань быть злым"
источник
1
Итак, основываясь на вашем ответе: чтобы получить полный путь в соответствии с запросом OP, вы должны сделать что-то подобное Ctrl-r =expand('%:p'). Это использует регистр = .
lcd047
3

Если вы установили pathпеременную vim , вы обладаете всей мощью :findкоманды, а именно завершением табуляции имен файлов (без необходимости указывать часть каталога!)

В вашем случае что-то вроде

set path=./**

может быть, все, что вам нужно для :fin frob<tab>работы. Для окровавленных деталей, :help find, :help file-searching.

Jens
источник
0

Вот карта, которую вы можете попробовать:

cnoremap <a-q> <c-c>:let @a=expand('%')<CR>:<Up><c-r>a

Это сохраняет текущую команду, а затем устанавливает регистр 'a' в имя текущего файла. Затем последняя команда вызывается и добавляется с содержимым регистра «a». Конечно, если у вас есть что-то полезное в регистре 'a', это перезапишет это.

Вы можете изменить сопоставленные символы на что-то другое. Мне нравится использовать клавишу Alt, но она не работает в некоторых терминалах.

Как указал Carpetsmoker в своем ответе, вы можете изменить вызов функции на

expand('%:p')

заставить полный путь.

Фрэнк
источник
1
Это будет бессмысленно стирать регистр a. Попробуйте что-то вроде этого:cnoremap <M-q> <C-r>=fnameescape(expand('%:p'))<CR>
lcd047