Yank имя файла/путь текущего буфера в Vim

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

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

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

Ответ 1

Попробуйте следующее:

:let @" = expand("%")

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

:nmap cp :let @" = expand("%")

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

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

use: help expand для более подробной информации

Ответ 2

Почти то, о чем вы просите, и это может сделать: Ctrl+R % выводит текущее имя файла туда, где вы находитесь (командная строка, буфер редактирования,...). Подробнее см. этот Vim Tip.

Ответ 3

Если вы хотите поместить текущее имя файла буфера в буфер обмена на системном уровне, попробуйте изменить регистр на @+:

" 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 для каталога.

Ответ 4

Объединение информации из нескольких других ответов: Если вы хотите вытащить текущий полный путь к файлу и поместить его в буфер команд в другом окне, сначала сделайте :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

Ответ 5

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

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

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

Ответ 6

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

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>

Ответ 7

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

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