{nixosConfig, ...}: {
  programs.nixvim.opts = {
    autoindent = true; # copy indent from previous line
    cindent = true; # use c like indenting rules
    breakindent = true; # continue indent visually
    showbreak = "↳ "; # downwards arrow with tip rightwards(U+21B3, UTF-8: E2 86 B3)
    breakindentopt = {
      shift = 2; # wrapped line's beginning will be shifted by the given number of
    };

    incsearch = true; # show search results while typing
    inccommand = "split"; # line preview of :s results
    ignorecase = true; # ignore case when searching
    smartcase = true; # if a capital letter is used in search, overwrite ignorecase
    showmatch = true; # show matching words during a search.
    hlsearch = true; # highlight when searching

    confirm = true; # confirm to save changes before closing modified buffer
    colorcolumn = "+1"; # show a +1 before the 'textwidth'
    completeopt = ["menuone" "noselect"]; # have a better completion experience

    # https://www.compart.com/en/unicode/U+XXXX (unicode character code)
    # stylua: ignore
    fillchars = {
      fold = "·"; # MIDDLE DOT (U+00B7, UTF-8: C2 B7)
      horiz = "━"; # BOX DRAWINGS HEAVY HORIZONTAL (U+2501, UTF-8: E2 94 81)
      horizdown = "┳"; # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL (U+2533, UTF-8: E2 94 B3)
      horizup = "┻"; # BOX DRAWINGS HEAVY UP AND HORIZONTAL (U+253B, UTF-8: E2 94 BB)
      vert = "┃"; # BOX DRAWINGS HEAVY VERTICAL (U+2503, UTF-8: E2 94 83)
      vertleft = "┫"; # BOX DRAWINGS HEAVY VERTICAL AND LEFT (U+252B, UTF-8: E2 94 AB)
      vertright = "┣"; # BOX DRAWINGS HEAVY VERTICAL AND RIGHT (U+2523, UTF-8: E2 94 A3)
      verthoriz = "╋"; # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL (U+254B, UTF-8: E2 95 8B)
    };
    listchars = builtins.concatStringsSep "," [
      "nbsp:⦸" #  CIRCLED REVERSE SOLIDUS (U+29B8, UTF-8: E2 A6 B8)
      "tab:▷┅" #  WHITE RIGHT-POINTING TRIANGLE (U+25B7, UTF-8: E2 96 B7)
      "extends:»" #  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00BB, UTF-8: C2 BB)
      "precedes:«" #  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (U+00AB, UTF-8: C2 AB)
      "trail:•" #  BULLET (U+2022, UTF-8: E2 80 A2)
    ];

    #  shell-like autocomplete to unambiguous portions
    wildmode = builtins.concatStringsSep "," [
      "longest"
      "list"
      "full"
    ];

    grepformat = "%f:%l:%c:%m"; # the default format for rg in vimgrep mode
    grepprg = "rg --vimgrep"; # use rg as grep implementation in `:grep`

    hidden = true; # allows you to hide buffers with unsaved changes without being prompted

    laststatus = 3; # use global statusline # TODO:

    list = true; # show whitespace

    mouse = ""; # disables the mouse

    number = true; # line numbers
    relativenumber = true; # relative line numbers

    # vim.opt.shada:append {'%'}; -- store buffers in the shada file and reopen them if nvim has been started without file name argument

    shell = nixosConfig.users.users.soispha.shell.pname; # try to use default shell for the default user as a shell for ":!"

    spell = true; # activate spell checking
    spelllang = "en_us,de_de"; # set spell languages
    spelloptions = "camel"; # CamelCase check if both camel and case are correct words

    syntax = "ON"; # use syntax highlighting and let nvim figure out which

    shiftwidth = 0; # use tabstop setting as shiftwidth
    tabstop = 4; # use 4 spaces in place of a tab
    expandtab = true; # expand tabs to spaces

    showtabline = 2; # always show the tabline

    timeoutlen = 500; # wait 500 msec for the next char in an input sequence
    ttyfast = true; # let vim know that I am using a fast term

    undofile = true; # use a undofile, to save the undos
    undolevels = 10000; # keep nearly all undo things stored

    virtualedit = "block"; # allow the cursor to move beyond actual character in visual block mode

    textwidth = 90; # automatically hard wrap at 90 columns by default

    foldmethod = "marker"; # use markers to specify folds

    termguicolors = true;
    cursorline = true;
    # vim.opt.cursorcolumn = true;

    scrolloff = 999; # try to keep at least 999 lines above and below the cursor (this effectively keeps the screen centered)

    linebreak = true; # break to long lines, but do only break them at [[::space::]]

    showcmd = true; # show partial command, being typed
    showmode = true; # show the mode (Visual, Insert, Command)

    wildmenu = true; # shell completion
    wildignore = "*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx"; # ignore binary files
  };
}