summaryrefslogtreecommitdiffstats
path: root/lua/conf/opts.lua
blob: 5d8a24f891549b7c627a18ee3c7fd73872c3f806 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
local misc = require('core.misc')
local auto = misc.auto

-- color stuff
if vim.fn.has("termguicolors") then
  vim.opt.termguicolors = true
end

vim.opt.laststatus = 3

-- numbers
vim.opt.number = true
vim.opt.relativenumber = true

-- buffer
vim.opt.scrolloff = 5
vim.opt.wrap = true -- wraping lines
vim.opt.linebreak = true -- fix where line is wraped
vim.opt.cursorline = true

-- indents + tabs
local tabwidth = 2
vim.opt.expandtab = true
vim.opt.smarttab = true
vim.opt.cindent = true
vim.opt.autoindent = true
vim.opt.tabstop = tabwidth
vim.opt.shiftwidth = tabwidth
vim.opt.softtabstop = tabwidth

-- Schedule the setting after `UiEnter` because it can increase startup-time.
-- (yoinked from kickstart.nvim)
vim.schedule(function()
  vim.opt.clipboard = 'unnamedplus' -- system clipboard
end)

vim.opt.updatetime = 200

-- file saving
vim.opt.swapfile = false
vim.opt.undofile = true
vim.opt.confirm = true

-- searching
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.wrapscan = true
vim.opt.showmatch = true
vim.opt.incsearch = true

-- wild menus
vim.opt.wildoptions = 'pum'
vim.opt.pumblend = 3
vim.opt.pumheight = 20

vim.opt.wildignorecase = true
vim.opt.wildignore = '*.o'

-- netrw
vim.g.netrw_banner = 0
vim.g.netrw_winsize = 30
vim.g.netrw_liststyle = 1
vim.g.netrw_sizestyle = "H"
vim.g.netrw_hide = 1

-- folding
auto("FileType", {
  callback = function()
    -- support lsp folding
    if vim.fn.has("nvim-0.11") then
      auto('LspAttach', {
        callback = function(args)
          local client = vim.lsp.get_client_by_id(args.data.client_id)
          if not client then
            return
          end

          if client:supports_method('textDocument/foldingRange') then
            local win = vim.api.nvim_get_current_win()
            vim.wo[win][0].foldmethod = "expr"
            vim.wo[win][0].foldexpr = 'v:lua.vim.lsp.foldexpr()'
          end
        end,
      })
    end

    -- or just rely on treesitter
    if require("nvim-treesitter.parsers").has_parser() then
      vim.opt.foldmethod = "expr"
      vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
    else
      vim.opt.foldmethod = "syntax"
    end
  end
})

-- lsp folding: vim.o.foldexpr = "v:lua.vim.lsp.foldexpr()"
-- waiting on https://github.com/neovim/neovim/pull/31311 to hit a release
require('core.lsp.functions').add_capabilities({
  textDocument = {
    foldingRange = {
      dynamicRegistration = false,
      lineFoldingOnly = true
    }
  }
})

vim.opt.foldlevelstart = 99
vim.opt.foldlevel = 99
vim.opt.foldenable = true
vim.o.fillchars = 'fold: '

_G.Fold_text = require('core.folding')
vim.opt.foldtext = 'v:lua.Fold_text()'

-- statusline
function _G.Status()
  return table.concat {
    "%t", -- file name
    " %h", -- help buffer tag
    "%m", -- modify tag
    "%r", -- readonly flag
    "%=", -- seperate left and right side

    -- print out the number of lsp clients attached
    "λ"..#vim.lsp.get_clients({ bufnr = 0 }).." ",

    "%l,%c%V", -- line, column-virtual column
    "    %P" -- percentage through display window
  }
end
vim.o.statusline="%!v:lua.Status()"