neovim/runtime/doc
Gregory Anders 6ea6b3fee2
feat(ui): add support for OSC 8 hyperlinks (#27109)
Extmarks can contain URLs which can then be drawn in any supporting UI.
In the TUI, for example, URLs are "drawn" by emitting the OSC 8 control
sequence to the TTY. On terminals which support the OSC 8 sequence this
will create clickable hyperlinks.

URLs are treated as inline highlights in the decoration subsystem, so
are included in the `DecorSignHighlight` structure. However, unlike
other inline highlights they use allocated memory which must be freed,
so they set the `ext` flag in `DecorInline` so that their lifetimes are
managed along with other allocated memory like virtual text.

The decoration subsystem then adds the URLs as a new highlight
attribute. The highlight subsystem maintains a set of unique URLs to
avoid duplicating allocations for the same string. To attach a URL to an
existing highlight attribute we call `hl_add_url` which finds the URL in
the set (allocating and adding it if it does not exist) and sets the
`url` highlight attribute to the index of the URL in the set (using an
index helps keep the size of the `HlAttrs` struct small).

This has the potential to lead to an increase in highlight attributes
if a URL is used over a range that contains many different highlight
attributes, because now each existing attribute must be combined with
the URL. In practice, however, URLs typically span a range containing a
single highlight (e.g. link text in Markdown), so this is likely just a
pathological edge case.

When a new highlight attribute is defined with a URL it is copied to all
attached UIs with the `hl_attr_define` UI event. The TUI manages its own
set of URLs (just like the highlight subsystem) to minimize allocations.
The TUI keeps track of which URL is "active" for the cell it is
printing. If no URL is active and a cell containing a URL is printed,
the opening OSC 8 sequence is emitted and that URL becomes the actively
tracked URL. If the cursor is moved while in the middle of a URL span,
we emit the terminating OSC sequence to prevent the hyperlink from
spanning multiple lines.

This does not support nested hyperlinks, but that is a rare (and,
frankly, bizarre) use case. If a valid use case for nested hyperlinks
ever presents itself we can address that issue then.
2024-01-24 16:36:25 -06:00
..
api.txt feat(ui): add support for OSC 8 hyperlinks (#27109) 2024-01-24 16:36:25 -06:00
arabic.txt docs: remove trailing spaces #24455 2023-07-25 05:07:13 -07:00
autocmd.txt vim-patch:e13b665a6e2a (#27163) 2024-01-24 06:07:42 +08:00
backers.txt docs: convert BACKERS.md to backers.txt 2023-12-28 22:41:01 +01:00
builtin.txt fix(eval): properly support checking v:lua function in exists() (#27124) 2024-01-22 16:04:50 +08:00
change.txt vim-patch:955652f6df9c (#26667) 2023-12-20 07:02:48 +08:00
channel.txt docs: small fixes (#25585) 2023-10-29 16:02:32 +08:00
cmdline.txt vim-patch:61e984e212ed (#26484) 2023-12-09 15:35:45 +08:00
debug.txt
deprecated.txt refactor(lsp): deprecate vim.lsp.util.lookup_section 2024-01-16 20:14:17 +00:00
dev_style.txt docs: various fixes (#26929) 2024-01-17 14:01:39 +08:00
dev_theme.txt feat(highlight): tweak default color scheme 2023-12-16 14:43:03 +01:00
dev_tools.txt docs: fix links 2023-12-13 20:31:16 +01:00
dev_vimpatch.txt docs: fix links 2023-12-13 20:31:16 +01:00
develop.txt docs: small fixes 2024-01-02 22:00:06 +01:00
diagnostic.txt fix(diagnostic): typing 2024-01-16 09:33:10 +00:00
diff.txt vim-patch:partial:6f4754b9f725 2023-04-17 15:46:24 +08:00
digraph.txt vim-patch:9.0.2056: no digraph for quadruple prime 2023-10-20 13:03:36 +02:00
editing.txt vim-patch:93197fde0f1d 2024-01-15 11:40:44 +01:00
editorconfig.txt docs: small fixes (#26243) 2023-12-06 08:04:21 +08:00
eval.txt docs: move vim-variables to separate file 2023-12-21 14:19:10 +00:00
faq.txt docs: fix links 2023-12-13 20:31:16 +01:00
filetype.txt vim-patch:9.1.0013: Modula2 filetype support lacking (#27020) 2024-01-16 17:45:57 +00:00
fold.txt feat(folds): support virtual text format for 'foldtext' (#25209) 2023-09-17 20:29:18 +08:00
ft_ada.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
ft_ps1.txt
ft_raku.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
ft_rust.txt docs: small fixes (#25585) 2023-10-29 16:02:32 +08:00
ft_sql.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
gui.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
hebrew.txt feat(edit)!: remove old c implementation of hebrew keymap 2023-02-28 15:14:03 +01:00
help.txt docs: move vim-patch wiki page to runtime documentation 2023-12-13 18:31:05 +01:00
helphelp.txt docs: fix misparsed headings (#24162) 2023-06-26 11:16:55 +02:00
if_perl.txt test: spellcheck :help (vimdoc) files #24109 2023-06-22 03:44:51 -07:00
if_pyth.txt docs: remove trailing spaces #24455 2023-07-25 05:07:13 -07:00
if_ruby.txt vim-patch:8.2.0578: heredoc for interfaces does not support "trim" 2023-04-29 09:20:52 +08:00
indent.txt vim-patch:d96f25bd69c1 2023-12-30 10:53:31 +01:00
index.txt vim-patch:9c5b90db035b 2024-01-24 11:05:25 +01:00
insert.txt vim-patch:9.1.0015: i_CTRL-R- no longer works in replace mode 2024-01-13 08:29:47 +08:00
intro.txt docs: add wiki FAQ to the runtime documentation (#26539) 2023-12-13 17:31:39 +01:00
job_control.txt docs: small fixes 2023-05-13 21:33:22 +02:00
lsp.txt docs: various #25289 2024-01-18 00:14:48 -08:00
lua-guide.txt docs: small fixes (#26243) 2023-12-06 08:04:21 +08:00
lua.txt feat(vim.version): add vim.version.le and vim.version.ge 2024-01-21 11:41:50 +01:00
luaref.txt docs: small fixes 2024-01-02 22:00:06 +01:00
luvref.txt docs(luvref): update to version bump 2024-01-06 12:02:27 +01:00
map.txt vim-patch:9.1.0010: Keymap completion is not available (#26888) 2024-01-05 08:23:51 +08:00
mbyte.txt refactor(grid): make screen rendering more multibyte than ever before 2023-11-17 12:58:57 +01:00
message.txt vim-patch:9.0.2183: Maximum callback depth is not configurable (#26703) 2023-12-22 10:33:34 +08:00
mlang.txt
motion.txt docs: various #25289 2024-01-18 00:14:48 -08:00
news-0.9.txt docs: do not hardcode LSP version in URL #25648 2023-10-16 08:13:37 -07:00
news.txt feat(ui): add support for OSC 8 hyperlinks (#27109) 2024-01-24 16:36:25 -06:00
nvim_terminal_emulator.txt docs: small fixes (#26448) 2023-12-19 13:29:13 +08:00
nvim.txt
options.txt fix(spell): always accept ':' as filename char in 'spellfile' (#27172) 2024-01-24 18:13:39 +08:00
pattern.txt vim-patch:d3e277f279ed (#25734) 2023-10-21 18:04:08 +08:00
pi_gzip.txt vim-patch:30c762d99ac8 2023-11-14 23:29:09 +01:00
pi_health.txt fix(health): replace healthFoo with DiagnosticFoo (#23475) 2023-05-05 18:15:44 +02:00
pi_msgpack.txt vim-patch:9.0.1335: no test for bad use of spaces in help files (#24483) 2023-07-25 20:58:09 +08:00
pi_netrw.txt vim-patch:71d0ba07a33a 2024-01-09 23:22:48 +01:00
pi_paren.txt
pi_spec.txt docs: fix treesitter parsing errors 2023-01-01 15:05:13 +01:00
pi_tar.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
pi_tutor.txt
pi_zip.txt vim-patch:da4e433dc3be (#25912) 2023-11-06 19:03:08 +08:00
provider.txt fix(osc52): enable OSC 52 by default in tmux sessions (#26072) 2023-11-16 13:56:05 -06:00
quickfix.txt vim-patch:9.0.2064: cannot use buffer-number for errorformat (#25782) 2023-10-26 07:42:29 +08:00
quickref.txt docs: small fixes (#26243) 2023-12-06 08:04:21 +08:00
recover.txt docs: various #25289 2024-01-18 00:14:48 -08:00
remote_plugin.txt docs: small fixes 2023-10-10 19:20:32 +02:00
remote.txt vim-patch:partial:938ae280c79b (#22356) 2023-02-21 23:50:29 +08:00
repeat.txt feat(defaults): map Q and @x to repeat in Visual mode (#26495) 2023-12-27 07:26:18 +08:00
rileft.txt docs: fix treesitter parsing errors 2023-01-01 15:05:13 +01:00
russian.txt docs #24061 2023-06-19 08:40:33 -07:00
scroll.txt vim-patch:5277cfaf8afe (#25397) 2023-09-28 05:22:09 +08:00
sign.txt docs: small fixes (#26154) 2023-11-27 17:43:13 +08:00
spell.txt vim-patch:10e8ff9b2607 (#23977) 2023-06-11 12:40:22 +01:00
starting.txt docs(starting.txt): correct step number (#26185) 2023-11-24 07:19:06 +08:00
support.txt docs: fix typos 2023-04-04 19:07:33 +02:00
syntax.txt vim-patch:e1ddc2d5875d 2024-01-24 23:23:23 +01:00
tabpage.txt
tagsrch.txt docs: remove trailing spaces #24455 2023-07-25 05:07:13 -07:00
term.txt docs(term): use tic -x for better compatibility with old ncurses (#25421) 2023-09-29 10:57:02 -05:00
testing.txt fix(lua): improve annotations for stricter luals diagnostics (#24609) 2023-08-09 11:06:13 +02:00
tips.txt vim-patch:6a500661a9cb 2023-08-10 17:28:02 +08:00
treesitter.txt docs(treesitter): add more examples, and improve consistency 2024-01-24 11:04:16 +01:00
uganda.txt vim-patch:e978b4534a5e (#24697) 2023-08-13 13:25:10 +01:00
ui.txt feat(ui): add support for OSC 8 hyperlinks (#27109) 2024-01-24 16:36:25 -06:00
undo.txt vim-patch:9.0.1683: Updated runtime files (#24638) 2023-08-10 17:45:36 +08:00
userfunc.txt vim-patch:9.0.2059: outstanding exceptions may be skipped (#25736) 2023-10-21 18:46:52 +08:00
usr_01.txt vim-patch:b7398fe41c9e (#23627) 2023-05-15 09:38:32 +02:00
usr_02.txt refactor(options)!: graduate some more shortmess flags 2023-09-25 18:23:15 +02:00
usr_03.txt vim-patch:71badf9547e8 (#23285) 2023-04-23 15:22:55 +02:00
usr_04.txt
usr_05.txt vim-patch:81b8bf5b4a33 2023-08-10 17:28:04 +08:00
usr_06.txt feat!: remove hardcopy 2023-01-03 10:07:43 +00:00
usr_07.txt
usr_08.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_09.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_10.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_11.txt docs #24061 2023-06-19 08:40:33 -07:00
usr_12.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_20.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_21.txt docs: remove trailing spaces #24455 2023-07-25 05:07:13 -07:00
usr_22.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_23.txt
usr_24.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_25.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_26.txt
usr_27.txt
usr_28.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_29.txt fix(docs): vimdoc syntax errors 2023-06-26 11:29:12 +02:00
usr_30.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
usr_31.txt
usr_32.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_40.txt fix(docs): vimdoc syntax errors 2023-06-26 11:29:12 +02:00
usr_41.txt vim-patch:partial:9.1.0027: Vim is missing a foreach() func (#27037) 2024-01-16 11:30:35 +08:00
usr_42.txt docs(manual): fix treesitter parsing errors 2023-01-01 15:05:21 +01:00
usr_43.txt docs: remove trailing spaces #24455 2023-07-25 05:07:13 -07:00
usr_44.txt
usr_45.txt docs #24061 2023-06-19 08:40:33 -07:00
usr_toc.txt feat!: remove hardcopy 2023-01-03 10:07:43 +00:00
various.txt Use Lua autocommand and make TermClose autocommand global 2023-08-10 09:53:56 -05:00
vi_diff.txt fix(docs): vimdoc syntax errors 2023-06-25 17:14:28 +02:00
vim_diff.txt feat(terminal): respond to OSC background and foreground request (#17197) 2024-01-15 10:12:07 -06:00
visual.txt feat(defaults): map Q and @x to repeat in Visual mode (#26495) 2023-12-27 07:26:18 +08:00
vvars.txt feat(terminal): trigger TermRequest autocommand events (#22159) 2024-01-09 08:27:56 -06:00
windows.txt feat(health): make :checkhealth support more split modifiers (#26731) 2023-12-25 10:21:13 +08:00