How can I expand the full path of the current file to pass to a command in Vim?

前端 未结 6 1825
无人共我
无人共我 2020-11-30 17:39

When I go to command mode and type

:!mycommand %

I get my command executed on the current file (% is expanded to the current

相关标签:
6条回答
  • 2020-11-30 17:48

    To print out the current vim filename:

    :help expand
    :echo expand("%:p")    " absolute path
    :echo expand("%:p:h")  " absolute path dirname
    :echo expand("%:p:h:h")" absolute path dirname dirname
    :echo expand("%:.")    " relative path
    :echo expand("%:.:h")  " relative path dirname
    :echo expand("%:.:h:h")" relative path dirname dirname
    
    :echo expand("<sfile>:p")  " absolute path to [this] vimscript
    
    :help filename-modifiers
    

    For example (with a vim function), to resolve() and expand() any symlinks to the absolute path to the current script <sfile>:p (instead of %:p), and then exec to source the fnameescape-ed filename contained in a function-local vim variable l:vimrcfilename:

     "  g:__sfile__dirname     -- directory containing this vimrc script
     "                            after symlinks
     "                            ~dirname(abspath(realpath(__file__)))
     let g:__sfile__dirname=fnamemodify(resolve(expand("<sfile>:p")), ":h")
    
     "  Source_dotvim(filename)  -- source dirname(this_vimrc)/filename
     function Source_dotvim(filename)
         let l:vimrcfilename=g:__sfile__dirname . "/" . a:filename
         if filereadable(l:vimrcfilename) && !empty(l:vimrcfilename)
             "source s:vimrcfilename "this doesn't work, so exec:
             exec "source " . fnameescape(l:vimrcfilename)
         else
             echo l:vimrcfilename . " empty or not found."
         endif
     endfunction 
    
     call Source_dotvim("vimrc.local.01-env.vimrc")
    

    Notes:

    • :help fnamemodify
    • "current file": %:p (buffer file) / <sfile>:p (script file)
    • expand('<sfile>') does not work from within a function
    • source l:varname does not work; so, exec - string concatenation - and fnameescape
    • :messages prints the most-recent 200 vim [error,] messages

    References

    • annika-backstrom's answer
    • umber-ferrule's answer
    • tito-11's answer
    0 讨论(0)
  • 2020-11-30 17:53

    Append :p, e.g.

    :!mycommand %:p
    

    And %:p:h will give you the path of the directory that the file resides in.

    0 讨论(0)
  • 2020-11-30 17:54

    :!mycommand %:p

    Related:

    :!cd %:p:h

    0 讨论(0)
  • 2020-11-30 17:54

    The other two answers didn’t work for me (for some reason). However, I found that this combo displays the full path when typed in Normal mode:

    Press 1 then CtrlG

    Source: “Get the name of the current file” on the Vim Tips Wiki. See also the {count}CTRL-G section of :help CTRL-G.

    0 讨论(0)
  • 2020-11-30 17:56

    Get the name of the current file http://vim.wikia.com/wiki/Get_the_name_of_the_current_file

    Set_working_directory_to_the_current_file http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file

    0 讨论(0)
  • 2020-11-30 18:06

    If you want to use the full path in your vimrc, you can use something like this:

    let vimFiles = '$HOME/.vim'
    let absPath  = expand(vimFiles . '/subDir')
    

    This will give you a path with backslashes on Windows.

    0 讨论(0)
提交回复
热议问题