Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

A Telescope extension to manage Toggleterm's terminals in NeoVim

toggleterm-manager.mp4

✨ Features

  • List all Toggleterm terminal buffers and preview them in Telescope
  • Create, open, delete, toggle, and rename terminal buffers
  • Easily customize the appearance of the Telescope window

🛠️ Requirements

⚡ Quickstart

Lazy

{
"ryanmsnyder/toggleterm-manager.nvim",
dependencies= {
"akinsho/nvim-toggleterm.lua",
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim", -- only needed because it's a dependency of telescope
},
config=true,
}

Open toggleterm-manager by either:

  • running the command :Telescope toggleterm_manager
  • calling lua require('toggleterm-manager').open()

Keep reading if you want to change the default configuration.

⚙️ Configuration (optional)

If you want to change the defaults, instead of passing true to lazy's config option, either:

Pass the desired options to lazy's opts:

opts= {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
},

or call toggletem-manager's setup function with the options you want to change:

config=function()
require("toggleterm-manager").setup {
titles= {
prompt="Pick Term",
results="Terminals"
},
-- more overrides if desired
}
end

Defaults

By default, the below table is passed to the setup function:

{
mappings= { -- key mappings bound inside the telescope windowi= {
["<CR>"] = { action=actions.toggle_term, exit_on_action=false }, -- toggles terminal open/closed
["<C-i>"] = { action=actions.create_term, exit_on_action=false }, -- creates a new terminal buffer
["<C-d>"] = { action=actions.delete_term, exit_on_action=false }, -- deletes a terminal buffer
["<C-r>"] = { action=actions.rename_term, exit_on_action=false }, -- provides a prompt to rename a terminal
},
},
titles= {
preview="Preview", -- title of the preview buffer in telescopeprompt=" Terminals", -- title of the prompt buffer in telescoperesults="Results", -- title of the results buffer in telescope
},
results= {
fields= { -- fields that will appear in the results of the telescope window"state", -- the state of the terminal buffer: h = hidden, a = active"space", -- adds space between fields, if desired"term_icon", -- a terminal icon"term_name", -- toggleterm's display_name if it exists, else the terminal's id assigned by toggleterm
},
separator="", -- the character that will be used to separate each field provided in results.fields term_icon="", -- the icon that will be used for term_icon in results.fields
},
search= {
field="term_name" -- the field that telescope fuzzy search will use when typing in the prompt
},
sort= {
field="term_name", -- the field that will be used for sorting in the telesocpe resultsascending=true, -- whether or not the field provided above will be sorted in ascending or descending order
},
}

Configuration Specs

PropertyTypeDefault ValueDescription
mappingstableA table of key mappings for different modes. Each mode (i for insert mode, n for normal mode) is a key in the table and maps to another table, where the key is the key combination (e.g., "C-r") and the value is a table with the fields action and exit_on_action. The action field is a function that will be called when the key combination is pressed, and exit_on_action is a boolean that determines whether Telescope should be exited after the action is performed. See Mappings for more info.
titles.previewstring"Preview"Title of the preview buffer in Telescope. Any string.
titles.promptstring" Pick Term"Title of the prompt buffer in Telescope. Any string.
titles.resultsstring"Results"Title of the results buffer in Telescope. Any string.
results.separatorstring" "The character used to separate each field in results.field. Any string, though a space character and a pipe character are the most commonly used.
results.fields{string|{string, string}}[]{ "state", "space", "term_icon", "term_name", }The format and order of the results displayed in the Telescope buffer. This accepts a table where each element is either: an acceptable string a table of tuple-like tables where the first value in the tuple is one of the acceptable strings and the second is a valid NeoVim highlight group that the column should adhere to. The acceptable strings are: bufname, bufnr, space, state, term_name, term_icon. See results for more info.
results.term_iconstring""The icon used for term_icon in results.fields. Any string.
search.fieldstring"term_name"The field that Telescope's fuzzy search will use. Doesn't need to be a value provided in results.fields. Valid strings are: bufname, bufnr, state, term_name.
sort.fieldtable"term_name"The field that will be used for sorting the results in Telescope. Doesn't need to be a value provided in results.fields. Valid strings are: bufnr, recency, state, term_name.
sort.ascendingbooleantrueDetermines the order used for sorting the Telescope results. true = ascending, false = descending.

Mappings

