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