feat: update documentation and configuration files for Neovim setup

Signed-off-by: juliano.barbosa <julianomb@gmail.com>
This commit is contained in:
Juliano Barbosa 2025-02-22 13:04:03 -03:00
parent 76edf81b0a
commit 7128ca764c
47 changed files with 1956 additions and 1147 deletions

View file

@ -1,17 +1,38 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
return {
{
'jackMort/ChatGPT.nvim',
event = 'VeryLazy',
config = function()
require('chatgpt').setup {
local prompts_url = 'https://raw.githubusercontent.com/julianobarbosa' .. '/custom-gpt-prompts/main/prompt.csv'
require('chatgpt').setup({
api_key_cmd = 'pass show azure/hypera/oai/idg-dev/token',
api_host_cmd = 'echo -n ""',
api_type_cmd = 'echo azure',
azure_api_base_cmd = 'pass show azure/hypera/oai/idg-dev/base',
azure_api_engine_cmd = 'pass show azure/hypera/oai/idg-dev/engine',
azure_api_version_cmd = 'pass show azure/hypera/oai/idg-dev/api-version',
predefined_chat_gpt_prompts = 'https://raw.githubusercontent.com/julianobarbosa/custom-gpt-prompts/main/prompt.csv',
}
predefined_chat_gpt_prompts = prompts_url,
})
end,
dependencies = {
'MunifTanjim/nui.nvim',

View file

@ -1,3 +1,23 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
return {
'github/copilot.vim',
opts = {
@ -22,8 +42,8 @@ return {
['gitcommit'] = {
enable = true,
-- Disable using previous commit messages as suggestions
previous_commit_history = false
}
previous_commit_history = false,
},
}
end,
}

View file

@ -1,3 +1,23 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-- python-debugging.lua: Debugging Python code with DAP
--
@ -5,34 +25,76 @@ return {
{
'mfussenegger/nvim-dap',
dependencies = {
'mfussenegger/nvim-dap-python', -- Python adapter
'rcarriga/nvim-dap-ui', -- UI for DAP
'theHamsta/nvim-dap-virtual-text' -- Inline variable text
'mfussenegger/nvim-dap-python', -- Python adapter
'rcarriga/nvim-dap-ui', -- UI for DAP
'theHamsta/nvim-dap-virtual-text', -- Inline variable text
},
keys = {
{ '<leader>dc', function() require('dap').continue() end, desc = 'Debug: Start/Continue' },
{ '<leader>db', function() require('dap').toggle_breakpoint() end, desc = 'Debug: Toggle Breakpoint' },
{ '<leader>dt', function() require('dap').terminate() end, desc = 'Debug: Terminate' },
{ '<leader>di', function() require('dap').step_into() end, desc = 'Debug: Step Into' },
{ '<leader>do', function() require('dap').step_over() end, desc = 'Debug: Step Over' },
{ '<leader>dr', function() require('dap').repl.open() end, desc = 'Debug: Open REPL' },
{
'<leader>dc',
function()
require('dap').continue()
end,
desc = 'Debug: Start/Continue',
},
{
'<leader>db',
function()
require('dap').toggle_breakpoint()
end,
desc = 'Debug: Toggle Breakpoint',
},
{
'<leader>dt',
function()
require('dap').terminate()
end,
desc = 'Debug: Terminate',
},
{
'<leader>di',
function()
require('dap').step_into()
end,
desc = 'Debug: Step Into',
},
{
'<leader>do',
function()
require('dap').step_over()
end,
desc = 'Debug: Step Over',
},
{
'<leader>dr',
function()
require('dap').repl.open()
end,
desc = 'Debug: Open REPL',
},
},
config = function()
local dap = require('dap')
local dapui = require('dapui')
-- Configure dapui
dapui.setup()
-- Configure Python
require('dap-python').setup(vim.fn.exepath('python3'))
-- Auto open/close dapui
dap.listeners.after.event_initialized['dapui_config'] = function() dapui.open() end
dap.listeners.before.event_terminated['dapui_config'] = function() dapui.close() end
dap.listeners.before.event_exited['dapui_config'] = function() dapui.close() end
end
}
dap.listeners.after.event_initialized['dapui_config'] = function()
dapui.open()
end
dap.listeners.before.event_terminated['dapui_config'] = function()
dapui.close()
end
dap.listeners.before.event_exited['dapui_config'] = function()
dapui.close()
end
end,
},
}
-- The line beneath this is called `modeline`. See `:help modeline`

View file

@ -1,67 +1,89 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
return {
"nvim-neo-tree/neo-tree.nvim",
dependencies = { "MunifTanjim/nui.nvim" },
cmd = "Neotree",
init = function() vim.g.neo_tree_remove_legacy_commands = true end,
'nvim-neo-tree/neo-tree.nvim',
dependencies = { 'MunifTanjim/nui.nvim' },
cmd = 'Neotree',
init = function()
vim.g.neo_tree_remove_legacy_commands = true
end,
opts = function()
return {
auto_clean_after_session_restore = true,
close_if_last_window = true,
sources = { "filesystem", "buffers", "git_status" },
sources = { 'filesystem', 'buffers', 'git_status' },
source_selector = {
sources = {
{ source = "filesystem", display_name = " 󰉓 Files " },
{ source = "git_status", display_name = " 󰊢 Git " },
{ source = 'filesystem', display_name = ' 󰉓 Files ' },
{ source = 'git_status', display_name = ' 󰊢 Git ' },
},
},
default_component_configs = {
icon = {
folder_empty = "!",
folder_empty_open = "!O",
folder_empty = '!',
folder_empty_open = '!O',
},
git_status = {
symbols = {
renamed = "󰁕",
unstaged = "💣",
renamed = '󰁕',
unstaged = '💣',
},
},
},
document_symbols = {
kinds = {
File = { icon = "󰈙", hl = "Tag" },
Namespace = { icon = "󰌗", hl = "Include" },
Package = { icon = "󰏖", hl = "Label" },
Class = { icon = "󰌗", hl = "Include" },
Property = { icon = "󰆧", hl = "@property" },
Enum = { icon = "󰒻", hl = "@number" },
Function = { icon = "󰊕", hl = "Function" },
String = { icon = "󰀬", hl = "String" },
Number = { icon = "󰎠", hl = "Number" },
Array = { icon = "󰅪", hl = "Type" },
Object = { icon = "󰅩", hl = "Type" },
Key = { icon = "󰌋", hl = "" },
Struct = { icon = "󰌗", hl = "Type" },
Operator = { icon = "󰆕", hl = "Operator" },
TypeParameter = { icon = "󰊄", hl = "Type" },
File = { icon = '󰈙', hl = 'Tag' },
Namespace = { icon = '󰌗', hl = 'Include' },
Package = { icon = '󰏖', hl = 'Label' },
Class = { icon = '󰌗', hl = 'Include' },
Property = { icon = '󰆧', hl = '@property' },
Enum = { icon = '󰒻', hl = '@number' },
Function = { icon = '󰊕', hl = 'Function' },
String = { icon = '󰀬', hl = 'String' },
Number = { icon = '󰎠', hl = 'Number' },
Array = { icon = '󰅪', hl = 'Type' },
Object = { icon = '󰅩', hl = 'Type' },
Key = { icon = '󰌋', hl = '' },
Struct = { icon = '󰌗', hl = 'Type' },
Operator = { icon = '󰆕', hl = 'Operator' },
TypeParameter = { icon = '󰊄', hl = 'Type' },
StaticMethod = { icon = '󰠄 ', hl = 'Function' },
},
},
commands = {
parent_or_close = function(state)
local node = state.tree:get_node()
if (node.type == "directory" or node:has_children()) and node:is_expanded() then
if (node.type == 'directory' or node:has_children()) and node:is_expanded() then
state.commands.toggle_node(state)
else
require("neo-tree.ui.renderer").focus_node(state, node:get_parent_id())
require('neo-tree.ui.renderer').focus_node(state, node:get_parent_id())
end
end,
child_or_open = function(state)
local node = state.tree:get_node()
if node.type == "directory" or node:has_children() then
if node.type == 'directory' or node:has_children() then
if not node:is_expanded() then -- if unexpanded, expand
state.commands.toggle_node(state)
else -- if expanded and has children, seleect the next child
require("neo-tree.ui.renderer").focus_node(state, node:get_child_ids()[1])
else -- if expanded and has children, seleect the next child
require('neo-tree.ui.renderer').focus_node(state, node:get_child_ids()[1])
end
else -- if not a directory just open it
state.commands.open(state)
@ -74,62 +96,64 @@ return {
local modify = vim.fn.fnamemodify
local results = {
e = { val = modify(filename, ":e"), msg = "Extension only" },
f = { val = filename, msg = "Filename" },
F = { val = modify(filename, ":r"), msg = "Filename w/o extension" },
h = { val = modify(filepath, ":~"), msg = "Path relative to Home" },
p = { val = modify(filepath, ":."), msg = "Path relative to CWD" },
P = { val = filepath, msg = "Absolute path" },
e = { val = modify(filename, ':e'), msg = 'Extension only' },
f = { val = filename, msg = 'Filename' },
F = { val = modify(filename, ':r'), msg = 'Filename w/o extension' },
h = { val = modify(filepath, ':~'), msg = 'Path relative to Home' },
p = { val = modify(filepath, ':.'), msg = 'Path relative to CWD' },
P = { val = filepath, msg = 'Absolute path' },
}
local messages = {
{ "\nChoose to copy to clipboard:\n", "Normal" },
{ '\nChoose to copy to clipboard:\n', 'Normal' },
}
for i, result in pairs(results) do
if result.val and result.val ~= "" then
if result.val and result.val ~= '' then
vim.list_extend(messages, {
{ ("%s."):format(i), "Identifier" },
{ (" %s: "):format(result.msg) },
{ result.val, "String" },
{ "\n" },
{ ('%s.'):format(i), 'Identifier' },
{ (' %s: '):format(result.msg) },
{ result.val, 'String' },
{ '\n' },
})
end
end
vim.api.nvim_echo(messages, false, {})
local result = results[vim.fn.getcharstr()]
if result and result.val and result.val ~= "" then
vim.fn.setreg("+", result.val)
if result and result.val and result.val ~= '' then
vim.fn.setreg('+', result.val)
end
end,
find_in_dir = function(state)
local node = state.tree:get_node()
local path = node:get_id()
require("telescope.builtin").find_files {
cwd = node.type == "directory" and path or vim.fn.fnamemodify(path, ":h"),
}
require('telescope.builtin').find_files({
cwd = node.type == 'directory' and path or vim.fn.fnamemodify(path, ':h'),
})
end,
},
window = {
width = 30,
mappings = {
["<space>"] = false, -- disable space until we figure out which-key disabling
["[b"] = "prev_source",
["]b"] = "next_source",
Y = "copy_selector",
h = "parent_or_close",
l = "child_or_open",
o = "open",
['<space>'] = false, -- disable space until we figure out which-key disabling
['[b'] = 'prev_source',
[']b'] = 'next_source',
Y = 'copy_selector',
h = 'parent_or_close',
l = 'child_or_open',
o = 'open',
},
},
filesystem = {
follow_current_file = true,
hijack_netrw_behavior = "open_current",
hijack_netrw_behavior = 'open_current',
use_libuv_file_watcher = true,
},
event_handlers = {
{
event = "neo_tree_buffer_enter",
handler = function(_) vim.opt_local.signcolumn = "auto" end,
event = 'neo_tree_buffer_enter',
handler = function(_)
vim.opt_local.signcolumn = 'auto'
end,
},
},
}

View file

@ -1,9 +1,34 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
return {
'ThePrimeagen/harpoon',
config = function()
require('harpoon').setup()
vim.keymap.set('n', '<leader>ha', require('harpoon.mark').add_file, { desc = '[H]arpoon [A]dd file' })
vim.keymap.set('n', '<leader>ht', require('harpoon.ui').toggle_quick_menu, { desc = '[H]arpoon [T]oggle quick menu' })
vim.keymap.set(
'n',
'<leader>ht',
require('harpoon.ui').toggle_quick_menu,
{ desc = '[H]arpoon [T]oggle quick menu' }
)
vim.keymap.set('n', '<leader>hn', require('harpoon.ui').nav_next, { desc = '[H]arpoon nav [N]ext' })
vim.keymap.set('n', '<leader>hp', require('harpoon.ui').nav_prev, { desc = '[H]arpoon nav [P]revious' })
vim.keymap.set('n', '<leader>h1', function()

View file

@ -1,10 +1,35 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-- You can add your own plugins here or in other files in this directory!
-- I promise not to create any merge conflicts in this directory :)
--
-- See the kickstart.nvim README for more information
return {
-- Add trouble.nvim plugin
{ 'folke/trouble.nvim', event = 'VimEnter', dependencies = { 'nvim-tree/nvim-web-devicons' }, config = function()
require('trouble').setup {}
end },
{
'folke/trouble.nvim',
event = 'VimEnter',
dependencies = { 'nvim-tree/nvim-web-devicons' },
config = function()
require('trouble').setup({})
end,
},
}

View file

@ -1,3 +1,28 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
if not vim then
return
end
local bufnr = vim.api.nvim_get_current_buf()
return {
-- local function map(mode, lhs, rhs, opts)
-- local options = { noremap=true, silent=true }
@ -7,31 +32,21 @@ return {
-- vim.api.nvim_set_keymap(mode, lhs, rhs, options)
-- end
vim.keymap.set('n', '<leader>ff', ":Telescope find_files<cr>", {}),
vim.keymap.set('n', '<leader>fg', ":Telescope live_grep<cr>", {}),
vim.keymap.set('n', '<leader>fb', ":Telescope buffers<cr>", {}),
vim.keymap.set('n', '<leader>fh', ":Telescope help_tags", {}),
vim.keymap.set('n', '<leader>ff', ':Telescope find_files<cr>', {}),
vim.keymap.set('n', '<leader>fg', ':Telescope live_grep<cr>', {}),
vim.keymap.set('n', '<leader>fb', ':Telescope buffers<cr>', {}),
vim.keymap.set('n', '<leader>fh', ':Telescope help_tags', {}),
-- map("n", "<s-h>", ":bn")
vim.keymap.set(
'n',
'<S-h>',
":bp<cr>",
{
buffer = bufnr,
desc = '[G]o to [P]revious Buffer'
}
),
vim.keymap.set('n', '<S-h>', ':bp<cr>', {
buffer = bufnr,
desc = '[G]o to [P]revious Buffer',
}),
-- map("n", "<s-l>", ":bp")
vim.keymap.set(
'n',
'<S-l>',
":bn<cr>",
{
buffer = bufnr,
desc = '[G]o to [N]ext Buffer'
}
)
vim.keymap.set('n', '<S-l>', ':bn<cr>', {
buffer = bufnr,
desc = '[G]o to [N]ext Buffer',
}),
-- map("n", "<leader>bq", ":Bdelete")
-- vim.keymap.set(

View file

@ -1,3 +1,23 @@
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-- python-debugging.lua: Debugging Python code with DAP
--
@ -45,7 +65,7 @@ return {
repl_definition = {
python = {
command = function()
local ipythonAvailable = vim.fn.executable 'ipython' == 1
local ipythonAvailable = vim.fn.executable('ipython') == 1
local binary = ipythonAvailable and 'ipython' or 'python3'
return { binary }
end,