aboutsummaryrefslogtreecommitdiff
path: root/config/nvim/lua/mytelescope.lua
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2024-02-25 22:49:55 +0100
committerKarel Kočí <cynerd@email.cz>2024-02-25 23:30:57 +0100
commit1970054228b3a9a3a8fc99af723ee13c147e7747 (patch)
tree2f151b709a06980ecb3c3b96930a6d518a1e15ed /config/nvim/lua/mytelescope.lua
parentfe804beeb41d149cc3e3c714061484e651ba48db (diff)
downloadmyconfigs-1970054228b3a9a3a8fc99af723ee13c147e7747.tar.gz
myconfigs-1970054228b3a9a3a8fc99af723ee13c147e7747.tar.bz2
myconfigs-1970054228b3a9a3a8fc99af723ee13c147e7747.zip
Migrate from vim to nvim
Diffstat (limited to 'config/nvim/lua/mytelescope.lua')
-rw-r--r--config/nvim/lua/mytelescope.lua205
1 files changed, 205 insertions, 0 deletions
diff --git a/config/nvim/lua/mytelescope.lua b/config/nvim/lua/mytelescope.lua
new file mode 100644
index 0000000..c4fe3a7
--- /dev/null
+++ b/config/nvim/lua/mytelescope.lua
@@ -0,0 +1,205 @@
+local layout = require("nui.layout")
+local popup = require("nui.popup")
+
+local actions = require("telescope.actions")
+
+local tslayout = require("telescope.pickers.layout")
+
+return require("telescope").setup({
+ defaults = {
+ mappings = {
+ i = {
+ ["<esc>"] = actions.close,
+ ["<c-j>"] = actions.move_selection_next,
+ ["<c-k>"] = actions.move_selection_previous,
+ ["<c-u>"] = false,
+ },
+ },
+
+ create_layout = function(picker)
+ local border = {
+ results = {
+ top_left = "┌",
+ top = "─",
+ top_right = "┬",
+ right = "│",
+ bottom_right = "",
+ bottom = "",
+ bottom_left = "",
+ left = "│",
+ },
+ results_patch = {
+ minimal = {
+ top_left = "┌",
+ top_right = "┐",
+ },
+ horizontal = {
+ top_left = "┌",
+ top_right = "┬",
+ },
+ vertical = {
+ top_left = "├",
+ top_right = "┤",
+ },
+ },
+ prompt = {
+ top_left = "├",
+ top = "─",
+ top_right = "┤",
+ right = "│",
+ bottom_right = "┘",
+ bottom = "─",
+ bottom_left = "└",
+ left = "│",
+ },
+ prompt_patch = {
+ minimal = {
+ bottom_right = "┘",
+ },
+ horizontal = {
+ bottom_right = "┴",
+ },
+ vertical = {
+ bottom_right = "┘",
+ },
+ },
+ preview = {
+ top_left = "┌",
+ top = "─",
+ top_right = "┐",
+ right = "│",
+ bottom_right = "┘",
+ bottom = "─",
+ bottom_left = "└",
+ left = "│",
+ },
+ preview_patch = {
+ minimal = {},
+ horizontal = {
+ bottom = "─",
+ bottom_left = "",
+ bottom_right = "┘",
+ left = "",
+ top_left = "",
+ },
+ vertical = {
+ bottom = "",
+ bottom_left = "",
+ bottom_right = "",
+ left = "│",
+ top_left = "┌",
+ },
+ },
+ }
+
+ local results = popup({
+ focusable = false,
+ border = {
+ style = border.results,
+ text = {
+ top = picker.results_title,
+ top_align = "center",
+ },
+ },
+ win_options = {
+ winhighlight = "Normal:Normal",
+ },
+ })
+
+ local prompt = popup({
+ enter = true,
+ border = {
+ style = border.prompt,
+ text = {
+ top = picker.prompt_title,
+ top_align = "center",
+ },
+ },
+ win_options = {
+ winhighlight = "Normal:Normal",
+ },
+ })
+
+ local preview = popup({
+ focusable = false,
+ border = {
+ style = border.preview,
+ text = {
+ top = picker.preview_title,
+ top_align = "center",
+ },
+ },
+ })
+
+ local box_by_kind = {
+ vertical = layout.Box({
+ layout.Box(preview, { grow = 1 }),
+ layout.Box(results, { grow = 1 }),
+ layout.Box(prompt, { size = 3 }),
+ }, { dir = "col" }),
+ horizontal = layout.Box({
+ layout.Box({
+ layout.Box(results, { grow = 1 }),
+ layout.Box(prompt, { size = 3 }),
+ }, { dir = "col", size = "50%" }),
+ layout.Box(preview, { size = "50%" }),
+ }, { dir = "row" }),
+ minimal = layout.Box({
+ layout.Box(results, { grow = 1 }),
+ layout.Box(prompt, { size = 3 }),
+ }, { dir = "col" }),
+ }
+
+ local function get_box()
+ local height, width = vim.o.lines, vim.o.columns
+ local box_kind = "horizontal"
+ if width < 100 then
+ box_kind = "vertical"
+ if height < 40 then
+ box_kind = "minimal"
+ end
+ elseif width < 120 then
+ box_kind = "minimal"
+ end
+ return box_by_kind[box_kind], box_kind
+ end
+
+ local function prepare_layout_parts(layout, box_type)
+ layout.results = tslayout.Window(results)
+ results.border:set_style(border.results_patch[box_type])
+
+ layout.prompt = tslayout.Window(prompt)
+ prompt.border:set_style(border.prompt_patch[box_type])
+
+ if box_type == "minimal" then
+ layout.preview = nil
+ else
+ layout.preview = tslayout.Window(preview)
+ preview.border:set_style(border.preview_patch[box_type])
+ end
+ end
+
+ local box, box_kind = get_box()
+ local layout = layout({
+ relative = "editor",
+ position = "50%",
+ size = {
+ height = "60%",
+ width = "90%",
+ },
+ }, box)
+
+ layout.picker = picker
+ prepare_layout_parts(layout, box_kind)
+
+ local layout_update = layout.update
+ function layout:update()
+ local box, box_kind = get_box()
+ prepare_layout_parts(layout, box_kind)
+ layout_update(self, box)
+ end
+
+ return tslayout(layout)
+ end,
+ },
+})