VIM基于项目结构映射快捷键:artisan_exist等判断函数如何实现?
如何在Vim中实现Laravel项目的文件检测与快捷键映射
嘿,这个问题我熟!在Vim里实现你要的文件检测其实很简单,用Vim内置的文件检查函数就能搞定,不用自己写复杂的逻辑~
核心实现:用Vim内置函数检测文件
Vim提供了filereadable()和fileexists()两个核心函数来判断文件状态,这里更推荐用filereadable()——因为它不仅会检查文件是否存在,还会确认当前用户有读取权限(毕竟我们要打开文件)。
直接在条件中判断(最简洁的写法)
你不需要单独定义artisan_exist或webpack_exist函数,直接把检测逻辑写在if条件里就行,这样配置更简洁:
" Laravel框架专属快捷键:检测根目录artisan文件 if filereadable('artisan') nmap <leader>lr :e routes/web.php<cr> nmap <leader>lca :e config/app.php<cr> nmap <leader>lc :e composer.json<cr> nmap <leader>len :e .env<cr> endif " Webpack Mix相关快捷键:检测webpack.mix.js文件 if filereadable('webpack.mix.js') nmap <leader>js :e webpack.mix.js<cr> endif
封装成函数(更易维护的写法)
如果你希望逻辑更清晰、方便复用,可以把检测逻辑封装成自定义函数:
" 检测当前项目是否为Laravel项目(存在可读的artisan文件) function! ArtisanExist() return filereadable('artisan') endfunction " 检测当前项目是否使用Webpack Mix(存在可读的webpack.mix.js文件) function! WebpackExist() return filereadable('webpack.mix.js') endfunction " 使用自定义函数判断并绑定快捷键 if ArtisanExist() nmap <leader>lr :e routes/web.php<cr> nmap <leader>lca :e config/app.php<cr> nmap <leader>lc :e composer.json<cr> nmap <leader>len :e .env<cr> endif if WebpackExist() nmap <leader>js :e webpack.mix.js<cr> endif
进阶优化:支持子目录启动Vim
如果习惯在项目子目录(比如app/Http)启动Vim,上面的写法可能检测不到根目录的文件。这时候可以用findfile()函数递归向上查找文件:
" 递归查找项目根目录的artisan文件 if filereadable(findfile('artisan', '.;')) nmap <leader>lr :e routes/web.php<cr> nmap <leader>lca :e config/app.php<cr> nmap <leader>lc :e composer.json<cr> nmap <leader>len :e .env<cr> endif " 递归查找项目根目录的webpack.mix.js文件 if filereadable(findfile('webpack.mix.js', '.;')) nmap <leader>js :e webpack.mix.js<cr> endif
findfile('文件名', '.;')的意思是:从当前目录开始,向上递归查找指定文件,直到找到文件或到达系统根目录,这样不管你在项目的哪个子目录启动Vim,都能正确检测到项目根目录的关键文件。
内容的提问来源于stack exchange,提问作者Deden Bangkit
相关产品推荐
相关产品推荐

