So when I want to create a new file by using the :e command I don't want to specify the whole path, just the new filename. Can it be done?
8 Answers
As already suggested, you can use autochdir, which will change to the directory of the file you opened, the other option is
:cd mydirectory
which will change the directory. This can be an absolute or relative path, so :cd ..
will move up one level. Or you can use :cd %:h
which will also change to the directory the current file is in, but without setting autochdir.
:cd
will change directory to your home directory (or on windows, print the current directory).
:cd -
will change the directory to the previous directory you visited.

- 34,597
- 9
- 72
- 86
-
23if you're using multiple windows, you can even use :lcd to change directory for the current window only. – Useless Feb 18 '10 at 13:59
-
1@Useless: interesting... I don't think I'd ever want that, but I suppose that's a matter of taste. Thanks for the info. – falstro Feb 18 '10 at 14:12
-
4I'm trying to figure out what the %:h means, any help? – Michael Jul 24 '12 at 11:03
-
15@Michael `%` translates to the current file name including path, `:` adds modifier, `h` is head, i.e. the path up to the last path separator, that is excluding the file name itself. – falstro Aug 02 '12 at 17:39
-
1@falstro, do you know how :cd command can apply to all windows within the same vim running instances? Ex: when using split :sp – mgouin Jan 19 '17 at 21:29
-
When using multiple tabs, you can use `:tcd` to change directory for the current tab only. – MauroPorras Nov 28 '18 at 12:48
Also if you are browsing the filesystem with the netrw file explorer you can set the current directory by pressing the c key.
Edit: for newer versions try cd
if c
doesn't work.

- 3,945
- 3
- 33
- 48

- 25,806
- 5
- 67
- 84
-
also use ```set autochdir``` to make the ```'c' key``` take effect in shell, so that you can use ```!command args ``` under changed dir. – pimgeek Mar 01 '16 at 05:00
-
1
Try adding set autochdir
to your .vimrc
. If you want to change it just this once, use :cd
(or :cd!
to force it).

- 303,634
- 46
- 339
- 357
-
1the help says this breaks some plugins (i don't know which ones) so I've taken the precaution of adding mapping in my .vimrc: `cnoremap cd. lcd %:p:h` and `nnoremap ,cd :cd %:p:h
:pwd – ErichBSchulz Apr 28 '13 at 11:43` instead -
With netrw:
in addition to pressing the c key to set the current directory, you may also put:
let g:netrw_keepdir= 0
in your .vimrc
; this means that netrw
will keep the browsing directory the same as the current directory.

- 20,112
- 21
- 72
- 113

- 106
- 1
- 1
-
This seems to have an equivalent behavior as :lcd for each netrw folder change. Do you have an idea how this setting could be the equivalent as a :cd instead (change dir for all windows)? Thanks! – mgouin Jan 19 '17 at 21:49
I don't know what is wrong with vim. I want the directory where I start up vim as the current.
I have followed the tip about autochd above and set that to noautcd in my .vimrc.
I haven't done it yet, but I am about to start up vim like this from now on:
vim —cmd 'cd `pwd`'
That will make it stick to the current directory!

- 1,400
- 13
- 10
-
1There's a `—` (em-dash) character in your code, you probably mean `--`. – user202729 Sep 22 '21 at 00:24
Adding this to my .vimrc
automatically changes Vim's working dir to the current file:
autocmd BufEnter * silent! :lcd%:p:h

- 32,039
- 22
- 142
- 171
Update: Now I just use those code instead of install a plugin
" 自动切nvim到当前文件所在路径, 避免leaderF每个命令前都要敲一下 :pwd.
" 代替autochdir: Switch to the directory of the current file unless it breaks something.
au AG BufEnter * call AutoDiR()
func! AutoDiR()
" Don't mess with vim on startup.
let should_cd = (!exists("v:vim_did_enter") || v:vim_did_enter)
" 或
" v:vim_did_enter :
" 0 during startup
" 1 just before VimEnter.
" forbid for some filetypes
" let should_cd = should_cd && david#init#find_ft_match(['help', 'dirvish', 'qf']) < 0
" Only change to real files:
let should_cd = should_cd && filereadable(expand("%"))
" filereadable()
" The result is a Number, which is |TRUE| when a file with the
" name {file} exists, and can be read.
if should_cd
silent! cd %:p:h
endif
endf
" cdh: cd here
nno cd :cd %:p:h<cr><cmd>pwd<cr><cmd>let g:Lf_WorkingDirectory=getcwd()<cr><cmd>echo "Lf目录:"..g:Lf_WorkingDirectory<cr>
" nno cdh
cnorea <expr> cdh ( getcmdtype() == ":" && getcmdline() == 'cdh') ?
\ 'cd %:p:h<cr> :pwd<cr>'
\ : 'cdh'
" 方法2: 不好使? 要敲一次pwd触发?
" au AG VimEnter * set autochdir | pwd | echom '设置了autochdir'
" Note: When this option is on, some plugins may not work.
" 貌似不行:
" Plug 'https://github.com/airblade/vim-rooter'
" 对于vscode-nvim
" vscode用wsl的nvim作为bin时,pwd永远是Microsoft VS Code. 等邮件通知更新吧. 其实不影响使用?
" 我的笔记: https://github.com/vscode-neovim/vscode-neovim/issues/520#issuecomment-1013853745
"
" 这个也不行:
" au AG BufEnter * silent! lcd %:p:h
" lcd: local window cd ?
" Like |:cd|, but only set the current directory for the current window.
You could install the Rooter Vim plugin, which automatically changes the working directory to the automatically-detected project root when you open a file or directory. After Rooter has set the working directory for you, if you try to edit a file like :e example.txt
, Vim will edit example.txt
in the project root.
If you’re using the vim-plug plugin manager, you can install Rooter by adding the following to your .vimrc
, then reloading Vim and running :PlugInstall
.
Plug 'airblade/vim-rooter'

- 625
- 6
- 10
This was solution to my problem when using Nvim NvChad.
I did try to use set autochdir
but that still didn't work.
So next thing I did was set custom mapping.
- Add to
custom/chadrc.lua
this line of codeM.mappings = require "custom.mappings"
- Create new file
mappings.lua
in foldercustom
- Add this lines of code to
mappings.lua
local M = {}
M.abc = {
n = {
["<leader>cf"] = {"<cmd>cd %:h <CR>", "Set Files Location As Dir"}
}
}
return M
- Open nvim and to change dir to current file location press
<leader>cf
Hope this helps!

- 145
- 8