Personal changes

This commit is contained in:
Ahmed Zamouche 2023-11-26 21:25:54 +01:00
parent 92b2689e6f
commit 15ac692c65
21 changed files with 646 additions and 3 deletions

3
.gitignore vendored
View file

@ -6,3 +6,6 @@ debug
foo.*
*.log
data
.luarc.json
lazy-lock.json
lazyvim.json

4
.gitmodules vendored Normal file
View file

@ -0,0 +1,4 @@
[submodule "thirdparty/json"]
path = thirdparty/json
url = https://github.com/rxi/json.lua.git
branch = master

View file

@ -1,2 +1,4 @@
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")
require("user.toggleterm")
require("user.csearchpath")

View file

@ -11,9 +11,9 @@ require("lazy").setup({
-- add LazyVim and import its plugins
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- import any extras modules here
-- { import = "lazyvim.plugins.extras.lang.typescript" },
-- { import = "lazyvim.plugins.extras.lang.json" },
-- { import = "lazyvim.plugins.extras.ui.mini-animate" },
{ import = "lazyvim.plugins.extras.lang.typescript" },
{ import = "lazyvim.plugins.extras.lang.json" },
{ import = "lazyvim.plugins.extras.ui.mini-animate" },
-- import/override with your plugins
{ import = "plugins" },
},

View file

@ -1,3 +1,5 @@
-- Options are automatically loaded before lazy.nvim startup
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
-- Add any additional options here
vim.opt.winbar = "%=%m %f"

7
lua/plugins/gist.lua Normal file
View file

@ -0,0 +1,7 @@
return {
{
"mattn/vim-gist",
event = "BufRead",
dependencies = "mattn/webapi-vim",
},
}

View file

@ -0,0 +1,29 @@
return {
{
"rmagatti/goto-preview",
config = function()
require("goto-preview").setup({
width = 120, -- Width of the floating windowconfig
height = 25, -- Height of the floating window
default_mappings = true, -- Bind default mappings
debug = false, -- Print debug information
opacity = nil, -- 0-100 opacity level of the floating window where 100 is fully transparent.
post_open_hook = nil, -- A function taking two arguments, a buffer and a window to be ran as a hook.
references = { -- Configure the telescope UI for slowing the references cycling window.
-- telescope = telescope.themes.get_dropdown({ hide_preview = false })
},
-- These two configs can also be passed down to the goto-preview definition and implementation calls for one off "peak" functionality.
focus_on_open = true, -- Focus the floating window when opening it.
dismiss_on_move = false, -- Dismiss the floating window when moving the cursor.
force_close = true, -- passed into vim.api.nvim_win_close's second argument. See :h nvim_win_close
bufhidden = "wipe", -- the bufhidden option to set on the floating window. See :h bufhidden
-- You can use "default_mappings = true" setup option
-- Or explicitly set keybindings
-- vim.cmd("nnoremap gpd <cmd>lua require('goto-preview').goto_preview_definition()<CR>")
-- vim.cmd("nnoremap gpi <cmd>lua require('goto-preview').goto_preview_implementation()<CR>")
-- vim.cmd("nnoremap gP <cmd>lua require('goto-preview').close_all_win()<CR>")
})
end,
},
}

10
lua/plugins/lualine.lua Normal file
View file

@ -0,0 +1,10 @@
return {
-- the opts function can also be used to change the default opts:
{
"nvim-lualine/lualine.nvim",
event = "VeryLazy",
opts = function(_, opts)
table.insert(opts.sections.lualine_x, "😄")
end,
},
}

14
lua/plugins/octo.lua Normal file
View file

@ -0,0 +1,14 @@
return {
{
"pwntester/octo.nvim",
cmd = "Octo",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope.nvim",
"nvim-tree/nvim-web-devicons",
},
config = function()
require("octo").setup()
end,
},
}

54
lua/plugins/supertab.lua Normal file
View file

@ -0,0 +1,54 @@
return {
-- Use <tab> for completion and snippets (supertab)
-- first: disable default <tab> and <s-tab> behavior in LuaSnip
{
"L3MON4D3/LuaSnip",
keys = function()
return {}
end,
},
-- then: setup supertab in cmp
{
"hrsh7th/nvim-cmp",
dependencies = {
"hrsh7th/cmp-emoji",
},
---@param opts cmp.ConfigSchema
opts = function(_, opts)
local has_words_before = function()
table.insert(opts.sources, { name = "emoji" })
unpack = unpack or table.unpack
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
local luasnip = require("luasnip")
local cmp = require("cmp")
opts.mapping = vim.tbl_extend("force", opts.mapping, {
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
-- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable()
-- this way you will only jump inside the snippet region
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
elseif has_words_before() then
cmp.complete()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" }),
})
end,
},
}

