Yank文件名/ Vim中当前缓冲区的路径


187

假设当前缓冲区是一个可编辑的文件,因此:e不显示E32: No file name

我想拉一个或全部:

  • 文件名与状态行上显示的完全相同,例如 ~\myfile.txt
  • 文件的完整路径,例如 c:\foo\bar\myfile.txt
  • 只是文件名,例如 myfile.txt


Answers:


207

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详情


23
酷刚刚将其添加到我的vimrc中:noremap <silent> <F4>:let @ + = expand(“%:p”)<CR>
ThePosey 2011年

9
在Windows上,如果希望它位于Windows剪贴板中,则应改用:let @ * = expand(“%”)。
KFL 2013年

15
如果您unnamedplus用作剪贴板使用let @+ = expand("%")
Kevin Cox

4
使用"%:h"获得的完整路径不包含文件名。
Polymorphix

相关,特别是如果你需要的目录,而文件名- stackoverflow.com/a/2233924/1882064
arcseldon

94

几乎您要的是,它可能会做的:Ctrl+R %将当前文件名放入您所在的位置(命令提示符,编辑缓冲区等)。有关更多信息,请参见此Vim技巧


1
当退出编辑模式时,您可以添加文件名:ctrl-“ ctrl-%p
stefanB

13
Ctrl+R %insert模式下可以工作-但在edit模式下Ctrl+R表示重做。
凯文·潘科

3
什么stefanB的意思是“用于正常/命令模式%P这是相同<CR>%在插入/命令行模式。
graywh

只是概括或陈述不同:graywh和dwc的答案都是“从寄存器%中粘贴”。一个用于插入模式,另一个用于普通模式。在macvim中,看来%寄存器不能被覆盖。
艾瑞克·胡

是否有相同的简单命令来获取行号?)寻求解决方案
itsnikolay 2014年

71

如果要将当前缓冲区的文件名放在系统级剪贴板中,请尝试将寄存器更改为@ +:

" 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目录。


2
在Windows和Mac上"*"+它们是等效的,因此您可以省去平台检查,而只需使用@+
Gabe Moothart,2014年

1
奇怪的是,这似乎在vimscript函数中不起作用:“ echo bufname('%:p')”为空,但是您可以使用更长的“ fnamemodify(bufname('%'),':p' )“
David Ljung Madison Stellar

6

如果这样做,:reg您将在%寄存器中看到当前文件的名称。您可以将其粘贴"%p例如,。

如果像我一样经常切换到“备用”缓冲区,则将其完整路径和文件名放入#寄存器中非常方便。"#p例如,您可以将其粘贴。

注意(以防万一这是我的设置所特有的行为):我在Ubuntu 14.04.4 LTS上使用VIM 7.4.52。


4

结合其他几个答案中的信息:如果要提取文件的当前完整路径并将其放入另一个窗口的命令缓冲区中,请先执行:let @" = expand("%:p"),然后移至另一个窗口并键入Ctrl+R "

对于在保留相同目录的同时复制文件并使旧文件保持打开状态时有用。例如:

开始:编辑src / com / benatkin / paint / shapes / Circle.java

  1. 类型:let @" = expand("%:p") (路径被拉到主剪贴板缓冲区。)

  2. 使用打开一个新窗口 :sp

  3. 类型 :e Ctrl+R"

  4. 使用箭头键返回到“圆”并将其更改为“方形”,然后按<CR>

结束于:编辑src / com / benatkin / paint / shapes / Square.java


1

这是我的解决方案:

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

-1

我使用xclip来访问X的剪贴板,所以我使用:

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

“ +或” *在vim中本机执行相同的操作,而不必使用外部命令。
多里安·B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.