refactor of nvim config

This commit is contained in:
Max Hohlfeld 2022-12-21 16:29:10 +01:00
parent 9914f9cc8d
commit aa33b73377
3 changed files with 206 additions and 195 deletions

View File

@ -5,49 +5,54 @@ local unmap = vim.api.nvim_del_keymap
local augroup = vim.api.nvim_create_augroup local augroup = vim.api.nvim_create_augroup
local autocmd = vim.api.nvim_create_autocmd local autocmd = vim.api.nvim_create_autocmd
local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' local install_path = fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim'
if fn.empty(fn.glob(install_path)) > 0 then if fn.empty(fn.glob(install_path)) > 0 then
fn.system({'git', 'clone', 'https://github.com/wbthomason/packer.nvim', install_path}) fn.system({ 'git', 'clone', 'https://github.com/wbthomason/packer.nvim', install_path })
vim.cmd 'packadd packer.nvim' vim.cmd 'packadd packer.nvim'
end end
require('packer').startup(function() require('packer').startup(function()
use 'wbthomason/packer.nvim' -- Package Manager use 'wbthomason/packer.nvim' -- Package Manager
use 'nvim-lua/plenary.nvim' -- Lua Library use 'nvim-lua/plenary.nvim' -- Lua Library
use 'neovim/nvim-lspconfig' -- Language Server Config use 'neovim/nvim-lspconfig' -- Language Server Config
use { use {
'hrsh7th/nvim-cmp', -- Completion 'hrsh7th/nvim-cmp', -- Completion
requires = { requires = {
'hrsh7th/cmp-buffer', -- Completion source buffer 'hrsh7th/cmp-buffer', -- Completion source buffer
'hrsh7th/cmp-nvim-lsp', -- Completion source LSP 'hrsh7th/cmp-nvim-lsp', -- Completion source LSP
'hrsh7th/cmp-path', -- Completion source filepaths 'hrsh7th/cmp-path', -- Completion source filepaths
'saadparwaiz1/cmp_luasnip', -- Completion source snippets 'hrsh7th/cmp-cmdline', -- Completion source for commandline
'ray-x/lsp_signature.nvim' -- Signature when typing 'saadparwaiz1/cmp_luasnip', -- Completion source snippets
'ray-x/lsp_signature.nvim' -- Signature when typing
} }
} }
use { 'L3MON4D3/LuaSnip' } -- Snippets use { 'L3MON4D3/LuaSnip' } -- Snippets
use { use {
'nvim-treesitter/nvim-treesitter', -- Syntax Highlighting 'nvim-treesitter/nvim-treesitter', -- Syntax Highlighting
run = ':TSUpdate' run = ':TSUpdate'
} }
use 'tpope/vim-commentary' -- Commentary use 'tpope/vim-commentary' -- Commentary
use 'tpope/vim-surround' -- Surrounding use 'tpope/vim-surround' -- Surrounding
use 'tpope/vim-repeat' -- Repeat Surrounding use 'tpope/vim-repeat' -- Repeat Surrounding
use "tversteeg/registers.nvim" -- Preview Registers use 'tpope/vim-sleuth' -- Detect Spacing
use 'windwp/nvim-autopairs' -- Autopairs use "tversteeg/registers.nvim" -- Preview Registers
use 'windwp/nvim-ts-autotag' -- HTML Autopairs use 'windwp/nvim-autopairs' -- Autopairs
use 'nvim-telescope/telescope.nvim' -- Fuzzy Finder use 'windwp/nvim-ts-autotag' -- HTML Autopairs
use 'tamago324/lir.nvim' -- Filebrowser use 'nvim-telescope/telescope.nvim' -- Fuzzy Finder
use 'jakewvincent/mkdnflow.nvim' -- Notetaking use 'tamago324/lir.nvim' -- Filebrowser
use 'davidgranstrom/nvim-markdown-preview' -- Markdown Livepreview use 'jakewvincent/mkdnflow.nvim' -- Notetaking
use 'xuhdev/vim-latex-live-preview' -- Latex Livepreview use 'davidgranstrom/nvim-markdown-preview' -- Markdown Livepreview
use 'norcalli/nvim-colorizer.lua' -- render Color Codes use 'xuhdev/vim-latex-live-preview' -- Latex Livepreview
use 'aklt/plantuml-syntax' -- Plantuml Syntax, till treesitter supports Plantuml use 'norcalli/nvim-colorizer.lua' -- render Color Codes
use 'aklt/plantuml-syntax' -- Plantuml Syntax, till treesitter supports Plantuml
use { use {
'rust-sailfish/sailfish', -- Sailfish Syntax 'rust-sailfish/sailfish', -- Sailfish Syntax
rtp = 'syntax/vim' rtp = 'syntax/vim'
} }
use 'ggandor/leap.nvim' -- Jump around in file
use 'mfussenegger/nvim-dap' -- Debugger Adapter Protocol
use 'rcarriga/nvim-dap-ui' -- UI for DAP
end) end)
-- General Editor Settings -- General Editor Settings
@ -66,11 +71,12 @@ opt.statusline = ' %f %r %m%=%y %{&fileencoding?&fileencoding:&encoding}[%{&file
opt.completeopt = 'menuone,noinsert,noselect' opt.completeopt = 'menuone,noinsert,noselect'
map('n', 'ZT', '<cmd>w<cr>', { noremap = true }) map('n', '<Space>w', '<cmd>w<cr>', { noremap = true })
map('n', '<Space>q', '<cmd>wq<cr>', { noremap = true })
map('n', 'ZO', '<cmd>!compiler %<cr>', { noremap = true }) map('n', 'ZO', '<cmd>!compiler %<cr>', { noremap = true })
map('n', 'ZK', '<cmd>!kdeconnect-cli -d 3993d52f1018a472 --share %<cr>', { noremap = true }) map('n', 'ZK', '<cmd>!kdeconnect-cli -d 3993d52f1018a472 --share %<cr>', { noremap = true })
map('n', '<leader>/', '<cmd>let @/ = ""<cr>', { noremap = true }) map('n', '<Esc><Esc>', '<cmd>let @/ = ""<cr>', { noremap = true })
map('n', '<leader>plp', '<cmd>!feh %:s?pu?png? &<cr>', {noremap = true}) map('n', '<leader>plp', '<cmd>!feh %:s?pu?png? &<cr>', { noremap = true })
-- Splits -- Splits
map('n', '<C-h>', '<C-w>h', { noremap = true }) map('n', '<C-h>', '<C-w>h', { noremap = true })
@ -83,27 +89,14 @@ opt.splitright = true
-- Identation with autocmd -- Identation with autocmd
augroup('programming', {}) augroup('programming', {})
autocmd('FileType', { autocmd({ 'BufNewFile', 'BufRead' }, {
group = 'programming', group = 'programming',
desc = 'Set identation to two spaces for filetypes in {pattern}', desc = 'Set Filetype to sailfish for .stpl files',
pattern = { 'lua', 'html', 'css', 'scss', 'sass', 'less', 'htmldjango', 'sailfish', 'typescript', 'typescriptreact', 'javascript', 'javascriptreact', 'haskell' }, pattern = { '*stpl' },
command = 'setlocal ts=2 sw=2 sts=2 expandtab' command = 'setlocal filetype=sailfish'
}) })
autocmd('FileType', {
group = 'programming',
desc = 'Set identation to one tab for filetypes in {pattern}',
pattern = { 'python' },
command = 'setlocal ts=4 sw=4 sts=4 expandtab'
})
autocmd({ 'BufNewFile', 'BufRead' }, {
group = 'programming',
desc = 'Set Filetype to sailfish for .stpl files',
pattern = { '*stpl' },
command = 'setlocal filetype=sailfish'
})
vim.cmd("au BufRead *.yaml,*.yml if search('hosts:\\|tasks:\\|ansible.builtin', 'nw') | set ft=yaml.ansible | endif") vim.cmd("au BufRead *.yaml,*.yml if search('hosts:\\|tasks:\\|ansible.builtin', 'nw') | set ft=yaml.ansible | endif")
-- Spellcheck -- Spellcheck
_G.enable_spell = function(lang) _G.enable_spell = function(lang)
vim.bo.spelllang = lang vim.bo.spelllang = lang
@ -111,11 +104,11 @@ _G.enable_spell = function(lang)
if lang ~= "" then if lang ~= "" then
vim.wo.spell = true vim.wo.spell = true
map('n', 'ff', ']s', { noremap = true}) map('n', 'ff', ']s', { noremap = true })
map('n', 'fF', '[s', { noremap = true}) map('n', 'fF', '[s', { noremap = true })
map('n', 'fa', 'zg', { noremap = true}) map('n', 'fa', 'zg', { noremap = true })
map('n', 'fn', 'z=', { noremap = true}) map('n', 'fn', 'z=', { noremap = true })
map('n', 'fd', 'zuw=', { noremap = true}) map('n', 'fd', 'zuw=', { noremap = true })
print(lang .. " spellcheck enabled") print(lang .. " spellcheck enabled")
else else
vim.wo.spell = false vim.wo.spell = false
@ -142,7 +135,7 @@ local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
-- Mappings. -- Mappings.
local opts = { noremap=true, silent=true } local opts = { noremap = true, silent = true }
-- See `:help vim.lsp.*` for documentation on any of the below functions -- See `:help vim.lsp.*` for documentation on any of the below functions
buf_set_keymap('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts) buf_set_keymap('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts)
@ -160,88 +153,74 @@ local on_attach = function(client, bufnr)
}, bufnr) }, bufnr)
end end
local runtime_path = vim.split(package.path, ';') local capabilities = require("cmp_nvim_lsp").default_capabilities()
table.insert(runtime_path, "lua/?.lua")
table.insert(runtime_path, "lua/?/init.lua") local servers = { 'rust_analyzer', 'texlab', 'pyright', 'tsserver', 'ccls', 'html', 'yamlls', 'ansiblels', 'csharp_ls',
'hls' }
for _, server in ipairs(servers) do
lsp[server].setup {
on_attach = on_attach,
capabilities = capabilities,
}
end
lsp.sumneko_lua.setup { lsp.sumneko_lua.setup {
cmd = {"lua-language-server"},
on_attach = on_attach, on_attach = on_attach,
capabilities = capabilities,
settings = { settings = {
Lua = { Lua = {
runtime = { runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT', version = 'LuaJIT',
path = runtime_path,
}, },
diagnostics = { diagnostics = {
globals = {'vim'}, -- Get the language server to recognize the `vim` global
globals = { 'vim' },
}, },
workspace = { workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api.nvim_get_runtime_file("", true), library = vim.api.nvim_get_runtime_file("", true),
}, },
-- Do not send telemetry data containing a randomized but unique identifier
telemetry = { telemetry = {
enable = false, enable = false,
}, },
}, },
} },
}
lsp.rust_analyzer.setup {
on_attach = on_attach,
}
lsp.texlab.setup {
on_attach = on_attach,
}
lsp.pyright.setup {
on_attach = on_attach,
}
lsp.tsserver.setup{
on_attach = on_attach,
}
lsp.ccls.setup {
on_attach = on_attach,
}
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = true
lsp.cssls.setup {
capabilities = capabilities,
on_attach = on_attach,
}
lsp.html.setup {
capabilities = capabilities,
on_attach = on_attach,
}
lsp.yamlls.setup {
capabilities = capabilities,
on_attach = on_attach,
}
lsp.ansiblels.setup {
capabilities = capabilities,
on_attach = on_attach,
}
lsp.csharp_ls.setup {
capabilities = capabilities,
on_attach = on_attach,
}
lsp.hls.setup {
capabilities = capabilities,
on_attach = on_attach,
} }
-- Autopairs -- Autopairs
require'nvim-ts-autotag'.setup() require 'nvim-ts-autotag'.setup()
require'nvim-autopairs'.setup{} require 'nvim-autopairs'.setup {}
-- Snippets
local ls = require('luasnip')
local types = require('luasnip.util.types')
ls.config.set_config({
history = true,
updateevents = "TextChanged,TextChangedI",
ext_opts = {
[types.choiceNode] = {
active = {
virt_text = { { "", "Function" } }
}
},
[types.insertNode] = {
active = {
virt_text = { { "", "Comment" } }
}
}
},
})
require("luasnip.loaders.from_lua").load({ paths = "~/.config/nvim/lua/snippets" })
local has_words_before = function()
unpack = unpack or table.unpack
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
-- Completion -- Completion
local cmp = require('cmp') local cmp = require('cmp')
@ -252,8 +231,35 @@ cmp.setup {
['<C-u>'] = cmp.mapping.scroll_docs(-4), ['<C-u>'] = cmp.mapping.scroll_docs(-4),
['<C-d>'] = cmp.mapping.scroll_docs(4), ['<C-d>'] = cmp.mapping.scroll_docs(4),
['<C-x>'] = cmp.mapping.abort(), ['<C-x>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({behavior = cmp.ConfirmBehavior.Insert, select = false }), ['<CR>'] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = false }),
['<C-Space>'] = cmp.mapping.confirm({behavior = cmp.ConfirmBehavior.Insert, select = true }) ['<C-Space>'] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = true }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif ls.expand_or_locally_jumpable() then
ls.expand_or_jump()
elseif has_words_before() then
cmp.complete()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif ls.locally_jumpable(-1) then
ls.jump(-1)
else
fallback()
end
end, { "i", "s" }),
['<C-e>'] = cmp.mapping(function(fallback)
if ls.choice_active() then
ls.change_choice(1)
else
fallback()
end
end, { 'i', 's' })
}, },
snippet = { snippet = {
expand = function(args) expand = function(args)
@ -261,63 +267,29 @@ cmp.setup {
end end
}, },
sources = { sources = {
{ name = 'luasnip'}, { name = 'luasnip' },
{ name = 'nvim_lsp' }, { name = 'nvim_lsp' },
{ name = 'path' }, { name = 'path' },
{ name = 'buffer' }, { name = 'buffer' },
} }
} }
-- Snippets cmp.setup.cmdline({ '/', '?' }, {
local ls = require('luasnip') mapping = cmp.mapping.preset.cmdline(),
local types = require('luasnip.util.types') sources = {
{ name = 'buffer' }
ls.config.set_config({ }
history = true,
updateevents = "TextChanged,TextChangedI",
ext_opts = {
[types.choiceNode] = {
active = {
virt_text = { { "[C]", "Comment" } },
},
},
[types.insertNode] = {
active = {
virt_text = { { "[I]", "Comment" } },
},
},
},
}) })
-- Helper Termcode wrapper -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
local to_term = function(str) cmp.setup.cmdline(':', {
return vim.api.nvim_replace_termcodes(str, true, true, true) mapping = cmp.mapping.preset.cmdline(),
end sources = cmp.config.sources({
{ name = 'path' }
_G.next_opt = function() }, {
if ls and ls.expand_or_jumpable() then { name = 'cmdline' }
return to_term "<Plug>luasnip-expand-or-jump" })
else })
return to_term "<Tab>"
end
end
_G.prev_opt = function()
if ls and ls.jumpable(-1) then
return to_term "<Plug>luasnip-jump-prev"
else
return to_term "<S-Tab>"
end
end
map("i", "<C-E>", "<Plug>luasnip-next-choice", {})
map("s", "<C-E>", "<Plug>luasnip-next-choice", {})
map("i", "<Tab>", "v:lua.next_opt()", {expr = true})
map("s", "<Tab>", "v:lua.next_opt()", {expr = true})
map("i", "<S-Tab>", "v:lua.prev_opt()", {expr = true})
map("s", "<S-Tab>", "v:lua.prev_opt()", {expr = true})
require("luasnip.loaders.from_lua").load({paths = "~/.config/nvim/lua/snippets"})
-- Treesitter -- Treesitter
require('nvim-treesitter.configs').setup { require('nvim-treesitter.configs').setup {
@ -332,10 +304,10 @@ require('nvim-treesitter.configs').setup {
} }
-- Telescope -- Telescope
map('n', '<Leader>ff', '<cmd>lua require("telescope.builtin").find_files()<cr>', {noremap = true}) map('n', '<Leader>ff', '<cmd>lua require("telescope.builtin").find_files()<cr>', { noremap = true })
map('n', '<leader>fg', '<cmd>lua require("telescope.builtin").live_grep()<cr>', {noremap = true}) map('n', '<leader>fg', '<cmd>lua require("telescope.builtin").live_grep()<cr>', { noremap = true })
map('n', '<leader>fb', '<cmd>lua require("telescope.builtin").buffers()<cr>', {noremap = true}) map('n', '<leader>fb', '<cmd>lua require("telescope.builtin").buffers()<cr>', { noremap = true })
map('n', '<leader>fh', '<cmd>lua require("telescope.builtin").help_tags()<cr>', {noremap = true}) map('n', '<leader>fh', '<cmd>lua require("telescope.builtin").help_tags()<cr>', { noremap = true })
-- Vimwiki -- Vimwiki
require('mkdnflow').setup({ require('mkdnflow').setup({
@ -344,7 +316,7 @@ require('mkdnflow').setup({
folds = false, folds = false,
}, },
mappings = { mappings = {
MkdnEnter = { {'i', 'n', 'v'}, '<CR>'} MkdnEnter = { { 'i', 'n', 'v' }, '<CR>' }
}, },
links = { links = {
transform_explicit = function(text) transform_explicit = function(text)
@ -360,17 +332,17 @@ autocmd('FileType', {
}) })
vim.wo.conceallevel = 2 vim.wo.conceallevel = 2
vim.keymap.set('n', '<bs>', ':edit #<cr>', { silent = true }) vim.keymap.set('n', '<bs>', ':edit #<cr>', { silent = true })
map('n', '<Leader>wf', '<cmd>lua require("telescope_customs").find_wiki()<cr>', {noremap = true}) map('n', '<Leader>wf', '<cmd>lua require("telescope_customs").find_wiki()<cr>', { noremap = true })
map('n', '<Leader>wg', '<cmd>lua require("telescope_customs").grep_wiki()<cr>', {noremap = true}) map('n', '<Leader>wg', '<cmd>lua require("telescope_customs").grep_wiki()<cr>', { noremap = true })
-- Markdown Live Preview -- Markdown Live Preview
vim.g.nvim_markdown_preview_format = 'markdown' vim.g.nvim_markdown_preview_format = 'markdown'
map('n', '<leader>mlp', '<cmd>MarkdownPreview<cr>', {noremap = true}) map('n', '<leader>mlp', '<cmd>MarkdownPreview<cr>', { noremap = true })
-- Latex Live Preview -- Latex Live Preview
vim.g.livepreview_previewer = 'zathura' vim.g.livepreview_previewer = 'zathura'
vim.g.livepreview_use_biber = 1 vim.g.livepreview_use_biber = 1
map('n', '<leader>llp', '<cmd>LLPStartPreview<cr>', {noremap = true}) map('n', '<leader>llp', '<cmd>LLPStartPreview<cr>', { noremap = true })
-- Lir Filebrowser -- Lir Filebrowser
local actions = require('lir.actions') local actions = require('lir.actions')
@ -383,16 +355,16 @@ require('lir').setup {
['<C-v>'] = actions.vsplit, ['<C-v>'] = actions.vsplit,
['<C-t>'] = actions.tabedit, ['<C-t>'] = actions.tabedit,
['h'] = actions.up, ['h'] = actions.up,
['q'] = actions.quit, ['q'] = actions.quit,
['K'] = actions.mkdir, ['K'] = actions.mkdir,
['N'] = actions.newfile, ['N'] = actions.newfile,
['R'] = actions.rename, ['R'] = actions.rename,
['@'] = actions.cd, ['@'] = actions.cd,
['Y'] = actions.yank_path, ['Y'] = actions.yank_path,
['.'] = actions.toggle_show_hidden, ['.'] = actions.toggle_show_hidden,
['x'] = actions.delete, ['x'] = actions.delete,
}, },
float = { float = {
winblend = 0, winblend = 0,
@ -418,13 +390,49 @@ vim.g.loaded_netrwPlugin = 1
require('colorizer').setup({ require('colorizer').setup({
'*'; '*';
}, { }, {
RGB = true; -- #RGB hex codes RGB = true; -- #RGB hex codes
RRGGBB = true; -- #RRGGBB hex codes RRGGBB = true; -- #RRGGBB hex codes
names = false; -- "Name" codes like Blue names = false; -- "Name" codes like Blue
RRGGBBAA = true; -- #RRGGBBAA hex codes RRGGBBAA = true; -- #RRGGBBAA hex codes
rgb_fn = true; -- CSS rgb() and rgba() functions rgb_fn = true; -- CSS rgb() and rgba() functions
hsl_fn = true; -- CSS hsl() and hsla() functions hsl_fn = true; -- CSS hsl() and hsla() functions
css = false; -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB css = false; -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB
css_fn = false; -- Enable all CSS *functions*: rgb_fn, hsl_fn css_fn = false; -- Enable all CSS *functions*: rgb_fn, hsl_fn
mode = 'background'; -- Set the display mode. mode = 'background'; -- Set the display mode.
}) })
-- Leap
require('leap').add_default_mappings()
-- Debugger Adapter Protocol
local dap = require('dap')
dap.adapters.codelldb = {
type = 'server',
port = "${port}",
executable = {
command = '/usr/bin/codelldb',
args = { "--port", "${port}" },
}
}
dap.configurations.rust = {
{
name = "Launch file",
type = "codelldb",
request = "launch",
program = function()
return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file')
end,
cwd = '${workspaceFolder}',
stopOnEntry = false,
},
}
map('n', '<Leader>dc', '<cmd>lua require"dap".continue()<cr>', { noremap = true })
map('n', '<Leader>db', '<cmd>lua require"dap".toggle_breakpoint()<cr>', { noremap = true })
map('n', '<Leader>do', '<cmd>lua require"dap".step_over()<cr>', { noremap = true })
map('n', '<Leader>di', '<cmd>lua require"dap".step_into()<cr>', { noremap = true })
require("dapui").setup()
map('n', '<Leader>dd', '<cmd>lua require"dapui".toggle()<cr>', { noremap = true })

View File

@ -64,3 +64,4 @@
# TODO ansible-language-server AUR # TODO ansible-language-server AUR
# TODO csharp-ls dotnet tool # TODO csharp-ls dotnet tool
# TODO vscode-langservers-extracted AUR # TODO vscode-langservers-extracted AUR
# TODO codelldb-bin AUR -> C/C++/Rust Debugger

View File

@ -80,6 +80,8 @@ topicItems =
, TI "InternalVertecApi" "~/projekte/InternalVertecAPI" (switchToLayout "Programming" *> spawn "rider ~/projekte/InternalVertecAPI/InternalVertecAPI.sln") , TI "InternalVertecApi" "~/projekte/InternalVertecAPI" (switchToLayout "Programming" *> spawn "rider ~/projekte/InternalVertecAPI/InternalVertecAPI.sln")
, TI "Abwesenheitskalender_Frontend" "~/projekte/Abwesenheitskalender_Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor) , TI "Abwesenheitskalender_Frontend" "~/projekte/Abwesenheitskalender_Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor)
, TI "aoc" "~/projekte/aoc" (switchToLayout "Programming" *> spawnShell *> spawnEditor) , TI "aoc" "~/projekte/aoc" (switchToLayout "Programming" *> spawnShell *> spawnEditor)
, TI "STracker_Frontend" "~/projekte/SchulungsTracker/Frontend" (switchToLayout "Programming" *> spawnShellAndExecute "npm start" *> spawnShell *> spawnEditor)
, TI "STracker_Backend" "~/projekte/SchulungsTracker/Backend" (switchToLayout "Full" *> spawnShellAndExecute "rider ~/projekte/SchulungsTracker/Backend/Schulungstracker.backend.sln")
] ]
myTopicConfig :: TopicConfig myTopicConfig :: TopicConfig