dotfiles/nvim/lua/options.lua
2026-06-02 08:20:14 +02:00

249 lines
7.2 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local utils = require("utils")
local fn = vim.fn
local opt = vim.opt
local o = vim.o
-- Change fillchars for folding, vertical split, end of buffer, and message separator
opt.fillchars = {
fold = " ",
foldsep = " ",
foldopen = "",
foldclose = "",
vert = "",
eob = " ",
msgsep = "",
diff = "",
}
-- Split window below/right when creating horizontal/vertical windows
opt.splitbelow = true
opt.splitright = true
-- Avoid the flickering when splitting window horizontal
opt.splitkeep = "screen"
-- Time in milliseconds to wait for a mapped sequence to complete,
-- see https://unix.stackexchange.com/q/36882/221410 for more info
opt.timeoutlen = 500
opt.updatetime = 500 -- For CursorHold events
-- Clipboard settings, always use clipboard for all delete, yank, change, put
-- operation, see https://stackoverflow.com/q/30691466/6064933
if fn["provider#clipboard#Executable"]() ~= "" then
opt.clipboard:append("unnamedplus")
end
-- Disable creating swapfiles, see https://stackoverflow.com/q/821902/6064933
opt.swapfile = false
-- Ignore certain files and folders when globbing
opt.wildignore:append {
"*.o",
"*.obj",
"*.dylib",
"*.bin",
"*.dll",
"*.exe",
"*/.git/*",
"*/.svn/*",
"*/__pycache__/*",
"*/build/**",
"*.jpg",
"*.png",
"*.jpeg",
"*.bmp",
"*.gif",
"*.tiff",
"*.svg",
"*.ico",
"*.pyc",
"*.pkl",
"*.DS_Store",
"*.aux",
"*.bbl",
"*.blg",
"*.brf",
"*.fls",
"*.fdb_latexmk",
"*.synctex.gz",
"*.xdv",
}
opt.wildignorecase = true -- Ignore file and dir name cases in cmd-completion
-- Set up backup directory
vim.g.backupdir = fn.stdpath("data") .. "/backup//"
opt.backupdir = vim.g.backupdir
-- Skip backup for patterns in option wildignore
opt.backupskip = o.wildignore
opt.backup = true -- Create backup for files
opt.backupcopy = "yes" -- Copy the original file to backupdir and overwrite it
-- General tab settings
opt.tabstop = 2 -- Number of visual spaces per TAB
opt.softtabstop = 2 -- Number of spaces in tab when editing
opt.shiftwidth = 2 -- Number of spaces to use for autoindent
opt.expandtab = true -- Expand tab to spaces so that tabs are spaces
-- Set matching pairs of characters and highlight matching brackets
opt.matchpairs:append {
"<:>",
"「:」",
"『:』",
"【:】",
'":"',
"':'",
"《:》",
}
-- Show line number and relative line number
opt.number = true
opt.relativenumber = true
-- Ignore case in general, but become case-sensitive when uppercase is present
opt.ignorecase = true
opt.smartcase = true
-- File and script encoding settings for vim
opt.fileencoding = "utf-8"
opt.fileencodings = { "ucs-bom", "utf-8", "cp936", "gb18030", "big5", "euc-jp", "euc-kr", "latin1" }
-- Break line at predefined characters
opt.linebreak = true
-- Character to show before the lines that have been soft-wrapped
opt.showbreak = ""
-- List all matches and complete till longest common string
opt.wildmode = "list:longest"
-- Minimum lines to keep above and below cursor when scrolling
opt.scrolloff = 999
-- Use mouse to select and resize windows, etc.
opt.mouse = "n"
opt.mousemodel = "popup" -- Set the behaviour of mouse
opt.mousescroll = { "ver:1", "hor:0" }
-- Disable showing current mode on command line since statusline plugins can show it.
opt.showmode = false
opt.fileformats = { "unix", "dos" } -- Fileformats to use for new files
-- Ask for confirmation when handling unsaved or read-only files
opt.confirm = true
opt.visualbell = true
opt.errorbells = false -- Do not use visual and errorbells
opt.history = 500 -- The number of command and search history to keep
-- Use list mode and customized listchars
opt.list = true
opt.listchars = {
tab = "",
extends = "",
precedes = "",
nbsp = "",
}
-- Auto-write the file based on some condition
opt.autowrite = true
opt.autowriteall = true
-- Auto reload file if changed outside nvim
opt.autoread = true
-- Show hostname, full path of file and last-mod time on the window title.
-- The meaning of the format str for strftime can be found in
-- http://man7.org/linux/man-pages/man3/strftime.3.html. The function to get
-- lastmod time is drawn from https://stackoverflow.com/q/8426736/6064933
opt.title = true
o.titlestring = "%{v:lua.require('utils').get_titlestr()}"
-- Persistent undo even after you close a file and re-open it
opt.undofile = true
-- Do not show "match xx of xx" and other messages during auto-completion
-- Do not show search match count on bottom right (seriously, I would strain my
-- neck looking at it). Using plugins like vim-anzu or nvim-hlslens is a better
-- choice, IMHO.
opt.shortmess:append("cS")
opt.messagesopt = "hit-enter,history:500"
-- Completion behaviour
opt.completeopt:append("menuone") -- Show menu even if there is only one item
opt.completeopt:remove("preview") -- Disable the preview window
opt.pumheight = 10 -- Maximum number of items to show in popup menu
opt.pumblend = 5 -- Pseudo transparency for completion menu
opt.pumborder = "single"
opt.winblend = 0 -- Pseudo transparency for floating window
opt.winborder = "single"
-- Insert mode key word completion setting
opt.complete:append("kspell")
opt.complete:remove { "w", "b", "u", "t" }
opt.spelllang = { "en", "cjk" } -- Spell languages
opt.spellsuggest:append("9") -- Show 9 spell suggestions at most
-- Align indent to next multiple value of shiftwidth. For its meaning,
-- see http://vim.1045645.n5.nabble.com/shiftround-option-td5712100.html
opt.shiftround = true
opt.virtualedit = "block" -- Virtual edit is useful for visual block edit
-- Correctly break multi-byte characters such as CJK,
-- see https://stackoverflow.com/q/32669814/6064933
opt.formatoptions:append("mM")
-- Tilde (~) is an operator, thus must be followed by motions like `e` or `w`.
opt.tildeop = true
opt.synmaxcol = 250 -- Text after this column number is not highlighted
opt.startofline = false
-- External program to use for grep command
if utils.executable("rg") then
opt.grepprg = "rg --vimgrep --no-heading --smart-case"
opt.grepformat = "%f:%l:%c:%m"
end
-- Enable true color support. Do not set this option if your terminal does not
-- support true colors! For a comprehensive list of terminals supporting true
-- colors, see https://github.com/termstandard/colors and https://gist.github.com/XVilka/8346728.
opt.termguicolors = true
-- Set up cursor color and shape in various mode, ref:
-- https://neovim.io/doc/user/faq/#_how-to-change-cursor-color-in-the-terminal%3f
opt.guicursor =
"n-v:block-Cursor/lCursor,i-c-ci-ve:ver50-blinkwait50-blinkoff100-blinkon175-Cursor2/lCursor2,r-cr:hor20,o:hor20"
opt.signcolumn = "yes:1"
opt.colorcolumn = "100"
-- Remove certain character from file name pattern matching
opt.isfname:remove { "=", "," }
-- diff options
opt.diffopt = {
"vertical", -- Show diff in vertical position
"filler", -- Show filler for deleted lines
"closeoff", -- Turn off diff when one file window is closed
"context:3", -- Context for diff
"internal",
"indent-heuristic",
"algorithm:histogram",
}
-- inline diff makes changes in a line more noticeable, the author suggests to
-- remove linematch option if you use inline option, see also
-- https://www.reddit.com/r/neovim/comments/1myfvla/comment/najy4s3/
opt.diffopt:append("inline:char")
opt.wrap = false -- Do not wrap
opt.ruler = false
opt.showcmdloc = "statusline"