diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf6a2f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +fish/fish_variables +fish/conf.d diff --git a/fish/completions/fisher.fish b/fish/completions/fisher.fish new file mode 100644 index 0000000..6d23ce4 --- /dev/null +++ b/fish/completions/fisher.fish @@ -0,0 +1,7 @@ +complete --command fisher --exclusive --long help --description "Print help" +complete --command fisher --exclusive --long version --description "Print version" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex" +complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)" diff --git a/fish/config.fish b/fish/config.fish new file mode 100644 index 0000000..c805fb7 --- /dev/null +++ b/fish/config.fish @@ -0,0 +1,7 @@ +fish_add_path /usr/local/opt/node@14/bin + +fish_vi_key_bindings + +for mode in insert default visual + bind -M $mode \cf forward-char +end diff --git a/fish/fish_plugins b/fish/fish_plugins new file mode 100644 index 0000000..594dfc0 --- /dev/null +++ b/fish/fish_plugins @@ -0,0 +1 @@ +jorgebucaran/fisher diff --git a/fish/functions/fish_prompt.fish b/fish/functions/fish_prompt.fish new file mode 100644 index 0000000..5cff15b --- /dev/null +++ b/fish/functions/fish_prompt.fish @@ -0,0 +1,4 @@ +function fish_prompt + printf "%s %s" (set_color $fish_color_cwd)(basename (pwd))(set_color red) λ (set_color normal) +end + diff --git a/fish/functions/fisher.fish b/fish/functions/fisher.fish new file mode 100644 index 0000000..a1fb6cf --- /dev/null +++ b/fish/functions/fisher.fish @@ -0,0 +1,209 @@ +function fisher --argument-names cmd --description "A plugin manager for Fish" + set --query fisher_path || set --local fisher_path $__fish_config_dir + set --local fisher_version 4.3.0 + set --local fish_plugins $__fish_config_dir/fish_plugins + + switch "$cmd" + case -v --version + echo "fisher, version $fisher_version" + case "" -h --help + echo "Usage: fisher install Install plugins" + echo " fisher remove Remove installed plugins" + echo " fisher update Update installed plugins" + echo " fisher update Update all installed plugins" + echo " fisher list [] List installed plugins matching regex" + echo "Options:" + echo " -v or --version Print version" + echo " -h or --help Print this help message" + case ls list + string match --entire --regex -- "$argv[2]" $_fisher_plugins + case install update remove + isatty || read --local --null --array stdin && set --append argv $stdin + + set --local install_plugins + set --local update_plugins + set --local remove_plugins + set --local arg_plugins $argv[2..-1] + set --local old_plugins $_fisher_plugins + set --local new_plugins + + if ! set --query argv[2] + if test "$cmd" != update + echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1 + else if test ! -e $fish_plugins + echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1 + end + set arg_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins) + end + + for plugin in $arg_plugins + test -e "$plugin" && set plugin (realpath $plugin) + contains -- "$plugin" $new_plugins || set --append new_plugins $plugin + end + + if set --query argv[2] + for plugin in $new_plugins + if contains -- "$plugin" $old_plugins + test "$cmd" = remove && + set --append remove_plugins $plugin || + set --append update_plugins $plugin + else if test "$cmd" = install + set --append install_plugins $plugin + else + echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1 + end + end + else + for plugin in $new_plugins + contains -- "$plugin" $old_plugins && + set --append update_plugins $plugin || + set --append install_plugins $plugin + end + + for plugin in $old_plugins + contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin + end + end + + set --local pid_list + set --local source_plugins + set --local fetch_plugins $update_plugins $install_plugins + echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal) + + for plugin in $fetch_plugins + set --local source (command mktemp -d) + set --append source_plugins $source + + command mkdir -p $source/{completions,conf.d,functions} + + fish --command " + if test -e $plugin + command cp -Rf $plugin/* $source + else + set temp (command mktemp -d) + set name (string split \@ $plugin) || set name[2] HEAD + set url https://codeload.github.com/\$name[1]/tar.gz/\$name[2] + + echo Fetching (set_color --underline)\$url(set_color normal) + + if curl --silent \$url | tar -xzC \$temp -f - 2>/dev/null + command cp -Rf \$temp/*/* $source + else + echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2 + command rm -rf $source + end + command rm -rf \$temp + end + + set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files + " & + + set --append pid_list (jobs --last --pid) + end + + wait $pid_list 2>/dev/null + + for plugin in $fetch_plugins + if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source + if set --local index (contains --index -- "$plugin" $install_plugins) + set --erase install_plugins[$index] + else + set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)] + end + end + end + + for plugin in $update_plugins $remove_plugins + if set --local index (contains --index -- "$plugin" $_fisher_plugins) + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + + if contains -- "$plugin" $remove_plugins + for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var) + emit {$name}_uninstall + end + printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var + end + + command rm -rf $$plugin_files_var + functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var) + + for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var) + complete --erase --command $name + end + + set --erase _fisher_plugins[$index] + set --erase $plugin_files_var + end + end + + if set --query update_plugins[1] || set --query install_plugins[1] + command mkdir -p $fisher_path/{functions,conf.d,completions} + end + + for plugin in $update_plugins $install_plugins + set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] + set --local files $source/{functions,conf.d,completions}/* + + if set --local index (contains --index -- $plugin $install_plugins) + set --local user_files $fisher_path/{functions,conf.d,completions}/* + set --local conflict_files + + for file in (string replace -- $source/ $fisher_path/ $files) + contains -- $file $user_files && set --append conflict_files $file + end + + if set --query conflict_files[1] && set --erase install_plugins[$index] + echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2 + continue + end + end + + for file in (string replace -- $source/ "" $files) + command cp -Rf $source/$file $fisher_path/$file + end + + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files) + + contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin + contains -- $plugin $install_plugins && set --local event install || set --local event update + + printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var + + for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var) + source $file + if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file) + emit {$name}_$event + end + end + end + + command rm -rf $source_plugins + + set --query _fisher_plugins[1] || set --erase _fisher_plugins + set --query _fisher_plugins && + printf "%s\n" $_fisher_plugins >$fish_plugins || + command rm -f $fish_plugins + + set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins) + test "$total" != "0 0 0" && echo (string join ", " ( + test $total[1] = 0 || echo "Installed $total[1]") ( + test $total[2] = 0 || echo "Updated $total[2]") ( + test $total[3] = 0 || echo "Removed $total[3]") + ) plugin/s + case \* + echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1 + end +end + +## Migrations ## +function _fisher_fish_postexec --on-event fish_postexec + if functions --query _fisher_list + fisher update >/dev/null 2>/dev/null + set --query XDG_DATA_HOME || set --local XDG_DATA_HOME ~/.local/share + test -e $XDG_DATA_HOME/fisher && command rm -rf $XDG_DATA_HOME/fisher + functions --erase _fisher_list _fisher_plugin_parse + set --erase fisher_data + end + functions --erase _fisher_fish_postexec +end diff --git a/fish/functions/l.fish b/fish/functions/l.fish new file mode 100644 index 0000000..84f70f1 --- /dev/null +++ b/fish/functions/l.fish @@ -0,0 +1,3 @@ +function l + ls -A $argv +end diff --git a/gitconfig b/gitconfig new file mode 100644 index 0000000..9887852 --- /dev/null +++ b/gitconfig @@ -0,0 +1,38 @@ +[core] + editor = nvim + autocrlf = input + safecrlf = true +[pull] + rebase = false +[push] + default = simple +[user] + name = Benoît Barberousse + email = 74591246+bnwa@users.noreply.github.com +[stash] + showPatch = true +[filter "lfs"] + smudge = git-lfs smudge -- %f + required = true + clean = git-lfs clean -- %f + process = git-lfs filter-process +[status] + showUntrackedFiles = all +[stash] + showPatch = true +[alias] + a = add --patch + b = branch + c = commit + ch = checkout + d = diff + fnd = grep --line-number --break --heading + l = log --oneline --decorate + la = log --oneline --decorate --all + m = merge + p = push + r = remote -v + st = status --branch --short + sv = stash save -u + svs = stash list + opn = stash apply diff --git a/nvim/coc-settings.json b/nvim/coc-settings.json new file mode 100644 index 0000000..8999f97 --- /dev/null +++ b/nvim/coc-settings.json @@ -0,0 +1,25 @@ +{ + "codeLens.enable": true, + "diagnostic.autoRefresh": true, + "diagnostic.checkCurrentLine": false, + "diagnostic.enableSign": false, + "diagnostic.virtualText": false, + "hover.floatConfig": { + "border": false, + "focusable": false, + "shadow": true + }, + "signature.floatConfig": { + "border": false, + "focusable": false, + "shadow": true + }, + "suggest.enablePreview": true, + "suggest.detailMaxLength": 100, + "suggest.floatEnable": true, + "suggest.floatConfig": { + "border": true, + "focusable": false, + "shadow": true + } +} diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..d2f7240 --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,108 @@ +local fn = vim.fn +local g = vim.g +local map = vim.api.nvim_set_keymap +local opt = vim.opt + +local install_path = fn.stdpath('data') .. '/site/pack/paqs/start/paq-nvim' + +if fn.empty(fn.glob(install_path)) > 0 then + fn.system({'git', 'clone', '--depth=1', 'https://github.com/savq/paq-nvim.git', install_path}) +end + +opt.background = "light" +opt.expandtab = true +opt.gdefault = true +opt.laststatus = 2 +opt.number = true +opt.listchars.precedes = "«" +opt.listchars.extends = "»" +opt.relativenumber = true +opt.shiftwidth = 2 +opt.softtabstop = 2 +opt.shortmess:append "c" +opt.swapfile = false +opt.termguicolors = false +opt.wildignore:append "*/node_modules/*" +opt.wildignore:append "/.git" +opt.wrap = false +opt.writebackup = false +opt.updatetime = 100 +opt.visualbell = false + +g.mapleader = "," + +require "paq" { + "savq/paq-nvim"; + "tpope/vim-fugitive"; + "nvim-lua/plenary.nvim"; + "nvim-telescope/telescope.nvim"; + "fannheyward/telescope-coc.nvim"; + { "neoclide/coc.nvim", branch = "release" }; + { "nvim-treesitter/nvim-treesitter", branch = "0.5-compat", run = ":TSUpdate" }; +} + +require("telescope").load_extension("coc") + +require 'nvim-treesitter.configs'.setup { + incremental_selection = { + enable = true + }, + + indentation = { + enable = true + }, + + highlight = { + enable = true, + additional_vim_regex_highlighting = false + }, + + matchup = { + enable = true + } +} + +-- TODO update when autcmd can be handled in Lua +vim.cmd([[ + " Markdown + autocmd BufReadPre *.md Goyo + + " JSON(c) + autocmd FileType tsconfig.json setlocal syntax=jsonc + + "Terminal + autocmd TermOpen * setlocal nonumber norelativenumber + + "CSS - Probably don't neede this proper plugin + "autocmd FileType css setlocal iskeyword+=- + + " Fish shell + autocmd FileType *.fish setlocal tabstop=4 + autocmd FileType *.fish setlocal softtabstop=4 + autocmd FileType *.fish setlocal shiftwidth=4 +]]) + +-- Treat wrapped lines as single line +map('n', 'j', 'gj', { noremap = true }) +map('n', 'k', 'gk', { noremap = true }) + +-- Set terminal to normal mode (note the escape to '\') +map("t", "l", "", { noremap = true }) + +-- Reload init.lua on demand +map("n", "r", ":source $MYVIMRC", { noremap = true }) + +-- Cease highlighting search matches +map("n", "k", ":nohlsearch", { noremap = true }) + +-- Simplify pane switching +map("n", "", "", { noremap = true }) +map("n", "", "", { noremap = true }) +map("n", "", "", { noremap = true }) +map("n", "", "", { noremap = true }) + +-- Telescope +map("n", "f", "lua require('telescope.builtin').find_files()", { noremap = true }) +map("n", "g", "lua require('telescope.builtin').git_files()", { noremap = true }) +map("n", "h", "lua require('telescope.builtin').help_tags()", { noremap = true }) +map("n", "d", "lua require('telescope').extensions.coc.diagnostics()", { noremap = true }) diff --git a/tmux.conf b/tmux.conf new file mode 100644 index 0000000..0f7459d --- /dev/null +++ b/tmux.conf @@ -0,0 +1,72 @@ +# SESSION + +## Start counting windows, sessions from 1 instead of default 0 +set -g base-index 1 + +## Don't ring the bell +set -g bell-action none + +## Pass focus-events to interested programs +set -s focus-events on + +## Set the keymap prefix key to +set -g prefix C-f + +## Auto renumber windows when one closes +set -g renumber-windows on + +## Set the terminal title +set -g set-titles on + +## Send no messages when activity occurs in monitored windows, if any +set -g visual-activity off + +## Don't ring the bell +set -g visual-bell off + +## Don't send alerts when monitor-window is active +set -g visual-silence off + +# WINDOW + +## Automatically rename windows using automatic-rename-format option +setw -g automatic-rename on + +## Use vi key bindings in copy mode as opposed to emacs +setw -g mode-keys vi + +## Disable monitoring activity in windows +setw -g monitor-activity off + +## Disable monitoring silence in windows +setw -g monitor-silence 0 + +## Start counting panes from 1 +setw -g pane-base-index 1 + +## Always send xterm-style key sequences to listening programs +setw -g xterm-keys on + +# MAPPINGS + +## for send-prefix, never +unbind C-b +bind C-f send-prefix + +## vim-like pane traversal +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +## vim-like pane resizing (by 2 units) +bind C-h resize-pane -L 2 +bind C-j resize-pane -D 2 +bind C-k resize-pane -U 2 +bind C-l resize-pane -R 2 + +## move to last active window since 'l' is bound to 'select-pane -R' above +bind Tab last-window + +## re-source config +bind r source ~/.tmux.conf