View file

@ -0,0 +1,8 @@
return {
{
"simrat39/symbols-outline.nvim",
cmd = "SymbolsOutline",
keys = { { "<leader>cs", "<cmd>SymbolsOutline<cr>", desc = "Symbols Outline" } },
config = true,
},
}

View file

@ -0,0 +1,12 @@
return {
{
"telescope.nvim",
dependencies = {
"nvim-telescope/telescope-fzf-native.nvim",
build = "make",
config = function()
require("telescope").load_extension("fzf")
end,
},
},
}

View file

@ -0,0 +1,41 @@
return {
{
"akinsho/toggleterm.nvim",
version = "*",
config = true,
keys = {
-- horizontal bash
{ "<leader>th", "<cmd>lua TermToggleBash('horizontal')<cr>", desc = "H-Bash" },
{
"<a-1>",
mode = { "n", "v", "t" },
"<cmd> lua TermToggleBash('horizontal')<cr>",
desc = "H-Bash",
},
-- float bash
{ "<leader>tf", "<cmd>lua TermToggleBash('float')<cr>", desc = "Bash" },
{
"<a-2>",
mode = { "n", "v", "t" },
"<cmd> lua TermToggleBash('float')<cr>",
desc = "Bash",
},
-- containers
{ "<leader>tc", "<cmd>lua TermToggleContainer('float')<cr>", desc = "Container" },
{ "<a-3>", mode = { "n", "x", "o", "t" }, "<cmd>lua TermToggleContainer('float')<cr>", desc = "Container" },
-- ssh
{ "<leader>ts", "<cmd>lua TermToggleSsh('float')<cr>", desc = "ssh" },
{ "<a-4>", mode = { "n", "x", "o", "t" }, "<cmd>lua TermToggleSsh('float')<cr>", desc = "ssh" },
-- python
{ "<leader>tp", "<cmd>lua TermTogglePython('float')<cr>", desc = "Python" },
{ "<a-5>", mode = { "n", "x", "o", "t" }, "<cmd>lua TermTogglePython('float')<cr>", desc = "Python" },
-- node
{ "<leader>tn", "<cmd>lua TermToggleNode('float')<cr>", desc = "Node" },
{ "<a-6>", mode = { "n", "x", "o", "t" }, "<cmd>lua TermToggleNode('float')<cr>", desc = "Node" },
-- lua
{ "<leader>tl", "<cmd>lua TermToggleLua('float')<cr>", desc = "Lua" },
{ "<a-7>", mode = { "n", "x", "o", "t" }, "<cmd>lua TermToggleLua('float')<cr>", desc = "Lua" },
--
},
},
}

View file

@ -0,0 +1,12 @@
return {
{
"s1n7ax/nvim-window-picker",
name = "window-picker",
event = "VeryLazy",
version = "2.*",
config = function()
require("window-picker").setup()
end,
},
}

56
lua/user/csearchpath.lua Normal file
View file

@ -0,0 +1,56 @@
-- csearchpath.lua
local function script_path()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
function CSearchPaths(args)
args = args or {}
args.cxx = args.cxx or os.getenv("CXX") or "/usr/bin/g++"
args.cppflags = args.cppflags or os.getenv("CPPFLAGS") or ""
args.paths = args.paths or {}
local cmd = "bash -c 'export CXX=\""
.. string.gsub(args.cxx, '"', '\\"')
.. '";'
.. 'export CPPFLAGS="'
.. string.gsub(args.cppflags, '"', '\\"')
.. '";'
.. ". "
.. script_path()
.. "csearchpath.sh"
.. ";"
.. "csearchpaths'"
local proc = io.popen(cmd)
if proc == nil then
return
end
local s = proc:read("*all")
proc:close()
if s == nil then
return
end
-- Add Current working directory
vim.opt.path = vim.fn.getcwd() .. "/**"
-- Add user search paths
for _, path in pairs(args.paths) do
vim.opt.path = vim.opt.path + path
end
-- Add toolchain search path
for path in string.gmatch(s, "[^\r\n]+") do
if string.sub(path, 1, 1) ~= "#" then
vim.opt.path = vim.opt.path + path
end
end
-- Add system wide includes
vim.opt.path = vim.opt.path + ".,/usr/include,,"
end
CSearchPaths()

34
lua/user/csearchpath.sh Normal file
View file

