mirror of
https://git.sr.ht/~coasteen/dotfiles
synced 2025-11-04 14:47:38 +01:00
suicide
This commit is contained in:
parent
33fc8e201c
commit
74f880a769
6 changed files with 121 additions and 655 deletions
|
|
@ -1,4 +1,3 @@
|
|||
;; package setup
|
||||
(require 'package)
|
||||
(setq package-archives
|
||||
'(("gnu" . "https://elpa.gnu.org/packages/")
|
||||
|
|
@ -8,12 +7,9 @@
|
|||
(package-refresh-contents))
|
||||
(require 'use-package)
|
||||
|
||||
;; UI & Appearance
|
||||
(menu-bar-mode -1)
|
||||
(tool-bar-mode -1)
|
||||
(scroll-bar-mode -1)
|
||||
(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
|
||||
(add-to-list 'default-frame-alist '(alpha . (90 . 90)))
|
||||
(global-display-line-numbers-mode 1)
|
||||
(global-hl-line-mode 1)
|
||||
|
||||
|
|
@ -21,31 +17,70 @@
|
|||
(use-package all-the-icons :ensure t :if (display-graphic-p))
|
||||
(use-package elcord :ensure t :config (elcord-mode 1))
|
||||
|
||||
(load-theme 'doom-badger t)
|
||||
;; get rid of stupid buffer saves
|
||||
(load-theme 'doom-gruvbox t)
|
||||
|
||||
(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
|
||||
(add-to-list 'default-frame-alist '(alpha . (90 . 90)))
|
||||
|
||||
(set-face-attribute 'default nil :family "Fira Code" :height 130)
|
||||
|
||||
(custom-set-faces
|
||||
'(mode-line ((t (:inherit mode-line :background "#3c3836" :foreground "#ebdbb2"))))
|
||||
'(mode-line-inactive ((t (:inherit mode-line-inactive :background "#282828" :foreground "#a89984")))))
|
||||
|
||||
|
||||
(setq backup-directory-alist
|
||||
`((".*" . "~/.local/tmp/emacsbackup/")))
|
||||
(setq make-backup-files t)
|
||||
(setq backup-by-copying t)
|
||||
|
||||
;; Sidebar
|
||||
(use-package evil
|
||||
:ensure t
|
||||
:init
|
||||
(setq evil-want-keybinding nil)
|
||||
(setq evil-want-C-u-scroll t)
|
||||
:config
|
||||
(evil-mode 1))
|
||||
|
||||
(use-package evil-collection
|
||||
:after evil
|
||||
:ensure t
|
||||
:config
|
||||
(evil-collection-init))
|
||||
|
||||
(use-package neotree :ensure t :bind ("<f9>" . neotree-toggle))
|
||||
|
||||
;; Completion/UI stuff
|
||||
(use-package vertico :ensure t :config (vertico-mode 1))
|
||||
(use-package vertico
|
||||
:ensure t
|
||||
:init
|
||||
(evil-collection-vertico-setup)
|
||||
:config
|
||||
(vertico-mode 1))
|
||||
|
||||
(use-package marginalia :ensure t :hook (vertico-mode . marginalia-mode))
|
||||
(use-package consult :ensure t
|
||||
:bind (("C-s" . consult-line) ("C-x b" . consult-buffer)))
|
||||
|
||||
(use-package consult
|
||||
:ensure t
|
||||
:bind (("C-s" . consult-line) ("C-x b" . consult-buffer))
|
||||
:init
|
||||
(evil-collection-consult-setup))
|
||||
|
||||
(use-package which-key :ensure t :config (which-key-mode 1))
|
||||
(use-package swiper :ensure t :bind ("C-s" . swiper))
|
||||
|
||||
;; Completion etc.
|
||||
(use-package evil-surround
|
||||
:ensure t
|
||||
:config
|
||||
(global-evil-surround-mode 1))
|
||||
|
||||
(use-package evil-commentary
|
||||
:ensure t
|
||||
:config
|
||||
(evil-commentary-mode))
|
||||
|
||||
(use-package company :ensure t :hook (prog-mode . company-mode))
|
||||
(use-package yasnippet :ensure t :hook (prog-mode . yas-minor-mode))
|
||||
(use-package flycheck :ensure t :hook (prog-mode . flycheck-mode))
|
||||
|
||||
;; LSP
|
||||
(use-package lsp-mode
|
||||
:ensure t
|
||||
:commands lsp
|
||||
|
|
@ -57,10 +92,8 @@
|
|||
:ensure t
|
||||
:config (require 'lsp-java-boot))
|
||||
|
||||
;; Terminal
|
||||
(global-set-key (kbd "C-c t") 'ansi-term)
|
||||
|
||||
;; HTML/CSS/JS
|
||||
(use-package web-mode
|
||||
:ensure t
|
||||
:mode "\\.html?\\'"
|
||||
|
|
@ -75,12 +108,10 @@
|
|||
:config
|
||||
(setq emmet-expand-jsx-className? t))
|
||||
|
||||
;; auto-pairs
|
||||
(electric-pair-mode 1)
|
||||
(setq electric-pair-pairs '((?\" . ?\") (?\{ . ?\}) (?\( . ?\)) (?\[ . ?\]) (?\< . ?\>)))
|
||||
(setq electric-pair-text-pairs electric-pair-pairs)
|
||||
|
||||
;; LANGUAGESSSS
|
||||
(use-package nix-mode :ensure t :mode "\\.nix\\'")
|
||||
(use-package python :mode "\\.py\\'")
|
||||
(use-package sh-script :mode "\\.sh\\'")
|
||||
|
|
@ -95,22 +126,14 @@
|
|||
(use-package typescript-mode :ensure t :mode "\\.ts\\'")
|
||||
(use-package toml-mode :ensure t :mode "\\.toml\\'")
|
||||
(use-package yaml-mode :ensure t :mode "\\.ya?ml\\'")
|
||||
|
||||
(custom-set-variables
|
||||
;; custom-set-variables was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
'(package-selected-packages
|
||||
'(all-the-icons company consult darcula-theme doom-modeline
|
||||
doom-themes elcord emmet-mode fennel-mode flycheck
|
||||
gemini-mode go-mode lsp-java lsp-ui lua-mode
|
||||
macrostep marginalia neotree nix-mode rainbow-mode
|
||||
rust-mode solarized-theme swiper toml-mode
|
||||
typescript-mode vertico vterm web-mode yaml-mode
|
||||
yasnippet zig-mode)))
|
||||
(custom-set-faces
|
||||
;; custom-set-faces was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
'(package-selected-packages
|
||||
'(all-the-icons company consult doom-modeline
|
||||
doom-themes elcord emmet-mode fennel-mode flycheck
|
||||
go-mode lsp-java lsp-ui lua-mode
|
||||
macrostep marginalia neotree nix-mode rainbow-mode
|
||||
rust-mode swiper toml-mode
|
||||
typescript-mode vertico web-mode yaml-mode
|
||||
yasnippet zig-mode evil evil-collection evil-surround evil-commentary)))
|
||||
(custom-set-faces)
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
all: lua/config.lua
|
||||
|
||||
lua/%.lua: fnl/%.fnl
|
||||
fennel --compile $< > $@
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
(fn setup-qol []
|
||||
(set vim.o.swapfile false)
|
||||
(set vim.o.backup false)
|
||||
(set vim.o.undofile true)
|
||||
|
||||
(set vim.o.updatetime 200)
|
||||
(set vim.o.timeoutlen 300)
|
||||
|
||||
(set vim.wo.number true)
|
||||
(set vim.wo.relativenumber true)
|
||||
|
||||
(set vim.o.clipboard "unnamedplus")
|
||||
|
||||
(set vim.o.splitright true)
|
||||
(set vim.o.splitbelow true)
|
||||
|
||||
(set vim.o.tabstop 4)
|
||||
(set vim.o.shiftwidth 4)
|
||||
(set vim.o.expandtab true)
|
||||
(set vim.o.smartindent true)
|
||||
|
||||
(set vim.o.autochdir true)
|
||||
|
||||
(vim.api.nvim_create_autocmd
|
||||
:BufReadPost
|
||||
{:callback
|
||||
#(let [line (vim.fn.line "'\"")
|
||||
last (vim.fn.line "$")]
|
||||
(when (and (> line 1) (< line last))
|
||||
(vim.api.nvim_win_set_cursor 0 [line 0])))})
|
||||
|
||||
(vim.api.nvim_create_autocmd
|
||||
:TextYankPost
|
||||
{:pattern "*"
|
||||
:callback #(vim.highlight.on_yank {:higroup "IncSearch" :timeout 200})})
|
||||
|
||||
(vim.api.nvim_create_autocmd
|
||||
:BufWritePre
|
||||
{:pattern "*"
|
||||
:callback #(vim.cmd "silent! %s/\\s\\+$//e")})
|
||||
|
||||
(vim.api.nvim_create_autocmd
|
||||
:FileType
|
||||
{:pattern ["qf" "help" "man" "lspinfo"]
|
||||
:callback #(vim.keymap.set "n" "q" ":close<CR>" {:buffer true :silent true})})
|
||||
|
||||
(set vim.o.showmode false)
|
||||
|
||||
(set vim.g.netrw_banner 0)
|
||||
(set vim.g.netrw_liststyle 3)
|
||||
(set vim.g.netrw_winsize 25)
|
||||
|
||||
(vim.cmd "colorscheme gruvbox")
|
||||
)
|
||||
|
||||
(fn setup-lsp []
|
||||
(local lspconfig (require "lspconfig"))
|
||||
(local mason (require "mason"))
|
||||
(local mason_lspconfig (require "mason-lspconfig"))
|
||||
(local cmp_nvim_lsp (require "cmp_nvim_lsp"))
|
||||
|
||||
(mason.setup {})
|
||||
(mason_lspconfig.setup
|
||||
{:ensure_installed ["pyright" "lua_ls" "bashls" "tsserver"]
|
||||
:automatic_installation true})
|
||||
|
||||
(local on_attach (fn [client bufnr]
|
||||
(local opts {:noremap true :silent true :buffer bufnr})
|
||||
|
||||
(vim.keymap.set "n" "gd" (fn [] (vim.lsp.buf.definition)) opts)
|
||||
(vim.keymap.set "n" "K" (fn [] (vim.lsp.buf.hover)) opts)
|
||||
(vim.keymap.set "n" "gi" (fn [] (vim.lsp.buf.implementation)) opts)
|
||||
(vim.keymap.set "n" "<leader>rn" (fn [] (vim.lsp.buf.rename)) opts)
|
||||
(vim.keymap.set "n" "<leader>ca" (fn [] (vim.lsp.buf.code_action)) opts)
|
||||
(vim.keymap.set "n" "gr" (fn [] (vim.lsp.buf.references)) opts)
|
||||
(vim.keymap.set "n" "<leader>f" (fn [] (vim.lsp.buf.format {:async true})) opts)
|
||||
))
|
||||
|
||||
(local capabilities (cmp_nvim_lsp.default_capabilities) ())
|
||||
|
||||
(for _, server in ipairs ["pyright" "bashls" "tsserver"]
|
||||
(lspconfig[server].setup
|
||||
{:on_attach on_attach
|
||||
:capabilities capabilities}))
|
||||
|
||||
(lspconfig.lua_ls.setup
|
||||
{:on_attach on_attach
|
||||
:capabilities capabilities
|
||||
:settings
|
||||
{:Lua
|
||||
{:diagnostics {:globals ["vim"]}
|
||||
:workspace
|
||||
{:library (vim.api.nvim_get_runtime_file "" true)
|
||||
:checkThirdParty false}
|
||||
:telemetry {:enable false}}}}))
|
||||
|
||||
(setup-qol)
|
||||
(setup-lsp)
|
||||
|
|
@ -1,231 +0,0 @@
|
|||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||
if not vim.loop.fs_stat(lazypath) then
|
||||
vim.fn.system({
|
||||
"git",
|
||||
"clone",
|
||||
"--filter=blob:none",
|
||||
"https://github.com/folke/lazy.nvim.git",
|
||||
"--branch=stable",
|
||||
lazypath,
|
||||
})
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
-- PREPEND YOUR LOCAL CONFIG PATH TO package.path for patched project_nvim.project
|
||||
local config_path = vim.fn.stdpath("config") .. "/lua/?.lua;" .. vim.fn.stdpath("config") .. "/lua/?/init.lua;"
|
||||
package.path = config_path .. package.path
|
||||
|
||||
require("lazy").setup({
|
||||
|
||||
-- colorscheme plugin
|
||||
{
|
||||
"morhetz/gruvbox",
|
||||
lazy = false,
|
||||
},
|
||||
|
||||
-- startup screen
|
||||
{
|
||||
"goolord/alpha-nvim",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
},
|
||||
|
||||
-- icons
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
|
||||
-- fuzzy finder
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
config = function()
|
||||
require("telescope").setup {
|
||||
defaults = {
|
||||
layout_strategy = "horizontal",
|
||||
sorting_strategy = "ascending",
|
||||
prompt_prefix = "🔍 ",
|
||||
}
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- treesitter
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = ":TSUpdate",
|
||||
config = function()
|
||||
require("nvim-treesitter.configs").setup {
|
||||
ensure_installed = { "lua", "python", "bash", "javascript", "json" },
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- statusline
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
config = function()
|
||||
require("lualine").setup {
|
||||
options = {
|
||||
theme = "gruvbox",
|
||||
icons_enabled = false,
|
||||
section_separators = "",
|
||||
component_separators = "",
|
||||
},
|
||||
sections = {
|
||||
lualine_a = { "mode" },
|
||||
lualine_b = { "branch" },
|
||||
lualine_c = { "filename" },
|
||||
lualine_x = { "filetype" },
|
||||
lualine_y = { "progress" },
|
||||
lualine_z = { "location" },
|
||||
},
|
||||
inactive_sections = {
|
||||
lualine_c = { "filename" },
|
||||
lualine_x = { "location" },
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- git signs
|
||||
{
|
||||
"lewis6991/gitsigns.nvim",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
config = function()
|
||||
require("gitsigns").setup()
|
||||
end,
|
||||
},
|
||||
|
||||
-- commenting helper
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
config = function()
|
||||
require("Comment").setup()
|
||||
end,
|
||||
},
|
||||
|
||||
-- autopairs
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
config = function()
|
||||
require("nvim-autopairs").setup{}
|
||||
end,
|
||||
},
|
||||
|
||||
-- project management (patched)
|
||||
{
|
||||
"ahmedkhalf/project.nvim",
|
||||
config = function()
|
||||
-- Force reload patched project module before setup
|
||||
package.loaded["project_nvim.project"] = nil
|
||||
package.loaded["project_nvim"] = nil
|
||||
|
||||
require("project_nvim").setup {}
|
||||
require("telescope").load_extension("projects")
|
||||
end,
|
||||
},
|
||||
|
||||
-- bufferline
|
||||
{
|
||||
"akinsho/bufferline.nvim",
|
||||
dependencies = "nvim-tree/nvim-web-devicons",
|
||||
config = function()
|
||||
require("bufferline").setup {
|
||||
options = {
|
||||
separator_style = "slant",
|
||||
show_close_icon = false,
|
||||
show_buffer_close_icons = false,
|
||||
diagnostics = "nvim_lsp",
|
||||
}
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- which-key
|
||||
{
|
||||
"folke/which-key.nvim",
|
||||
config = function()
|
||||
require("which-key").setup {}
|
||||
end,
|
||||
},
|
||||
|
||||
-- LSP and completion
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
config = true,
|
||||
},
|
||||
{
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
dependencies = { "williamboman/mason.nvim", "neovim/nvim-lspconfig" },
|
||||
config = true,
|
||||
},
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
},
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"hrsh7th/cmp-buffer",
|
||||
"hrsh7th/cmp-path",
|
||||
"hrsh7th/cmp-cmdline",
|
||||
"L3MON4D3/LuaSnip",
|
||||
"saadparwaiz1/cmp_luasnip",
|
||||
},
|
||||
config = function()
|
||||
local cmp = require("cmp")
|
||||
local luasnip = require("luasnip")
|
||||
|
||||
cmp.setup {
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
luasnip.lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
["<C-b>"] = cmp.mapping.scroll_docs(-4),
|
||||
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
||||
["<C-Space>"] = cmp.mapping.complete(),
|
||||
["<C-e>"] = cmp.mapping.abort(),
|
||||
["<CR>"] = cmp.mapping.confirm({ select = true }),
|
||||
}),
|
||||
sources = cmp.config.sources({
|
||||
{ name = "nvim_lsp" },
|
||||
{ name = "luasnip" },
|
||||
}, {
|
||||
{ name = "buffer" },
|
||||
}),
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
})
|
||||
|
||||
-- Your existing vim options (you can keep or remove as you want)
|
||||
vim.o.swapfile = false
|
||||
vim.o.backup = false
|
||||
vim.o.undofile = true
|
||||
vim.o.updatetime = 200
|
||||
vim.o.timeoutlen = 300
|
||||
|
||||
vim.wo.number = true
|
||||
vim.wo.relativenumber = true
|
||||
|
||||
vim.o.clipboard = "unnamedplus"
|
||||
|
||||
vim.o.splitright = true
|
||||
vim.o.splitbelow = true
|
||||
|
||||
vim.o.tabstop = 4
|
||||
vim.o.shiftwidth = 4
|
||||
vim.o.expandtab = true
|
||||
vim.o.smartindent = true
|
||||
|
||||
vim.o.autochdir = true
|
||||
vim.o.showmode = false
|
||||
|
||||
-- Load your fennel config file safely
|
||||
pcall(require, "config")
|
||||
|
||||
vim.cmd("colorscheme gruvbox")
|
||||
62
config/nvim/init.vim
Normal file
62
config/nvim/init.vim
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
set nocompatible
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
set encoding=utf-8
|
||||
set number relativenumber
|
||||
set numberwidth=4
|
||||
set tabstop=4 shiftwidth=4 expandtab smartindent nowrap
|
||||
set incsearch hlsearch ignorecase smartcase
|
||||
set mouse=a
|
||||
set scrolloff=5
|
||||
set cursorline
|
||||
set noshowmode
|
||||
set shortmess+=I
|
||||
|
||||
hi Normal guibg=NONE ctermbg=NONE guifg=#d7c49a ctermfg=180
|
||||
hi NormalNC guibg=NONE ctermbg=NONE guifg=#b2996e ctermfg=137
|
||||
hi LineNr guibg=NONE ctermbg=NONE guifg=#a67c00 ctermfg=136
|
||||
hi CursorLine guibg=#4b3621 ctermbg=59 guifg=NONE ctermfg=NONE
|
||||
hi VertSplit guibg=NONE ctermbg=NONE guifg=#5a3e1b ctermfg=94
|
||||
hi StatusLine guibg=#3e2f1c guifg=#f0d38c ctermbg=59 ctermfg=223
|
||||
hi StatusLineMode guibg=#d35400 guifg=#3e2f1c ctermbg=166 ctermfg=59 gui=bold
|
||||
hi Visual guibg=#7f5f2a guifg=NONE ctermbg=136 ctermfg=NONE
|
||||
hi VisualNOS guibg=#7f5f2a guifg=NONE ctermbg=136 ctermfg=NONE
|
||||
hi VisualSB guibg=#7f5f2a guifg=NONE ctermbg=136 ctermfg=NONE
|
||||
hi Search guibg=NONE ctermbg=NONE guifg=#d35400 ctermfg=166
|
||||
hi IncSearch guibg=NONE ctermbg=NONE guifg=#f39c12 ctermfg=214
|
||||
hi Pmenu guibg=NONE ctermbg=NONE guifg=#d7c49a ctermfg=180
|
||||
hi PmenuSel guibg=NONE ctermbg=NONE guifg=#3e2f1c ctermfg=59
|
||||
hi WildMenu guibg=NONE ctermbg=NONE guifg=#f39c12 ctermfg=214
|
||||
hi Folded guibg=NONE ctermbg=NONE guifg=#a67c00 ctermfg=136
|
||||
hi SignColumn guibg=NONE ctermbg=NONE guifg=#a35400 ctermfg=172
|
||||
|
||||
function! ModeName()
|
||||
let modeval = mode()
|
||||
return modeval ==# 'n' ? 'NML ' :
|
||||
\ modeval ==# 'i' ? 'INT ' :
|
||||
\ modeval ==# 'v' ? 'VSL ' :
|
||||
\ modeval ==# 'V' ? 'VLI ' :
|
||||
\ modeval ==# "\<C-v>" ? 'VBL ' :
|
||||
\ modeval ==# 'R' ? 'RPL ' :
|
||||
\ modeval ==# 'c' ? 'CMD ' :
|
||||
\ 'UNKNOWN'
|
||||
endfunction
|
||||
|
||||
set statusline=
|
||||
set statusline+=%#StatusLineMode#
|
||||
set statusline+=\ %{ModeName()}
|
||||
set statusline+=%#StatusLine#
|
||||
set statusline+=\ %f\ %m\ %r\ %y
|
||||
set statusline+=%=
|
||||
set statusline+=\ Ln:%l/%L\ Col:%c\ \[%p%%]
|
||||
|
||||
let mapleader = "\<Space>"
|
||||
nnoremap <leader>w \:w<CR>
|
||||
nnoremap <leader>q \:q<CR>
|
||||
nnoremap <silent> <leader>h \:nohlsearch<CR>
|
||||
nnoremap <leader>n \:set relativenumber!<CR>
|
||||
nnoremap <C-h> <C-w>h
|
||||
nnoremap <C-j> <C-w>j
|
||||
nnoremap <C-k> <C-w>k
|
||||
nnoremap <C-l> <C-w>l
|
||||
|
||||
|
|
@ -1,286 +0,0 @@
|
|||
local config = require("project_nvim.config")
|
||||
local history = require("project_nvim.utils.history")
|
||||
local glob = require("project_nvim.utils.globtopattern")
|
||||
local path = require("project_nvim.utils.path")
|
||||
local uv = vim.loop
|
||||
local M = {}
|
||||
|
||||
-- Internal states
|
||||
M.attached_lsp = false
|
||||
M.last_project = nil
|
||||
|
||||
function M.find_lsp_root()
|
||||
-- Get lsp client for current buffer
|
||||
-- Returns nil or string
|
||||
local buf_ft = vim.api.nvim_buf_get_option(0, "filetype")
|
||||
local clients = vim.lsp.get_clients({bufnr = 0})
|
||||
if next(clients) == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
for _, client in pairs(clients) do
|
||||
local filetypes = client.config.filetypes
|
||||
if filetypes and vim.tbl_contains(filetypes, buf_ft) then
|
||||
if not vim.tbl_contains(config.options.ignore_lsp, client.name) then
|
||||
return client.config.root_dir, client.name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function M.find_pattern_root()
|
||||
local search_dir = vim.fn.expand("%:p:h", true)
|
||||
if vim.fn.has("win32") > 0 then
|
||||
search_dir = search_dir:gsub("\\", "/")
|
||||
end
|
||||
|
||||
local last_dir_cache = ""
|
||||
local curr_dir_cache = {}
|
||||
|
||||
local function get_parent(path)
|
||||
path = path:match("^(.*)/")
|
||||
if path == "" then
|
||||
path = "/"
|
||||
end
|
||||
return path
|
||||
end
|
||||
|
||||
local function get_files(file_dir)
|
||||
last_dir_cache = file_dir
|
||||
curr_dir_cache = {}
|
||||
|
||||
local dir = uv.fs_scandir(file_dir)
|
||||
if dir == nil then
|
||||
return
|
||||
end
|
||||
|
||||
while true do
|
||||
local file = uv.fs_scandir_next(dir)
|
||||
if file == nil then
|
||||
return
|
||||
end
|
||||
|
||||
table.insert(curr_dir_cache, file)
|
||||
end
|
||||
end
|
||||
|
||||
local function is(dir, identifier)
|
||||
dir = dir:match(".*/(.*)")
|
||||
return dir == identifier
|
||||
end
|
||||
|
||||
local function sub(dir, identifier)
|
||||
local path = get_parent(dir)
|
||||
while true do
|
||||
if is(path, identifier) then
|
||||
return true
|
||||
end
|
||||
local current = path
|
||||
path = get_parent(path)
|
||||
if current == path then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function child(dir, identifier)
|
||||
local path = get_parent(dir)
|
||||
return is(path, identifier)
|
||||
end
|
||||
|
||||
local function has(dir, identifier)
|
||||
if last_dir_cache ~= dir then
|
||||
get_files(dir)
|
||||
end
|
||||
local pattern = glob.globtopattern(identifier)
|
||||
for _, file in ipairs(curr_dir_cache) do
|
||||
if file:match(pattern) ~= nil then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function match(dir, pattern)
|
||||
local first_char = pattern:sub(1, 1)
|
||||
if first_char == "=" then
|
||||
return is(dir, pattern:sub(2))
|
||||
elseif first_char == "^" then
|
||||
return sub(dir, pattern:sub(2))
|
||||
elseif first_char == ">" then
|
||||
return child(dir, pattern:sub(2))
|
||||
else
|
||||
return has(dir, pattern)
|
||||
end
|
||||
end
|
||||
|
||||
-- breadth-first search
|
||||
while true do
|
||||
for _, pattern in ipairs(config.options.patterns) do
|
||||
local exclude = false
|
||||
if pattern:sub(1, 1) == "!" then
|
||||
exclude = true
|
||||
pattern = pattern:sub(2)
|
||||
end
|
||||
if match(search_dir, pattern) then
|
||||
if exclude then
|
||||
break
|
||||
else
|
||||
return search_dir, "pattern " .. pattern
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local parent = get_parent(search_dir)
|
||||
if parent == search_dir or parent == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
search_dir = parent
|
||||
end
|
||||
end
|
||||
|
||||
---@diagnostic disable-next-line: unused-local
|
||||
local on_attach_lsp = function(client, bufnr)
|
||||
M.on_buf_enter() -- Recalculate root dir after lsp attaches
|
||||
end
|
||||
|
||||
function M.attach_to_lsp()
|
||||
if M.attached_lsp then
|
||||
return
|
||||
end
|
||||
|
||||
local _start_client = vim.lsp.start_client
|
||||
vim.lsp.start_client = function(lsp_config)
|
||||
if lsp_config.on_attach == nil then
|
||||
lsp_config.on_attach = on_attach_lsp
|
||||
else
|
||||
local _on_attach = lsp_config.on_attach
|
||||
lsp_config.on_attach = function(client, bufnr)
|
||||
on_attach_lsp(client, bufnr)
|
||||
_on_attach(client, bufnr)
|
||||
end
|
||||
end
|
||||
return _start_client(lsp_config)
|
||||
end
|
||||
|
||||
M.attached_lsp = true
|
||||
end
|
||||
|
||||
function M.set_pwd(dir, method)
|
||||
if dir ~= nil then
|
||||
M.last_project = dir
|
||||
table.insert(history.session_projects, dir)
|
||||
|
||||
if vim.fn.getcwd() ~= dir then
|
||||
local scope_chdir = config.options.scope_chdir
|
||||
if scope_chdir == 'global' then
|
||||
vim.api.nvim_set_current_dir(dir)
|
||||
elseif scope_chdir == 'tab' then
|
||||
vim.cmd('tcd ' .. dir)
|
||||
elseif scope_chdir == 'win' then
|
||||
vim.cmd('lcd ' .. dir)
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
if config.options.silent_chdir == false then
|
||||
vim.notify("Set CWD to " .. dir .. " using " .. method)
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function M.get_project_root()
|
||||
-- returns project root, as well as method
|
||||
for _, detection_method in ipairs(config.options.detection_methods) do
|
||||
if detection_method == "lsp" then
|
||||
local root, lsp_name = M.find_lsp_root()
|
||||
if root ~= nil then
|
||||
return root, '"' .. lsp_name .. '"' .. " lsp"
|
||||
end
|
||||
elseif detection_method == "pattern" then
|
||||
local root, method = M.find_pattern_root()
|
||||
if root ~= nil then
|
||||
return root, method
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function M.is_file()
|
||||
local buf_type = vim.api.nvim_buf_get_option(0, "buftype")
|
||||
|
||||
local whitelisted_buf_type = { "", "acwrite" }
|
||||
local is_in_whitelist = false
|
||||
for _, wtype in ipairs(whitelisted_buf_type) do
|
||||
if buf_type == wtype then
|
||||
is_in_whitelist = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not is_in_whitelist then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function M.on_buf_enter()
|
||||
if vim.v.vim_did_enter == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
if not M.is_file() then
|
||||
return
|
||||
end
|
||||
|
||||
local current_dir = vim.fn.expand("%:p:h", true)
|
||||
if not path.exists(current_dir) or path.is_excluded(current_dir) then
|
||||
return
|
||||
end
|
||||
|
||||
local root, method = M.get_project_root()
|
||||
M.set_pwd(root, method)
|
||||
end
|
||||
|
||||
function M.add_project_manually()
|
||||
local current_dir = vim.fn.expand("%:p:h", true)
|
||||
M.set_pwd(current_dir, 'manual')
|
||||
end
|
||||
|
||||
function M.init()
|
||||
local autocmds = {}
|
||||
if not config.options.manual_mode then
|
||||
autocmds[#autocmds + 1] = 'autocmd VimEnter,BufEnter * ++nested lua require("project_nvim.project").on_buf_enter()'
|
||||
|
||||
if vim.tbl_contains(config.options.detection_methods, "lsp") then
|
||||
M.attach_to_lsp()
|
||||
end
|
||||
end
|
||||
|
||||
vim.cmd([[
|
||||
command! ProjectRoot lua require("project_nvim.project").on_buf_enter()
|
||||
command! AddProject lua require("project_nvim.project").add_project_manually()
|
||||
]])
|
||||
|
||||
autocmds[#autocmds + 1] =
|
||||
'autocmd VimLeavePre * lua require("project_nvim.utils.history").write_projects_to_history()'
|
||||
|
||||
vim.cmd([[augroup project_nvim
|
||||
au!
|
||||
]])
|
||||
for _, value in ipairs(autocmds) do
|
||||
vim.cmd(value)
|
||||
end
|
||||
vim.cmd("augroup END")
|
||||
|
||||
history.read_projects_from_history()
|
||||
end
|
||||
|
||||
return M
|
||||
Loading…
Add table
Reference in a new issue