Goal of this plugin is to provide functionality similar to VSCode's remote container development plugin and other functionality that enables development in docker container. This plugin is inspired by jamestthompson3/nvim-remote-containers, but aims to enable having neovim embedded in docker container.
WORK IN PROGRESS
jsonc
parser (or manually installed jsonc parser)Install using favourite plugin manager.
e.g. Using Packer.nvim
use {
'https://codeberg.org/esensar/nvim-dev-container',
requires = { 'nvim-treesitter/nvim-treesitter' }
}
or assuming nvim-treesitter
is already available:
use { 'https://codeberg.org/esensar/nvim-dev-container' }
To use the plugin with defaults just call the setup
function:
require("devcontainer").setup{}
It is possible to override some of the functionality of the plugin with options passed into setup
. Everything passed to setup
is optional. Following block represents default values:
require("devcontainer").setup {
config_search_start = function()
-- By default this function uses vim.loop.cwd()
-- This is used to find a starting point for .devcontainer.json file search
-- Since by default, it is searched for recursively
-- That behavior can also be disabled
end,
workspace_folder_provider = function()
-- By default this function uses first workspace folder for integrated lsp if available and vim.loop.cwd() as a fallback
-- This is used to replace `${localWorkspaceFolder}` in devcontainer.json
-- Also used for creating default .devcontainer.json file
end,
terminal_handler = function(command)
-- By default this function creates a terminal in a new tab using :terminal command
-- It also removes statusline when that tab is active, to prevent double statusline
-- It can be overridden to provide custom terminal handling
end,
nvim_dockerfile_template = function(base_image)
-- Takes base_image and returns string, which should be used as a Dockerfile
-- This is used when adding neovim to existing images
-- Check out default implementation in lua/devcontainer/config.lua
-- It installs neovim version based on current version
end,
devcontainer_json_template = function()
-- Returns table - list of lines to set when creating new devcontainer.json files
-- As a template
-- Used only when using functions from commands module or created commands
end,
-- Can be set to false to prevent generating default commands
-- Default commands are listed below
generate_commands = true,
-- By default no autocommands are generated
-- This option can be used to configure automatic starting and cleaning of containers
autocommands = {
-- can be set to true to automatically start containers when devcontainer.json is available
init = false,
-- can be set to true to automatically remove any started containers and any built images when exiting vim
clean = false,
-- can be set to true to automatically restart containers when devcontainer.json file is updated
update = false,
},
-- can be changed to increase or decrease logging from library
log_level = "info",
-- can be set to true to disable recursive search
-- in that case only .devcontainer.json and .devcontainer/devcontainer.json files will be checked relative
-- to the directory provided by config_search_start
disable_recursive_config_search = false,
-- By default all mounts are added (config, data and state)
-- This can be changed to disable mounts or change their options
-- This can be useful to mount local configuration
-- And any other mounts when attaching to containers with this plugin
attach_mounts = {
-- Can be set to true to always mount items defined below
-- And not only when directly attaching
-- This can be useful if executing attach command separately
always = false,
neovim_config = {
-- enables mounting local config to /root/.config/nvim in container
enabled = false,
-- makes mount readonly in container
options = { "readonly" }
},
neovim_data = {
-- enables mounting local data to /root/.local/share/nvim in container
enabled = false,
-- no options by default
options = {}
},
-- Only useful if using neovim 0.8.0+
neovim_state = {
-- enables mounting local state to /root/.local/state/nvim in container
enabled = false,
-- no options by default
options = {}
},
-- This takes a list of mounts (strings) that should always be added whenever attaching to containers
-- This is passed directly as --mount option to docker command
-- Or multiple --mount options if there are multiple values
custom_mounts = {}
},
-- This takes a list of mounts (strings) that should always be added to every run container
-- This is passed directly as --mount option to docker command
-- Or multiple --mount options if there are multiple values
always_mount = {}
}
Check out wiki for more information.
If not disabled by using generate_commands = false
in setup, this plugin provides the following commands:
DevcontainerBuild
- builds image from nearest devcontainer.jsonDevcontainerImageRun
- runs image from nearest devcontainer.jsonDevcontainerBuildAndRun
- builds image from nearest devcontainer.json and then runs itDevcontainerBuildRunAndAttach
- builds image from nearest devcontainer.json (with neovim added), runs it and attaches to neovim in it - currently using terminal_handler
, but in the future with Neovim 0.8.0 maybe directly (#30)DevcontainerComposeUp
- run docker-compose up based on devcontainer.jsonDevcontainerComposeDown
- run docker-compose down based on devcontainer.jsonDevcontainerComposeRm
- run docker-compose rm based on devcontainer.jsonDevcontainerStartAuto
- start whatever is defined in devcontainer.jsonDevcontainerStartAutoAndAttach
- start and attach to whatever is defined in devcontainer.jsonDevcontainerAttachAuto
- attach to whatever is defined in devcontainer.jsonDevcontainerStopAuto
- stop whatever was started based on devcontainer.jsonDevcontainerStopAll
- stop everything started with this plugin (in current session)DevcontainerRemoveAll
- remove everything started with this plugin (in current session)DevcontainerLogs
- open plugin log fileDevcontainerOpenNearestConfig
- opens nearest devcontainer.json file if it existsDevcontainerEditNearestConfig
- opens nearest devcontainer.json file if it exists, or creates a new one if it does notCheck out :h devcontainer for full list of functions.
Check out contributing guidelines.