假设当前缓冲区是一个打开编辑的文件,那么:e不会显示E32: No文件名。
我想要扯掉其中一个或全部:
文件名与状态行中显示的完全一致,例如~\myfile.txt 文件的完整路径,例如c:\foo\bar\myfile.txt 只是文件名,例如myfile.txt
假设当前缓冲区是一个打开编辑的文件,那么:e不会显示E32: No文件名。
我想要扯掉其中一个或全部:
文件名与状态行中显示的完全一致,例如~\myfile.txt 文件的完整路径,例如c:\foo\bar\myfile.txt 只是文件名,例如myfile.txt
当前回答
几乎就是你想要的,它可能会这样做:在INSERT模式下,Ctrl+R %将当前文件名拉到你所在的位置(命令提示符,编辑缓冲区,…)更多信息请看Vim提示。
其他回答
我使用xclip来访问X的剪贴板,所以我使用:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
如果你想把当前的缓冲区文件名放在你的系统级剪贴板中,尝试将寄存器更改为@+:
" 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表示目录映射。
以下是我的解决方案:
" 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>
" }}}
结合来自其他几个答案的信息:如果您想将当前完整路径拉到一个文件,并将其放入另一个窗口的命令缓冲区中,首先执行: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
博士TL;
:let @" = expand("%")>
这将把文件名复制到未命名寄存器,然后你可以使用p来粘贴它。当然,您可以将其映射到键,以便更快地使用。
:nmap cp:let @" = expand("%")<cr>
您也可以将此用于完整路径
:let @" = expand("%:p")
解释
Vim使用未命名寄存器来存储已删除或复制(yanked)的文本,同样,当您粘贴时,它从该寄存器读取文本。
使用let,我们可以手动将文本存储在寄存器中,使用:let @" = "text",但我们也可以存储表达式的结果。
在上面的例子中,我们使用了扩展函数来展开通配符和关键字。在我们的例子中,我们使用expand('%')来展开当前文件名。我们可以将其修改为expand('%:p')作为完整的文件名。
有关详细信息,请参见:help let:help expand:帮助寄存器