代码之家  ›  专栏  ›  技术社区  ›  davetapley

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

  •  157
  • davetapley  · 技术社区  · 16 年前

    假设当前缓冲区是一个打开进行编辑的文件,那么 :e 不显示 E32: No file name .

    我想拉一个或全部:

    • 文件名与状态行上显示的完全相同,例如 ~\myfile.txt
    • 文件的完整路径,例如 c:\foo\bar\myfile.txt
    • 只是文件名,例如 myfile.txt
    7 回复  |  直到 7 年前
        1
  •  180
  •   JD Frias flyx    7 年前

    DR

    :let @" = expand("%") gt;

    这将把文件名复制到 匿名寄存器 ,那么你可以用老的 p 粘贴它。当然,你可以把它映射到一把钥匙上以便更快的使用。

    :nmap cp :let @" = expand("%")<cr>

    您也可以将其用于完整路径

    :let @" = expand("%:p")

    解释

    VIM使用 未命名寄存器 要存储已删除或复制(扬起)的文本,同样,粘贴时,它会从该寄存器中读取文本。

    使用 let 我们可以使用 :let @" = "text" 但是我们也可以存储表达式的结果。

    在上面的示例中,我们使用函数 expand 它扩展通配符和关键字。在我们的示例中,我们使用 expand('%') 展开当前文件名。我们可以修改为 expand('%:p') 完整的文件名。

    :help let :help expand :help registers 详情

        2
  •  82
  •   dwc    16 年前

    几乎是你想要的,它可能会做到: Ctrl+R % 将当前文件名拉入当前位置(命令提示、编辑缓冲区…)。见 this Vim Tip 更多。

        3
  •  53
  •   Community CDub    8 年前

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

    " relative path
    :let @+ = expand("%")
    
    " full path
    :let @+ = expand("%:p")
    
    " just filename
    :let @+ = expand("%:t")
    

    编辑20140421: 我通常使用这些,所以我创建了一些快捷方式。 Linux Vims apparently operate slightly differently than 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
  •  5
  •   Robert    9 年前

    如果你这样做了 :reg 您将在 % 寄存器。你可以用 "%p 例如。

    如果像我一样,您经常切换到“备用”缓冲区,那么将它的完整路径和文件名放在 # 寄存器。你可以用 "#p 例如。

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

        5
  •  4
  •   Benjamin Atkin    15 年前

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

    用于在同一目录下复制文件并保持旧文件打开。例如:

    起点 编辑 src/com/benatkin/paint/shapes/circle.java

    1. 类型 :让@“=展开(”%:p“) (路径被拉到主剪贴板缓冲区。)

    2. 打开一个新窗口 :sp

    3. 类型 :e Ctrl+R"

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

    终点 编辑 src/com/benatkin/paint/shapes/square.java

        6
  •  0
  •   glts    12 年前

    我使用xclip访问x的剪贴板,因此我使用:

    nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
    
        7
  •  0
  •   Jabba    9 年前

    这是我的解决方案:

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