Readable Page: https://github.com/skywind3000/vim-proposal/blob/master/project_info.md
Markdown plain text: # Introducing VSCode's workspace mechanism ## Problem https://github.com/vim/vim/issues/3573#issuecomment-433705924 > It would be great to have a standardized APIs for project-related information > (e.g. file lists, root directory, VCS type, a way to set project-specific > buffer-local options / variables etc.). Much of this can be implemented in > vim plugins but it would be preferable if vim provided a standard way to do > this. ## Project Information Vim can introduce a way to provide following information: - root directory - file list - buffer-local options Plugins can have a place to store project-specific configurations: - ctags/cscope parameters - linter parameters - include folders (c/c++) - CFLAG / CXXFLAG / LDFLAGS (c/c++) - actions: command to run, debug etc. ## Goals - A way to locate project root (use root markers). - A place for plugins to read project local configurations (like `.vscode` folder in vscode). - A standard that plugins can follow even if running in old vims. - Very simple to implement. ## Solution Use something like vscode's `.vscode` folder: ``` project1 ├── include ├── src │ ├── module1 │ └── module2 └── .vscode <- located in the project root directory ├── settings.json <- project-specific settings └── tasks.json <- how to "debug" this project or "build" this project ``` The `.vscode` folder in vscode is used to store project local settings and it locates in the project root directory. Every file inside `project1` will use the settings defined in `.vscode/settings.json`. And the `.vscode` folder can be used to locate project root for current file. Similar to `.vscode`, this solution will start by defining a new `.vimprj` folder (the name is configurable). ### Root marker Introduce a new option `rootmarker` for locating project root of current file, it defaults to `.vimprj` and can be set: ```VimL set rootmarker=.vimprj set rootmarker=.vscode set rootmarker=.git set rootmarker=.project ``` By default, there will be an `.vimprj` folder (can be renamed by `set rootmarker=xxx`) in your project root directory. Like vscode use a `.vscode` folder in every project root to store workspace settings. Plugins can put their project related configuration file in the `.vimprj` folder. ### Locating project root The project root of current file is the nearest parent directory with a folder named `.vimprj` (can be changed by set rootmarker=xxx) in it. A buffer-specific variable `v:project` is used to store the project root directory of current buffer, it is initialized when you open a file as: ```VimL let v:projectroot = fnamemodify(find(&rootmarker, '.;'), ':h') ``` If `.vimprj` can not be found in the parent directories, an empty string will be used. For files already opened by vim, `v:projectroot` can be updated when you close the file and open again. **Plugins can use the same algorithm to calculate project root directory even if running in old vims.** ### Modifiers ``` %:j - same as v:projectroot, project root directory of current buffer %:i - file path relative to current project root ``` These modifiers can be used in command line or passing to `expand(xxx)`. ### Buffer local settings Like `.vscode/settings.json` in vscode, if there is a `settings.json` file located in `.vimprj` folder, it will be loaded when you open a file in this project: ```json { "shiftwidth": 2, "tabstop": 2, "expandtab": false } ``` Each key/value pair in `settings.json` will be initialized as a buffer local setting. **Alternative way** for this is to create a `local.vim` in the `.vimprj` folder and it will be sourced in `sandbox` for every file in the project. This can be done by a vimscript shipped with vim (like matchit.vim). ### Old vim compatibility Plugins running in old vims can calculate project root themself: ```VimL if !exists('g:rootmarker') let g:rootmarker = exists('+rootmarker')? &rootmarker : ".vimprj" endif if !exists('v:projectroot') let b:_project_root = fnamemodify(find(g:rootmarker, '.;'), ':h') else let b:_project_root = v:projectroot endif ``` With this standard, even if running in old vims, plugin can get the project root directory of current file. ### File list There can be a `.vimprj/filelist` file to describe the filelist in this project: ``` inc/interface.h src/hello.c src/world.c src/module/xp.c ``` This file is optional, if it doesn't exist, all files inside root directory will be considered as project files. If a plugin need generate ctags database for current project or need grep symbol in current project, the filelist can be used for that. -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
