首页 文章

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

提问于
浏览
156

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

我想猛拉一个或全部:

  • 与状态行上显示的文件名完全相同,例如 ~\myfile.txt

  • 文件的完整路径,例如 c:\foo\bar\myfile.txt

  • 只是文件名,例如 myfile.txt

7 回答

  • 4

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

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

    TL;DR

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

    这会将文件名复制到unamed寄存器,然后你可以使用旧的 p 来粘贴它 . 当然,您可以将其映射到一个键,以便更快地使用 .

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

    你也可以用它来完整的路径

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

    Explanation

    Vim使用未命名的寄存器来存储已删除或复制(抽出)的文本,同样在粘贴它时会读取此寄存器中的文本 .

    使用 let ,我们可以使用 :let @" = "text" 手动将文本存储在寄存器中,但我们也可以存储表达式的结果 .

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

    有关详细信息,请参见 :help let :help expand :help registers

  • 177

    如果执行 :reg ,您将在 % 寄存器中看到当前文件的名称 . 例如,您可以使用 "%p 粘贴它 .

    如果像我一样经常切换到'alternate'缓冲区,那么它的完整路径和文件名放在 # 寄存器中是非常方便的 . 例如,您可以使用 "#p 粘贴它 .

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

  • 5

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

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

    编辑20140421:我经常使用这些,所以我创建了一些快捷方式 . Linux Vims apparently operate slightly differently than Mac Vims,所以也有一个特例 . 如果您将以下内容放在_486607中:

    " 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 表示文件名,_486614表示目录 .

  • 0

    这是我的解决方案:

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

    几乎是你要求的,它可能会: Ctrl+R % 将当前文件名拉到你所在的位置(命令提示符,编辑缓冲区,...) . 有关更多信息,请参阅this Vim Tip .

  • 82

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

    用于复制文件,同时保留在同一目录中并保持旧文件打开 . 例如:

    开始:编辑src / com / benatkin / paint / shapes / Circle.java类型:let @“= expand(”%:p“)(路径被拉到主剪贴板缓冲区 . )打开一个新窗口:sp键入:e Ctrl R“使用箭头键返回Circle并将其更改为Square,然后按<CR>结束:编辑src / com / benatkin / paint / shapes / Square.java

相关问题