If you'd like to override the default keybindings, the mappings table should look something like this:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
mappings= {
i= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["<C-d>"] = { action=actions.delete_term, exit_on_action=false },
},
n= {
["<CR>"] = { action=actions.create_and_name_term, exit_on_action=true },
["x"] = { action=actions.delete_term, exit_on_action=false },
},
},
}

Note that each key in the table should correspond to the NeoVim mode that the mappings should apply to (i for insert, n for normal). Each mode key should contain another table of key/value pairs where the key is the keybinding and the value is another table of key/value pairs. The valid keys of that table are action, which takes a function that manipulates a terminal in some way and exit_on_action, which determines if the Telescope window should be closed on the execution of the action.

Actions

There are six pre-defined actions that can be mapped to key bindings within the Telescope window.

Floating Toggleterm windows: When configuring Toggleterm (not toggleterm-manager), there is a property called direction, which takes a value of horizontal, vertical, or float. Some of the actions behave differently if direction = float. This is because of how NeoVim handles floating windows. Telescope is already a floating window so if, for example, direction = float, and the create_term action is called with exit_on_action = false, there would normally be a flash caused by opening a Toggleterm float and switching back to Telescope really fast. To prevent this, the Toggleterm window will be created as a hidden terminal. Note that the open_mapping in Toggleterm config won't be able to toggle these terminals open/closed.

The below table displays the behavior of each action given different values for exit_on_action and Toggleterm's direction property that's passed to its setup function.

Actionexit_on_action = trueexit_on_action = false
direction = floatdirection != floatdirection = floatdirection != float
create_termCreate and focus a new terminalCreate and focus a new terminalCreate a hidden terminalCreate a new terminal
create_and_name_termCreate, name, and focus a new terminalCreate, name, and focus a new terminalCreate a hidden terminal and name itCreate and name a new terminal
rename_termRename and focus the terminal if openRename and focus the terminal if openRename the terminalRename the terminal
open_termOpen and focus the terminalOpen and focus the terminalNothing will happenOpen the terminal
toggle_termToggle terminal open or closed, focus if openToggle terminal open or closed, focus if openToggle terminal open or closedToggle terminal open or closed
delete_termDelete the terminalDelete the terminalDelete the terminalDelete the terminal

Custom Actions

User-created functions can also be provided. Any function passed in as an action will receive two arguments: prompt_bufnr and exit_on_action.

localfunctionmy_custom_action(prompt_bufnr, exit_on_action)
-- get current telescope selectionlocalselection=actions_state.get_selected_entry()
ifselection==nilthenreturnend-- get toggleterm's Terminal objectlocalterm=selection.value-- do something with the terminalterm:open()
end
  • Once Toggleterm's Terminal object is retrieved as seen above, any of Toggleterm's Terminal methods can be used (term:focus(), term:spawn(), etc).

  • Note that this is a simplified exampled. Getting actions to work as intended can feel a bit hacky because of both Toggleterm and Telescope controlling which NeoVim window should be focused.

  • See actions/init.lua for examples of creating actions.

Results

The results property allows for easy customization of how Toggleterm's terminal buffers appear in the Telescope results buffer. results.fields allows for specifying the order that the results fields should appear, from left to right. Any combination and any number of the valid fields may be provided.

Valid Strings for results.fields

FieldDescription
bufnameFile name of the terminal buffer.
bufnrBuffer number of the terminal.
spaceCreate additional space in between fields.
stateCurrent state of the terminal buffer. h = hidden, a = active
term_iconAn icon of a terminal. This icon can be overridden with the results.term_icon property.
term_nameToggleterm's display_name of the terminal, if assigned. Else, the id/toggle_number of the terminal assigned by Toggleterm upon creation.

Results Highlight Groups

The background and foreground colors of the results fields can also be customized by pairing any one of the above fields with a valid highlight group.

Examples

Example of only providing fields (no highlight groups). When a highlight group is not specified for a field, toggleterm-manager chooses the highlight group:

localtoggleterm_manager=require("toggleterm-manager")
localactions=toggleterm_manager.actionstoggleterm_manager.setup {
results= {
fields= { "term_icon", "term_name", "space", "state" }
},
}

Example of providing highlight groups for some fields and not for others. When a highlight group is paired with a field in a table, that highlight group overrides the default that toggleterm-manager chooses.

results= {
fields= { "state", "space", { "bufnr", "TelescopeResultsIdentifier" }, "space", "term_icon", { "bufname", "Function" } }
}

About

A Telescope extension to manage Toggleterm's terminals in NeoVim

Topics

Resources

Stars

90 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages