Извлечь имя файла/путь к текущему буферу в Vim
Вопрос
Предполагая, что текущий буфер представляет собой файл, открытый для редактирования, поэтому :e
не отображается E32: No file name
.
Я хотел бы выдернуть одно или все из:
- Имя файла точно такое же, как указано в строке состояния, например.
~\myfile.txt
- Полный путь к файлу, например.
c:\foo\bar\myfile.txt
- Просто имя файла, например.
myfile.txt
Решение
ТЛ;ДР
:let @" = expand("%")
>
это скопирует имя файла в безымянный регистр, то вы можете использовать старый добрый p
чтобы вставить его.и, конечно же, вы можете сопоставить это с клавишей для более быстрого использования.
:nmap cp :let @" = expand("%")<cr>
вы также можете использовать это для полного пути
:let @" = expand("%:p")
Объяснение
Вим использует безымянный регистр для хранения текста, который был удален или скопирован (выдернут), аналогично при вставке читается текст из этого регистра.
С использованием let
мы можем вручную сохранить текст в реестре, используя :let @" = "text"
но мы также можем сохранить результат выражения.
В приведенном выше примере мы используем функцию expand
который расширяет подстановочные знаки и ключевые слова.в нашем примере мы используем expand('%')
чтобы расширить текущее имя файла.Мы можем изменить его как expand('%:p')
для полного имени файла.
Видеть :help let
:help expand
:help registers
для подробностей
Другие советы
Почти то, что вы просите, и это может сделать: Ctrl+R %
извлекает текущее имя файла туда, где вы находитесь (командная строка, буфер редактирования,...).Видеть этот совет по Vim для большего.
Если вы хотите поместить текущее имя файла буфера в буфер обмена системного уровня, попробуйте изменить регистр на @+:
" relative path
:let @+ = expand("%")
" full path
:let @+ = expand("%:p")
" just filename
:let @+ = expand("%:t")
Изменить 20140421:Я обычно использую их, поэтому создал несколько ярлыков. Linux Vims, очевидно, работают немного иначе, чем Mac Vims., поэтому и здесь есть особый случай.Если вы поместите следующее в свой ~/.vimrc
:
" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
" relative path (src/foo.txt)
nnoremap <leader>cf :let @*=expand("%")<CR>
" absolute path (/something/src/foo.txt)
nnoremap <leader>cF :let @*=expand("%:p")<CR>
" filename (foo.txt)
nnoremap <leader>ct :let @*=expand("%:t")<CR>
" directory name (/something/src)
nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif
" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
" relative path (src/foo.txt)
nnoremap <leader>cf :let @+=expand("%")<CR>
" absolute path (/something/src/foo.txt)
nnoremap <leader>cF :let @+=expand("%:p")<CR>
" filename (foo.txt)
nnoremap <leader>ct :let @+=expand("%:t")<CR>
" directory name (/something/src)
nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif
Тогда например <leader>cf
скопирует относительный путь текущего буфера (лидер по умолчанию — обратная косая черта (\
)).Я часто использую их для запуска команд в файле или других действий в командной строке.Я не часто использую последнее имя файла/каталога.
Вы можете рассмотреть более интуитивные сопоставления, такие как <leader>cfr
для родственника, <leader>cfa
для абсолютного, <leader>cff
просто имя файла, <leader>cfd
для каталога.
Если ты это сделаешь :reg
вы увидите имя текущего файла в %
регистр.Вы можете вставить его с помощью "%p
, например.
Если вы, как и я, часто переключаетесь на «альтернативный» буфер, очень удобно, чтобы его полный путь и имя файла помещались в #
регистр.Вы можете вставить его с помощью "#p
, например.
Примечание (на всякий случай, это поведение, специфичное для моей установки):Я использую VIM 7.4.52 в Ubuntu 14.04.4 LTS.
Объединение информации из нескольких других ответов:Если вы хотите получить текущий полный путь к файлу и поместить его в командный буфер в другом окне, сначала выполните :let @" = expand("%:p")
, затем перейдите в другое окно и введите Ctrl+R "
.
Полезно для копирования файла, оставаясь в том же каталоге и оставляя старый открытым.Например:
Начинать:Редактирование src/com/benatkin/paint/shapes/Circle.java
Тип
:let @" = expand("%:p")
(Путь будет перенесен в основной буфер обмена.)Откройте новое окно с помощью
:sp
Тип
:e Ctrl+R"
С помощью клавиш со стрелками вернитесь к кругу и измените его на квадрат, а затем нажмите <CR>.
Конец:Редактирование src/com/benatkin/paint/shapes/Square.java
Вот мое решение:
" filename / dirname of the current file {{{
" copy result to the system clipboard and echo the result
" the cb> prompt means the clipboard
" *f*ile *n*ame, ex. init.vim
map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
" *f*ile *p*ath, ex. /home/user/nvim/init.vim
map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
" *d*irectory *p*ath, ex. /home/user/nvim
map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
" *d*irectory *n*ame, ex. nvim
map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}
Я использую xclip для доступа к буферу обмена X, поэтому использую:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>