Как вставить текущее имя файла в содержимое в Vim?

39

После некоторых поисков я узнал, :echo @%отображает текущее имя файла в нижней строке vim-screen.

Я хотел бы сбросить имя файла (с и без полного пути) в содержимое файла, не выходя vim.

Есть какой-либо способ сделать это?

холодный морской тропический воздух
источник

Ответы:

28

Я уверен, что есть другие способы сделать это ... но основная команда, которую вы хотите, - :r[ead]это вставка вывода команды в буфер.

Итак, чтобы вставить только имя файла:

:r! echo %

И, чтобы включить полный путь:

:r! echo %:p

Для получения дополнительной информации:

:help read
:help filename-modifiers 
JC Yamokoski
источник
37

Текущее имя файла находится в "%регистре, поэтому вы можете вставить его (в режиме вставки) с помощью <c-r>%; полный путь можно вставить с помощью <c-r>=expand("%:p"). Вы можете сделать макрос из этого, если вы используете его часто. Для более похожих трюков смотрите :h expandи :h "=.

Kevin
источник
Может быть, я неправильно понимаю, но не <c-r>отображается как команда повтора?
JC Yamokoski
10
В режиме вставки <c-r>указывает, что следующий символ является регистром.
Кевин
Правильно, спасибо. Совершенно забыл перейти в режим вставки ...
JC Yamokoski
Вы также можете сделать "%pв обычном или визуальном режимах.
naught101
15

Как видно из этого :h registers, "%регистр содержит текущее имя файла. Команда :pu[t]вставляет содержимое регистра в текст.

Таким образом, чтобы вставить фактическое имя файла, вы можете ввести любой из них в командном режиме:

:put %

или

"%p

Чтобы вставить имя файла с полным путем, введите

:put=expand('%:p')

в командном режиме.


Больше информации:

:h pu[t]

Набрав "rpможно вставить содержимое реестра "r.

braunmagrin
источник
3
:put "%:p"Не похоже на работу для меня. Кажется, он работает только с расширением () , как в:, :put =expand('%:p')что делает его не намного менее громоздким, чем, <c-r>=expand('%:p')к сожалению.
akavel
@akavel Вы правы, я обновлю ответ. Спасибо! ;) И действительно, оба одинаково многословны.
Браунмагрин
5

Простой способ - запустить:

!!echo %
  • !! заменяет текущую строку результатом команды, следующей за ней.

  • % заменяется именем отредактированного файла в команде, так что это фактически вставит это имя в отредактированный файл.

Это имя файла, которое вы передали команде vi (m), и может содержать относительный или абсолютный путь. Если вы хотите удалить его и сохранить только имя файла, запустите

!!basename %
jlliagre
источник
1

Если вам нужно делать это часто, может быть полезно связать последовательность клавиш с тем, что вы хотите, в соответствии с http://vim.wikia.com/wiki/Insert_current_filename

вставляет текущее имя файла без расширения в позиции курсора, когда вы находитесь в режиме вставки.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Чтобы сохранить расширение используйте:

:inoremap \fn <C-R>=expand("%:t")<CR>

Чтобы вставить абсолютный путь к каталогу, файл используется:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Чтобы вставить относительный путь к каталогу, файл используется:

:inoremap \fn <C-R>=expand("%:h")<CR>

Все вышеперечисленное работает непосредственно vimдля сеанса, или вы можете поместить его в .vimrc(где начальное двоеточие в строке необязательно).

Randall
источник
0

Я гуглил самый простой способ вставить текущее имя файла (без пути или расширения) в текущую позицию (без новой строки, без замены текущей строки). Таким образом, объединяя предыдущие ответы и эту ссылку , это то, что я искал.

В режиме вставки :

<C-R>=expand("%:t:r")

Затем в следующий раз (с командой уже в истории):

<C-R>=<UP>
kub1x
источник