@ -0,0 +1,34 @@
#!/usr/bin/env bash
#export CPPFLAGS=""
#export CFLAGS=-std=c99
#export CXXFLAGS=-Weffc++
function cdefines() {
local regexp="^#include\s+(<|\")\.\.\.(>|\")\s+search\s+starts\s+here:$"
while read -r line; do
echo "$line"
done <<<"$(${CXX} "${CPPFLAGS}" -xc++ -E -dM - </dev/null 2>&1)"
}
function csearchpaths() {
local do_print=0
local regexp="^#include\s+(<|\")\.\.\.(>|\")\s+search\s+starts\s+here:$"
while read -r line; do
if [[ "${line}" =~ $regexp ]]; then
echo "${line}"
do_print=1
continue
elif [ "End of search list." == "${line}" ]; then
do_print=0
else
:
fi
if [ "${do_print}" == "1" ]; then
echo "${line}"
fi
done <<<"$(${CXX} "${CPPFLAGS}" -xc++ -E -v - </dev/null 2>&1)"
}

57
lua/user/docker.lua Normal file
View file

@ -0,0 +1,57 @@
json = require("thirdparty.json.json")
utils = require("lua.user.utils")
local M = {}
function M.container(args)
args = args or { cmd = "list" }
function list()
local proc = io.popen("docker ps -as --no-trunc --format json", "r")
if proc == nil then
return false
end
lst = {}
for line in proc:lines() do
t = json.decode(line)
lst[t.Image] = t
end
return true, lst
end
function start(cid)
local suc, _, _ = os.execute("docker start " .. cid .. " > /dev/null 2>&1")
return suc ~= nil and suc
end
function stop(cid)
local suc, _, _ = os.execute("docker stop " .. cid .. " > /dev/null 2>&1")
return suc ~= nil and suc
end
function restart(cid)
stop(cid)
return start(cid)
end
function attach(cid, callback)
return start(cid) and callback(cid)
end
if args.cmd == "list" then
return list()
elseif args.cmd == "start" then
return start(args.cid)
elseif args.cmd == "stop" then
return stop(args.cid)
elseif args.cmd == "restart" then
return restart(args.cid)
elseif args.cmd == "attach" then
return attach(args.cid, args.callback)
else
return list()
end
end
return M

6
lua/user/scratchpad.lua Normal file
View file

@ -0,0 +1,6 @@
local utils = require("user.utils")
vim.ui.select({ "apple", "banana", "mango" }, {
prompt = "Title",
telescope = require("telescope.themes").get_cursor(),
}, function(selected) end)

236
lua/user/toggleterm.lua Normal file
View file

