假设当前缓冲区是一个可编辑的文件,因此:e
不显示E32: No file name
。
我想拉一个或全部:
- 文件名与状态行上显示的完全相同,例如
~\myfile.txt
- 文件的完整路径,例如
c:\foo\bar\myfile.txt
- 只是文件名,例如
myfile.txt
假设当前缓冲区是一个可编辑的文件,因此:e
不显示E32: No file name
。
我想拉一个或全部:
~\myfile.txt
c:\foo\bar\myfile.txt
myfile.txt
Answers:
TL; DR
:let @" = expand("%")
>
这会将文件名复制到未修改的寄存器,然后您可以使用好旧p
的粘贴它。当然,您可以将其映射到键以更快地使用。
:nmap cp :let @" = expand("%")<cr>
您也可以将其用于完整路径
:let @" = expand("%:p")
说明
Vim使用未命名的寄存器来存储已删除或复制(选中)的文本,同样,在粘贴时,Vim 将从该寄存器中读取文本。
使用,let
我们可以使用手动将文本存储在寄存器中,:let @" = "text"
但是我们也可以存储表达式的结果。
在上面的示例中,我们使用了expand
扩展通配符和关键字的功能。在我们的示例中,我们用于expand('%')
扩展当前文件名。我们可以将其修改为expand('%:p')
为完整文件名。
查看:help let
:help expand
:help registers
详情
unnamedplus
用作剪贴板使用let @+ = expand("%")
"%:h"
获得的完整路径不包含文件名。
几乎您要的是,它可能会做的:Ctrl+R %
将当前文件名放入您所在的位置(命令提示符,编辑缓冲区等)。有关更多信息,请参见此Vim技巧。
Ctrl+R %
在insert
模式下可以工作-但在edit
模式下Ctrl+R
表示重做。
如果要将当前缓冲区的文件名放在系统级剪贴板中,请尝试将寄存器更改为@ +:
" 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
目录。
"*
,"+
它们是等效的,因此您可以省去平台检查,而只需使用@+
结合其他几个答案中的信息:如果要提取文件的当前完整路径并将其放入另一个窗口的命令缓冲区中,请先执行: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>
" }}}