Янки имя файла / путь к текущему буферу в Vim - PullRequest
168 голосов
/ 27 мая 2009

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

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

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

Ответы [ 7 ]

189 голосов
/ 05 июня 2009

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

84 голосов
/ 27 мая 2009

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

60 голосов
/ 14 июня 2013

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

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

5 голосов
/ 03 марта 2016

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

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

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

4 голосов
/ 04 мая 2010

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

1 голос
/ 12 мая 2016

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

" 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>
" }}}
0 голосов
/ 03 октября 2013

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

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