@ -0,0 +1,236 @@
-- toggleterm-config.lua
local utils = require("user.utils")
local docker = require("user.docker")
local status_ok, toggleterm = pcall(require, "toggleterm")
if not status_ok then
return
end
toggleterm.setup({
size = 20,
open_mapping = [[<c-\>]],
hide_numbers = true,
shade_filetypes = {},
shade_terminals = true,
shading_factor = 2,
start_in_insert = true,
insert_mappings = true,
persist_size = true,
direction = "float",
close_on_exit = true,
shell = vim.o.shell,
float_opts = {
border = "curved",
winblend = 0,
highlights = {
border = "Normal",
background = "Normal",
},
},
})
---@diagnostic disable-next-line: duplicate-set-field
function _G.set_terminal_keymaps()
local opts = { noremap = true }
vim.api.nvim_buf_set_keymap(0, "t", "<esc>", [[<C-\><C-n>]], opts)
vim.api.nvim_buf_set_keymap(0, "t", "jk", [[<C-\><C-n>]], opts)
vim.api.nvim_buf_set_keymap(0, "t", "<C-h>", [[<C-\><C-n><C-W>h]], opts)
vim.api.nvim_buf_set_keymap(0, "t", "<C-j>", [[<C-\><C-n><C-W>j]], opts)
vim.api.nvim_buf_set_keymap(0, "t", "<C-k>", [[<C-\><C-n><C-W>k]], opts)
vim.api.nvim_buf_set_keymap(0, "t", "<C-l>", [[<C-\><C-n><C-W>l]], opts)
end
vim.cmd("autocmd! TermOpen term://* lua set_terminal_keymaps()")
local Terminal = require("toggleterm.terminal").Terminal
local ids = 0
local function next_id()
id = ids
ids = ids + 1
return id
end
local function get_ssh_hosts(path)
local hosts = {}
path = path or os.getenv("HOME") .. "/.ssh/config"
if type(path) ~= "string" then
print("expected arg path of type 'string' actual '" .. type(path))
return hosts
end
if not utils.file_exists(path) then
print("file '" .. path .. "' do not exist!")
return hosts
end
local file = io.open(path, "r")
if file == nil then
print("could not open file '" .. path .. "'!")
return hosts
end
local cur_host = ""
for line in file:lines() do
for key, value in string.gmatch(line, "%s*(%w+)%s+(.*)") do
if key == "Host" then
cur_host = string.lower(value)
hosts[cur_host] = {}
hosts[cur_host][string.lower(key)] = cur_host
else
hosts[cur_host][string.lower(key)] = value
end
end
end
for k, _ in pairs(hosts) do
hosts[k].port = hosts[k].port or 22
hosts[k].hostname = hosts[k].hostname or os.getenv("HOSTNAME")
hosts[k].user = hosts[k].user or os.getenv("USERNAME")
hosts[k].term = nil
end
hosts.current = nil
return hosts
end
local function get_containers()
local suc, hosts = docker.container({ cmd = "list" })
if not suc or hosts == nil then
return {}
end
for k, _ in pairs(hosts) do
hosts[k].term = nil
end
hosts.current = nil
return hosts
end
local bash = {
float = {
term = nil,
size = -1,
},
vertical = {
term = nil,
size = 80,
},
horizontal = {
term = nil,
size = 20,
},
}
function TermToggleBash(direction)
direction = direction or "float"
if bash[direction].term == nil then
bash[direction].term = Terminal:new({
id = next_id(),
display_name = "bash:" .. direction,
cmd = "bash",
direction = direction,
hidden = true,
})
end
bash[direction].term:toggle(bash[direction].size, direction)
end
local lazygit = nil
function TermToggleLazyGit()
if lazygit == nil then
lazygit = Terminal:new({ id = next_id(), display_name = "lazygit", cmd = "lazygit", hidden = true })
end
lazygit:toggle()
end
local lua = nil
function TermToggleLua()
if lua == nil then
lua = Terminal:new({ id = next_id(), display_name = "Lua", cmd = "lua", hidden = true })
end
lua:toggle()
end
local node = nil
function TermToggleNode()
if node == nil then
node = Terminal:new({ id = next_id(), display_name = "Node", cmd = "node", hidden = true })
end
node:toggle()
end
local python = nil
function TermTogglePython()
if python == nil then
python = Terminal:new({ id = next_id(), display_name = "Python", cmd = "python3", hidden = true })
end
python:toggle()
end
local htop = nil
function _HTOP_TOGGLE()
if htop == nil then
htop = Terminal:new({ id = next_id(), display_name = "htop", cmd = "htop", hidden = true })
end
htop:toggle()
end
local ssh_hosts = { items = get_ssh_hosts(), selected = nil }
function TermSelectSsh()
vim.ui.select(utils.get_keys(ssh_hosts.items), {
prompt = "Select a host:",
}, function(choice)
host = ssh_hosts.items[choice]
if host ~= nil then
if host.term == nil then
host.term = Terminal:new({
id = next_id(),
display_name = "ssh://" .. host.user .. "@" .. host.hostname .. ":" .. host.port,
cmd = "ssh " .. host.user .. "@" .. host.hostname .. " -p" .. host.port,
hidden = true,
})
end
host.term:open()
ssh_hosts.selected = host
end
end)
end
function TermToggleSsh()
if ssh_hosts.selected ~= nil then
ssh_hosts.selected.term:toggle()
else
TermSelectSsh()
end
end
local containers = { items = get_containers(), selected = nil }
function TermSelectContainer()
vim.ui.select(utils.get_keys(containers.items), {
prompt = "Select a container:",
}, function(choice)
container = containers.items[choice]
if container ~= nil then
if container.term == nil then
container.term = Terminal:new({
id = next_id(),
display_name = "container://" .. container.Image,
cmd = "docker start " .. container.ID .. " && docker attach " .. container.ID,
hidden = true,
})
end
container.term:open()
containers.selected = container
end
end)
end
function TermToggleContainer()
if containers.selected ~= nil then
containers.selected.term:toggle()
else
TermSelectContainer()
end
end

55
lua/user/utils.lua Normal file
View file

@ -0,0 +1,55 @@
local M = {}
function M.debug(...)
print(...)
end
function M.dump(t)
if type(t) == "table" then
local str = "{ "
for key, value in pairs(t) do
if type(key) ~= "number" then
key = '"' .. key .. '"'
end
str = str .. "[" .. key .. "] = " .. M.dump(value) .. ","
end
return str .. "} "
else
return tostring(t)
end
end
function M.file_exists(path)
local file = io.open(path, "r")
if file ~= nil then
io.close(file)
return true
else
return false
end
end
function M.script_path()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
function M.get_keys(t)
local keys = {}
for key, _ in pairs(t) do
table.insert(keys, key)
end
return keys
end
function M.get_values(t, key)
local values = {}
for k, v in pairs(t) do
if key == k then
table.insert(values, v)
end
end
return values
end
return M

1
thirdparty/json vendored Submodule

@ -0,0 +1 @@
Subproject commit dbf4b2dd2eb7c23be2773c89eb059dadd6436f94