Янки имя файла / путь к текущему буферу в Vim

Предполагая, что текущий буфер является файлом, открытым для редактирования, :e не отображается E32: No file name,

Я хотел бы выдернуть одно или все из:

  • Имя файла точно так же, как показано в строке состояния, например ~\myfile.txt
  • Полный путь к файлу, например c:\foo\bar\myfile.txt
  • Просто имя файла, например myfile.txt

14 ответов

Решение

TL; DR

:let @" = expand("%")>

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

:nmap cp :let @" = expand("%")<cr>

Вы также можете использовать это для полного пути

:let @" = expand("%:p")

объяснение

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

С помощью 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 для каталога.

Ответ проверен на Neovim/Ubunutu.

Насколько я могу судить, % register уже содержит относительный путь к файлу, так что это так же просто, как перемещение содержимого % Зарегистрируйтесь в любом регистре, представляющем ваш любимый буфер обмена.

Этот SO-ответ касается копирования из одного регистра в другой

:let @+=@%

Мне это кажется довольно простым. Нет необходимости в каких-либо трудно запоминающихся expand() прочее.

Если вы делаете :reg Вы увидите имя текущего файла в % регистр. Вы можете вставить его с "%p, например.

Если, как и я, вы часто переключаетесь на "альтернативный" буфер, очень удобно, что его полный путь и имя файла помещаются в # регистр. Вы можете вставить его с "#p, например.

Примечание (на всякий случай, это поведение, специфичное для моей настройки): я использую VIM 7.4.52 в Ubuntu 14.04.4 LTS.

Объединение информации из пары других ответов: Если вы хотите получить текущий полный путь к файлу и поместить его в буфер команд в другом окне, сначала выполните :let @" = expand("%:p"), затем перейдите в другое окно и введите Ctrl+R ",

Полезно для копирования файла, оставаясь в том же каталоге и сохраняя старый открытый. Например:

Начало: Редактирование src / com / benatkin / paint / shape /Circle.java

  1. Тип :let @" = expand("%:p") (Путь возвращается в основной буфер буфера обмена.)

  2. Откройте новое окно с :sp

  3. Тип :e Ctrl+R"

  4. С помощью клавиш со стрелками вернитесь к кругу, измените его на квадрат и нажмите

Конец: Редактирование src / com / benatkin / paint / shape / Square.java

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

      :!echo %

печатает относительный путь текущего буфера к терминалу, где вы можете скопировать его, а затем ENTER обратно в vim. (как уже упоминалось, вы можете постфиксировать команду с помощью:pили:tчтобы получить абсолютное или базовое имя, если вы помните это....)

Вот мое решение:

" 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>
" }}}

В качестве альтернативы другим ответам, если у вас установлен vim-fugitive , вы можете использовать defaulty<C-G>(этоyс последующимCtrl+g) картографирование.

От:help vim-fugitive:

                                                      *fugitive_y_CTRL-G*
["x]y<C-G>              Yank the path to the current |fugitive-object|.

Хотя там указаноfugitive-objectна самом деле он работает и с обычными файлами, дергая путь к файлу.

Для меня это даже проще запомнить, чем запоминать, как использоватьexpand. И нет необходимости создавать дополнительные сопоставления.

Если вы хотите просто восстановить путь к имени открытого в данный момент файла, просто нажмите:

  1. step1: ctrl + g [Вы увидите весь корневой путь в нижней части окна]
  2. Шаг 2: выберите путь мышью
  3. step3: Вставьте с помощью среднего колеса мыши

Если вы запускаете vim из терминала, вы можете использовать это:

      !echo % | xclip -sel clip

Я поместил его в свой vimc:

      nnoremap yl :let @" = expand("%:p")<cr>

Вместо использования команд карты (:h map-commands), это может быть идеальным приложением для использования сокращений (:h abbreviations). Они ведут себя как TextExpander, но являются встроенными в Vim.

Начните с добавления следующих строк в . Измените триггер (<y..>в соответствии с вашими предпочтениями.

      cabbrev yfn   :let @+ = expand("%:t")
cabbrev yfp   :let @+ = expand("%:p")
cabbrev yrp   :let @+ = expand("%")

С использованием$MYVIMRCВ качестве примера:

  • yfn%:tхвост (имя файла, только последний компонент пути); например, cwd:~/<any/dir>/, результат:
  • yfp%:pразвернуть до полного пути; например, cwd:~/any/dir/, результат:/Users/<home_dir>/.vimrc
  • yrp%текущее имя файла (относительный путь); например, cwd:~/, результат:.vimrc

Итак, в режиме командной строки<:cabbrev> + <CR>выполняет команду немедленно, или вы можете сразу приступить к ее редактированию.

Я использую xclip для доступа к буферу обмена X, поэтому я использую:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
Другие вопросы по тегам