From 246add33ecdc6ff47c147b22088f63936bcc420d Mon Sep 17 00:00:00 2001 From: afonso Date: Wed, 1 May 2024 18:52:16 +0100 Subject: [PATCH 1/5] [nvim] autopairs bs map and harpoon and tpipeline fix --- .config/nvim/lazy-lock.json | 37 ++++----- .config/nvim/lua/plugins/autopairs.lua | 2 +- .config/nvim/lua/plugins/harpoon.lua | 13 ++++ .config/nvim/lua/plugins/lazy.lua | 14 +++- .config/nvim/lua/plugins/lspconfig.lua | 7 +- .config/nvim/lua/plugins/telescope.lua | 6 +- .config/nvim/queries/go/injections.scm | 103 +++++++++++++++++++++++++ 7 files changed, 158 insertions(+), 24 deletions(-) create mode 100644 .config/nvim/lua/plugins/harpoon.lua create mode 100644 .config/nvim/queries/go/injections.scm diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json index 25a788c..3439b16 100644 --- a/.config/nvim/lazy-lock.json +++ b/.config/nvim/lazy-lock.json @@ -1,8 +1,8 @@ { - "LuaSnip": { "branch": "master", "commit": "be7be2ca7f55bb881a7ffc16b2efa5af034ab06b" }, - "ale": { "branch": "master", "commit": "6db58b33795430a6165f27c7f796c420c0e098e4" }, + "LuaSnip": { "branch": "master", "commit": "8f3d3465ba5c7ade0a8adb41eca5736f291a3fa8" }, + "ale": { "branch": "master", "commit": "d19b238aa2d7c426e71c5de083bd61328d5c4fd4" }, "catppuccin": { "branch": "main", "commit": "a1439ad7c584efb3d0ce14ccb835967f030450fe" }, - "cinnamon.nvim": { "branch": "master", "commit": "559fe02fae00ffd78377e9c242b2faa25a428592" }, + "cinnamon.nvim": { "branch": "master", "commit": "a011e84b624cd7b609ea928237505d31b987748a" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, "cmp-cmdline": { "branch": "main", "commit": "d250c63aa13ead745e3a40f61fdd3470efde3923" }, "cmp-nvim-lsp": { "branch": "main", "commit": "5af77f54de1b16c34b23cba810150689a3a90312" }, @@ -10,54 +10,55 @@ "cmp-nvim-lua": { "branch": "main", "commit": "f12408bdb54c39c23e67cab726264c10db33ada8" }, "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, "cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" }, - "conform.nvim": { "branch": "master", "commit": "820eec990d5f332d30cf939954c8672a43a0459e" }, - "dressing.nvim": { "branch": "master", "commit": "18e5beb3845f085b6a33c24112b37988f3f93c06" }, + "conform.nvim": { "branch": "master", "commit": "4660e534bf7678ee0f85879aa75fdcb6855612c2" }, + "dressing.nvim": { "branch": "master", "commit": "5162edb1442a729a885c45455a07e9a89058be2f" }, "fidget.nvim": { "branch": "main", "commit": "1ba38e4cbb24683973e00c2e36f53ae64da38ef5" }, "friendly-snippets": { "branch": "main", "commit": "ea068f1becd91bcd4591fceb6420d4335e2e14d3" }, - "fzf": { "branch": "master", "commit": "d8bfb6712d514fd6715135fd0e60df188831b566" }, + "fzf": { "branch": "master", "commit": "4a68eac99bb3814f912d236fa9356516ebda2fa5" }, "gruvbox-material": { "branch": "master", "commit": "80331fbbec9ba18590a17bc6b7d277d96c05c2b6" }, "harpoon": { "branch": "harpoon2", "commit": "0378a6c428a0bed6a2781d459d7943843f374bce" }, "impatient.nvim": { "branch": "main", "commit": "47302af74be7b79f002773011f0d8e85679a7618" }, "instant.nvim": { "branch": "master", "commit": "294b6d08143b3db8f9db7f606829270149e1a786" }, "jq.nvim": { "branch": "master", "commit": "b9879798f25a9318894456dc7464af0904c08958" }, "keylab.nvim": { "branch": "main", "commit": "9686b09253b5dde40e18554d189deb1b0c47f437" }, - "lazy.nvim": { "branch": "main", "commit": "31ddbea7c10b6920c9077b66c97951ca8682d5c8" }, + "lazy.nvim": { "branch": "main", "commit": "3f13f080434ac942b150679223d54f5ca91e0d52" }, "lspkind.nvim": { "branch": "master", "commit": "1735dd5a5054c1fb7feaf8e8658dbab925f4f0cf" }, "ltex-extra.nvim": { "branch": "master", "commit": "4296c2c7aefbca721d02a011366a1de30598046c" }, "lualine.nvim": { "branch": "master", "commit": "0a5a66803c7407767b799067986b4dc3036e1983" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "44509689b9bf3984d729cc264aacb31cb7f41668" }, + "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "273fdde8ac5e51f3a223ba70980e52bbc09d9f6f" }, "mason-nvim-dap.nvim": { "branch": "main", "commit": "67210c0e775adec55de9826b038e8b62de554afc" }, "mason.nvim": { "branch": "main", "commit": "751b1fcbf3d3b783fcf8d48865264a9bcd8f9b10" }, "nvim-autopairs": { "branch": "master", "commit": "4f41e5940bc0443fdbe5f995e2a596847215cd2a" }, "nvim-bqf": { "branch": "main", "commit": "52703d7adc3be3f7c09eea9a80c5b8caa615fb25" }, - "nvim-cmp": { "branch": "main", "commit": "ce16de5665c766f39c271705b17fff06f7bcb84f" }, + "nvim-cmp": { "branch": "main", "commit": "8f3c541407e691af6163e2447f3af1bd6e17f9a3" }, "nvim-colorizer.lua": { "branch": "master", "commit": "85855b38011114929f4058efc97af1059ab3e41d" }, - "nvim-dap": { "branch": "master", "commit": "405df1dcc2e395ab5173a9c3d00e03942c023074" }, + "nvim-dap": { "branch": "master", "commit": "6ae8a14828b0f3bff1721a35a1dfd604b6a933bb" }, "nvim-dap-go": { "branch": "main", "commit": "36abe1d320cb61bfdf094d4e0fe815ef58f2302a" }, "nvim-dap-ui": { "branch": "master", "commit": "edfa93f60b189e5952c016eee262d0685d838450" }, "nvim-ghost.nvim": { "branch": "main", "commit": "a1ca0b2dac59881066d7ac9373cf64d59ba29d6a" }, - "nvim-lspconfig": { "branch": "master", "commit": "9266dc26862d8f3556c2ca77602e811472b4c5b8" }, + "nvim-lspconfig": { "branch": "master", "commit": "7133e85c3df14a387da8942c094c7edddcdef309" }, "nvim-nio": { "branch": "master", "commit": "5800f585def265d52f1d8848133217c800bcb25d" }, "nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" }, - "nvim-treesitter": { "branch": "master", "commit": "2a95ff14764af20d32ec1edb27e11c38a84b9478" }, - "nvim-treesitter-context": { "branch": "master", "commit": "ba05c6b753130d96b284d3e8ba8f54c28c0fb6d1" }, + "nvim-treesitter": { "branch": "master", "commit": "0883ff05655117a3fc79ab295a640c4984cfd415" }, + "nvim-treesitter-context": { "branch": "master", "commit": "4fe0a54e86859744968e1a5c7867b49c86855774" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "23b820146956b3b681c19e10d3a8bc0cbd9a1d4c" }, - "nvim-web-devicons": { "branch": "master", "commit": "b3468391470034353f0e5110c70babb5c62967d3" }, - "oil.nvim": { "branch": "master", "commit": "e462a3446505185adf063566f5007771b69027a1" }, + "nvim-web-devicons": { "branch": "master", "commit": "beb6367ab8496c9e43f22e0252735fdadae1872d" }, + "oil.nvim": { "branch": "master", "commit": "f3a31eba24587bc038592103d8f7e64648292115" }, "pastify.nvim": { "branch": "main", "commit": "47317b9bb7bf5fb7dfd994a6eb9bec8f00628dc0" }, - "plenary.nvim": { "branch": "master", "commit": "8aad4396840be7fc42896e3011751b7609ca4119" }, + "plenary.nvim": { "branch": "master", "commit": "08e301982b9a057110ede7a735dd1b5285eb341f" }, "presence.nvim": { "branch": "main", "commit": "87c857a56b7703f976d3a5ef15967d80508df6e6" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "9ef21b2e6bb6ebeaf349a0781745549bbb870d27" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, "telescope.nvim": { "branch": "master", "commit": "7011eaae0ac1afe036e30c95cf80200b8dc3f21a" }, "tla.nvim": { "branch": "master", "commit": "e419c75e805ab6d9967c7325bf35734c372d3d4b" }, "todo-comments.nvim": { "branch": "main", "commit": "a7e39ae9e74f2c8c6dc4eea6d40c3971ae84752d" }, - "undotree": { "branch": "master", "commit": "aa93a7e5890dbbebbc064cd22260721a6db1a196" }, + "undotree": { "branch": "master", "commit": "56c684a805fe948936cda0d1b19505b84ad7e065" }, "vim-alloy": { "branch": "master", "commit": "5bd57c4890be39e221dd3e1f6735457dce454bbd" }, "vim-be-good": { "branch": "master", "commit": "4fa57b7957715c91326fcead58c1fa898b9b3625" }, "vim-jukit": { "branch": "master", "commit": "73214c9a8abc4b6aa7a6266b5bc2ddbf8b3e3c00" }, "vim-surround": { "branch": "master", "commit": "3d188ed2113431cf8dac77be61b842acb64433d9" }, "vim-tpipeline": { "branch": "master", "commit": "5dd3832bd6e239feccb11cadca583cdcf9d5bda1" }, - "vimtex": { "branch": "master", "commit": "ac0a41b297a70c101df89bc9c8d43341ba00fd4f" }, + "vimtex": { "branch": "master", "commit": "6c01660a99c0cc0906b39094f4a2d086b28fa995" }, "zen-mode.nvim": { "branch": "main", "commit": "78557d972b4bfbb7488e17b5703d25164ae64e6a" } } \ No newline at end of file diff --git a/.config/nvim/lua/plugins/autopairs.lua b/.config/nvim/lua/plugins/autopairs.lua index ca961a5..c24b33d 100644 --- a/.config/nvim/lua/plugins/autopairs.lua +++ b/.config/nvim/lua/plugins/autopairs.lua @@ -3,7 +3,7 @@ local npairs = require('nvim-autopairs') npairs.setup({ map_cr = true, - map_bs = false, + map_bs = true, check_ts = true, enable_check_bracket_line = true, ignored_next_char = "[%w]" diff --git a/.config/nvim/lua/plugins/harpoon.lua b/.config/nvim/lua/plugins/harpoon.lua new file mode 100644 index 0000000..4c9bd84 --- /dev/null +++ b/.config/nvim/lua/plugins/harpoon.lua @@ -0,0 +1,13 @@ +local harpoon = require("harpoon") + +-- REQUIRED +harpoon:setup() +-- REQUIRED + +vim.keymap.set("n", "a", function() harpoon:list():add() end) +vim.keymap.set("n", "", function() harpoon.ui:toggle_quick_menu(harpoon:list()) end) + +vim.keymap.set("n", "", function() harpoon:list():select(1) end) +vim.keymap.set("n", "", function() harpoon:list():select(2) end) +vim.keymap.set("n", "", function() harpoon:list():select(3) end) +vim.keymap.set("n", "", function() harpoon:list():select(4) end) diff --git a/.config/nvim/lua/plugins/lazy.lua b/.config/nvim/lua/plugins/lazy.lua index efd8d00..6273cfa 100644 --- a/.config/nvim/lua/plugins/lazy.lua +++ b/.config/nvim/lua/plugins/lazy.lua @@ -29,6 +29,13 @@ lazy.setup({ end, }, + { + "iamcco/markdown-preview.nvim", + cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" }, + ft = { "markdown" }, + build = function() vim.fn["mkdp#util#install"]() end, + }, + { "ThePrimeagen/harpoon", branch = "harpoon2", @@ -38,7 +45,12 @@ lazy.setup({ end }, - "vimpostor/vim-tpipeline", + { + "vimpostor/vim-tpipeline", + config = function() + vim.g.tpipeline_restore = 1 + end + }, { "TobinPalmer/pastify.nvim", diff --git a/.config/nvim/lua/plugins/lspconfig.lua b/.config/nvim/lua/plugins/lspconfig.lua index bde13ae..33adb2d 100644 --- a/.config/nvim/lua/plugins/lspconfig.lua +++ b/.config/nvim/lua/plugins/lspconfig.lua @@ -12,7 +12,7 @@ vim.api.nvim_create_autocmd("LspAttach", { callback = function(ev) -- Enable completion triggered by vim.bo[ev.buf].omnifunc = "v:lua.vim.lsp.omnifunc" - vim.opt_local.signcolumn=numbers + vim.opt_local.signcolumn = numbers local telescope = require("telescope.builtin") local conform = require("conform") @@ -106,6 +106,11 @@ mason_lspconfig.setup_handlers({ -- rest of your on_attach process. require("ltex_extra").setup() end, + settings = { + ltex = { + language = "en-US", + }, + }, }) end, ["basedpyright"] = function() diff --git a/.config/nvim/lua/plugins/telescope.lua b/.config/nvim/lua/plugins/telescope.lua index 49aaf80..375ad2f 100644 --- a/.config/nvim/lua/plugins/telescope.lua +++ b/.config/nvim/lua/plugins/telescope.lua @@ -13,10 +13,10 @@ telescope.setup { pickers = { find_files = { previewer = false, - layout_strategy = "vertical", - layout_config = { + layout_strategy = "center", + layout_config = { height = 0.7, - width = 0.5 + width = 0.5 }, }, live_grep = { diff --git a/.config/nvim/queries/go/injections.scm b/.config/nvim/queries/go/injections.scm new file mode 100644 index 0000000..2ce05b0 --- /dev/null +++ b/.config/nvim/queries/go/injections.scm @@ -0,0 +1,103 @@ +; extends + +; inject sql in single line strings +; e.g. db.GetContext(ctx, "SELECT * FROM users WHERE name = 'John'") + +((call_expression + (selector_expression + field: (field_identifier) @_field) + (argument_list + (interpreted_string_literal) @sql)) + (#any-of? @_field "Exec" "GetContext" "ExecContext" "SelectContext" "In" + "RebindNamed" "Rebind" "Query" "QueryRow" "QueryRowxContext" "NamedExec" "MustExec" "Get" "Queryx") + (#offset! @sql 0 1 0 -1)) + +; still buggy for nvim 0.10 +((call_expression + (selector_expression + field: (field_identifier) @_field (#any-of? @_field "Exec" "GetContext" "ExecContext" "SelectContext" "In" "RebindNamed" "Rebind" "Query" "QueryRow" "QueryRowxContext" "NamedExec" "MustExec" "Get" "Queryx")) + (argument_list + (interpreted_string_literal) @injection.content)) + (#offset! @injection.content 0 1 0 -1) + (#set! injection.language "sql")) + +; neovim nightly 0.10 +([ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + (#match? @injection.content "(SELECT|select|INSERT|insert|UPDATE|update|DELETE|delete).+(FROM|from|INTO|into|VALUES|values|SET|set).*(WHERE|where|GROUP BY|group by)?") +(#set! injection.language "sql")) + +; a general query injection +([ + (interpreted_string_literal) + (raw_string_literal) + ] @sql + (#match? @sql "(SELECT|select|INSERT|insert|UPDATE|update|DELETE|delete).+(FROM|from|INTO|into|VALUES|values|SET|set).*(WHERE|where|GROUP BY|group by)?") + (#offset! @sql 0 1 0 -1)) + +; ---------------------------------------------------------------- +; fallback keyword and comment based injection + +([ + (interpreted_string_literal) + (raw_string_literal) + ] @sql + (#contains? @sql "-- sql" "--sql" "ADD CONSTRAINT" "ALTER TABLE" "ALTER COLUMN" + "DATABASE" "FOREIGN KEY" "GROUP BY" "HAVING" "CREATE INDEX" "INSERT INTO" + "NOT NULL" "PRIMARY KEY" "UPDATE SET" "TRUNCATE TABLE" "LEFT JOIN" "add constraint" "alter table" "alter column" "database" "foreign key" "group by" "having" "create index" "insert into" + "not null" "primary key" "update set" "truncate table" "left join") + (#offset! @sql 0 1 0 -1)) + +; nvim 0.10 +([ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + (#contains? @injection.content "-- sql" "--sql" "ADD CONSTRAINT" "ALTER TABLE" "ALTER COLUMN" + "DATABASE" "FOREIGN KEY" "GROUP BY" "HAVING" "CREATE INDEX" "INSERT INTO" + "NOT NULL" "PRIMARY KEY" "UPDATE SET" "TRUNCATE TABLE" "LEFT JOIN" "add constraint" "alter table" "alter column" "database" "foreign key" "group by" "having" "create index" "insert into" + "not null" "primary key" "update set" "truncate table" "left join") + (#offset! @injection.content 0 1 0 -1) + (#set! injection.language "sql")) + + +; should I use a more exhaustive list of keywords? +; "ADD" "ADD CONSTRAINT" "ALL" "ALTER" "AND" "ASC" "COLUMN" "CONSTRAINT" "CREATE" "DATABASE" "DELETE" "DESC" "DISTINCT" "DROP" "EXISTS" "FOREIGN KEY" "FROM" "JOIN" "GROUP BY" "HAVING" "IN" "INDEX" "INSERT INTO" "LIKE" "LIMIT" "NOT" "NOT NULL" "OR" "ORDER BY" "PRIMARY KEY" "SELECT" "SET" "TABLE" "TRUNCATE TABLE" "UNION" "UNIQUE" "UPDATE" "VALUES" "WHERE" + +; json + +((const_spec + name: (identifier) @_const + value: (expression_list (raw_string_literal) @json)) + (#lua-match? @_const ".*[J|j]son.*")) + +; jsonStr := `{"foo": "bar"}` + +((short_var_declaration + left: (expression_list + (identifier) @_var) + right: (expression_list + (raw_string_literal) @json)) + (#lua-match? @_var ".*[J|j]son.*") + (#offset! @json 0 1 0 -1)) + +; nvim 0.10 + +(const_spec + name: ((identifier) @_const(#lua-match? @_const ".*[J|j]son.*")) + value: (expression_list (raw_string_literal) @injection.content + (#set! injection.language "json"))) + +(short_var_declaration + left: (expression_list (identifier) @_var (#lua-match? @_var ".*[J|j]son.*")) + right: (expression_list (raw_string_literal) @injection.content) + (#offset! @injection.content 0 1 0 -1) + (#set! injection.language "json")) + +(var_spec + name: ((identifier) @_const(#lua-match? @_const ".*[J|j]son.*")) + value: (expression_list (raw_string_literal) @injection.content + (#set! injection.language "json"))) + From aaa552df4bfba9a91693deea6f91355a9644c006 Mon Sep 17 00:00:00 2001 From: afonso Date: Wed, 1 May 2024 18:52:32 +0100 Subject: [PATCH 2/5] [tmux] remove duplicate entry in status_bar config --- .config/tmux/tmux_status_bar.conf | 3 --- 1 file changed, 3 deletions(-) diff --git a/.config/tmux/tmux_status_bar.conf b/.config/tmux/tmux_status_bar.conf index 38d574f..f912ac8 100644 --- a/.config/tmux/tmux_status_bar.conf +++ b/.config/tmux/tmux_status_bar.conf @@ -17,9 +17,6 @@ set -g status-justify left # Set right side of the status bar set -g status-right '#[bg=#{status-bg},fg=#{@unfocused-fg}] #S' -# Set window status format -set -g window-status-format ' #I:#W ' - # Set window status format set -g window-status-format ' #[bg=#{status-bg},fg=#{@unfocused-fg}] #I:#W ' From 2d89062d5c7f308188f43551546c5d8dd4eeedc2 Mon Sep 17 00:00:00 2001 From: afonso Date: Wed, 1 May 2024 18:52:56 +0100 Subject: [PATCH 3/5] [yabai] fix Firefox space name and added rules for discord and TIDAL --- .config/yabai/yabairc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.config/yabai/yabairc b/.config/yabai/yabairc index e563e50..9692580 100755 --- a/.config/yabai/yabairc +++ b/.config/yabai/yabairc @@ -11,7 +11,9 @@ yabai -m config focus_follows_mouse autofocus yabai -m config window_placement first_child yabai -m config window_placement second_child -yabai -m rule --add app="^Firefox$" space=two +yabai -m rule --add app="^Firefox$" space=2 +yabai -m rule --add app="^Discord$" space=3 +yabai -m rule --add app="^TIDAL$" space=4 # Add more rules based on your applications and workspace preferences From cd3f03304358b733da4b1f528c1bc798e34a9efe Mon Sep 17 00:00:00 2001 From: afonso Date: Wed, 1 May 2024 18:53:15 +0100 Subject: [PATCH 4/5] [git] changed git sign key --- .gitconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitconfig b/.gitconfig index a44fd91..3b609a1 100644 --- a/.gitconfig +++ b/.gitconfig @@ -1,7 +1,7 @@ [user] email = afonso@francof.net name = afonso - signingkey = ~/.ssh/simple_sk + signingkey = ~/.ssh/touch_key [includeIf "hasconfig:remote.*.url:https://github.com/**"] path = ~/.gitconfig-gh [includeIf "hasconfig:remote.*.url:ssh://git@github.com/**"] From a929ef7de2d2cd95be7cfcb1c4bcdbb7bb57b0c1 Mon Sep 17 00:00:00 2001 From: afonso Date: Wed, 1 May 2024 18:54:40 +0100 Subject: [PATCH 5/5] [ssh] added global config --- .ssh/config | 38 ++++++++------------------------------ 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/.ssh/config b/.ssh/config index da885e3..ad35059 100644 --- a/.ssh/config +++ b/.ssh/config @@ -1,39 +1,17 @@ +IdentityFile ~/.ssh/touch_key +IdentityFile ~/.ssh/id_ed25519_sk +IdentityFile ~/.ssh/id_ed25519_sk_secondary + +ControlMaster auto +ControlPath ~/.ssh/session.%r@%h:%p +ControlPersist 5m + Host git.olympuslab.net gon - ControlMaster auto HostName git.olympuslab.net User git Port 522 - ControlPath ~/.ssh/session.%r@%h:%p - ControlPersist 5m - IdentityFile ~/.ssh/simple_sk - IdentityFile ~/.ssh/id_ed25519_sk - IdentityFile ~/.ssh/id_ed25519_sk_secondary Host github.com gh - ControlMaster auto HostName github.com User git Port 22 - ControlPath ~/.ssh/session.%r@%h:%p - ControlPersist 10m - IdentityFile ~/.ssh/simple_sk - IdentityFile ~/.ssh/id_ed25519_sk - IdentityFile ~/.ssh/id_ed25519_sk_secondary - -Host Search - ControlMaster auto - HostName s7edu2.di.uminho.pt - User pg53595 - Port 22 - IdentityFile ~/.ssh/id_search - ControlPath ~/.ssh/session.%r@%h:%p - ControlPersist 5m - -Host Fixo - ControlMaster auto - HostName 10.8.0.9 - User afonso - Port 22 - IdentityFile ~/.ssh/id_rsa - ControlPath ~/.ssh/session.%r@%h:%p - ControlPersist 5m