mirror of
https://github.com/neovim/neovim.git
synced 2025-09-07 03:48:18 +00:00
docs(annotation): return types for Vimscript functions #31546
This commit is contained in:
@@ -1639,6 +1639,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'ctxset',
|
||||
params = { { 'context', 'table' }, { 'index', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'ctxset({context} [, {index}])',
|
||||
},
|
||||
ctxsize = {
|
||||
@@ -1869,6 +1870,7 @@ M.funcs = {
|
||||
fast = true,
|
||||
name = 'did_filetype',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'did_filetype()',
|
||||
},
|
||||
diff_filler = {
|
||||
@@ -1886,6 +1888,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'diff_filler',
|
||||
params = { { 'lnum', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'diff_filler({lnum})',
|
||||
},
|
||||
diff_hlID = {
|
||||
@@ -1930,6 +1933,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'digraph_get',
|
||||
params = { { 'chars', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'digraph_get({chars})',
|
||||
},
|
||||
digraph_getlist = {
|
||||
@@ -1952,6 +1956,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'digraph_getlist',
|
||||
params = { { 'listall', 'boolean' } },
|
||||
returns = 'string[][]',
|
||||
signature = 'digraph_getlist([{listall}])',
|
||||
},
|
||||
digraph_set = {
|
||||
@@ -2016,6 +2021,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'empty',
|
||||
params = { { 'expr', 'any' } },
|
||||
returns = 'integer',
|
||||
signature = 'empty({expr})',
|
||||
},
|
||||
environ = {
|
||||
@@ -2048,6 +2054,7 @@ M.funcs = {
|
||||
fast = true,
|
||||
name = 'escape',
|
||||
params = { { 'string', 'string' }, { 'chars', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'escape({string}, {chars})',
|
||||
},
|
||||
eval = {
|
||||
@@ -3018,6 +3025,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'foreach',
|
||||
params = { { 'expr1', 'string|table' }, { 'expr2', 'string|function' } },
|
||||
returns = 'string|table',
|
||||
signature = 'foreach({expr1}, {expr2})',
|
||||
},
|
||||
foreground = {
|
||||
@@ -3372,6 +3380,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'getbufline',
|
||||
params = { { 'buf', 'integer|string' }, { 'lnum', 'integer' }, { 'end', 'integer' } },
|
||||
returns = 'string[]',
|
||||
signature = 'getbufline({buf}, {lnum} [, {end}])',
|
||||
},
|
||||
getbufoneline = {
|
||||
@@ -3700,6 +3709,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'getcmdscreenpos',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'getcmdscreenpos()',
|
||||
},
|
||||
getcmdtype = {
|
||||
@@ -4781,6 +4791,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'gettext',
|
||||
params = { { 'text', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'gettext({text})',
|
||||
},
|
||||
getwininfo = {
|
||||
@@ -4965,6 +4976,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'glob2regpat',
|
||||
params = { { 'string', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'glob2regpat({string})',
|
||||
},
|
||||
globpath = {
|
||||
@@ -5372,6 +5384,7 @@ M.funcs = {
|
||||
fast = true,
|
||||
name = 'iconv',
|
||||
params = { { 'string', 'string' }, { 'from', 'string' }, { 'to', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'iconv({string}, {from}, {to})',
|
||||
},
|
||||
id = {
|
||||
@@ -5395,6 +5408,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'id',
|
||||
params = { { 'expr', 'any' } },
|
||||
returns = 'string',
|
||||
signature = 'id({expr})',
|
||||
},
|
||||
indent = {
|
||||
@@ -5447,6 +5461,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'index',
|
||||
params = { { 'object', 'any' }, { 'expr', 'any' }, { 'start', 'integer' }, { 'ic', 'boolean' } },
|
||||
returns = 'integer',
|
||||
signature = 'index({object}, {expr} [, {start} [, {ic}]])',
|
||||
},
|
||||
indexof = {
|
||||
@@ -5494,6 +5509,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'indexof',
|
||||
params = { { 'object', 'any' }, { 'expr', 'any' }, { 'opts', 'table' } },
|
||||
returns = 'integer',
|
||||
signature = 'indexof({object}, {expr} [, {opts}])',
|
||||
},
|
||||
input = {
|
||||
@@ -5502,6 +5518,7 @@ M.funcs = {
|
||||
desc = '',
|
||||
name = 'input',
|
||||
params = { { 'prompt', 'string' }, { 'text', 'string' }, { 'completion', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'input({prompt} [, {text} [, {completion}]])',
|
||||
},
|
||||
input__1 = {
|
||||
@@ -5621,6 +5638,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'input',
|
||||
params = { { 'opts', 'table' } },
|
||||
returns = 'string',
|
||||
signature = 'input({opts})',
|
||||
},
|
||||
inputdialog = {
|
||||
@@ -5667,6 +5685,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'inputrestore',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'inputrestore()',
|
||||
},
|
||||
inputsave = {
|
||||
@@ -5680,6 +5699,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'inputsave',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'inputsave()',
|
||||
},
|
||||
inputsecret = {
|
||||
@@ -5699,6 +5719,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'inputsecret',
|
||||
params = { { 'prompt', 'string' }, { 'text', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'inputsecret({prompt} [, {text}])',
|
||||
},
|
||||
insert = {
|
||||
@@ -5756,7 +5777,8 @@ M.funcs = {
|
||||
<
|
||||
]=],
|
||||
name = 'invert',
|
||||
params = { { 'expr', 'number' } },
|
||||
params = { { 'expr', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'invert({expr})',
|
||||
},
|
||||
isabsolutepath = {
|
||||
@@ -6006,6 +6028,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'jobstart',
|
||||
params = { { 'cmd', 'string|string[]' }, { 'opts', 'table' } },
|
||||
returns = 'integer',
|
||||
signature = 'jobstart({cmd} [, {opts}])',
|
||||
},
|
||||
jobstop = {
|
||||
@@ -6022,6 +6045,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'jobstop',
|
||||
params = { { 'id', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'jobstop({id})',
|
||||
},
|
||||
jobwait = {
|
||||
@@ -6069,6 +6093,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'join',
|
||||
params = { { 'list', 'any[]' }, { 'sep', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'join({list} [, {sep}])',
|
||||
},
|
||||
json_decode = {
|
||||
@@ -6112,6 +6137,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'json_encode',
|
||||
params = { { 'expr', 'any' } },
|
||||
returns = 'string',
|
||||
signature = 'json_encode({expr})',
|
||||
},
|
||||
keys = {
|
||||
@@ -6124,6 +6150,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'keys',
|
||||
params = { { 'dict', 'table' } },
|
||||
returns = 'string[]',
|
||||
signature = 'keys({dict})',
|
||||
},
|
||||
keytrans = {
|
||||
@@ -6139,6 +6166,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'keytrans',
|
||||
params = { { 'string', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'keytrans({string})',
|
||||
},
|
||||
last_buffer_nr = {
|
||||
@@ -6165,7 +6193,8 @@ M.funcs = {
|
||||
|
||||
]=],
|
||||
name = 'len',
|
||||
params = { { 'expr', 'any' } },
|
||||
params = { { 'expr', 'any[]' } },
|
||||
returns = 'integer',
|
||||
signature = 'len({expr})',
|
||||
tags = { 'E701' },
|
||||
},
|
||||
@@ -6300,6 +6329,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'lispindent',
|
||||
params = { { 'lnum', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'lispindent({lnum})',
|
||||
},
|
||||
list2blob = {
|
||||
@@ -6318,6 +6348,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'list2blob',
|
||||
params = { { 'list', 'any[]' } },
|
||||
returns = 'string',
|
||||
signature = 'list2blob({list})',
|
||||
},
|
||||
list2str = {
|
||||
@@ -6342,6 +6373,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'list2str',
|
||||
params = { { 'list', 'any[]' }, { 'utf8', 'boolean' } },
|
||||
returns = 'string',
|
||||
signature = 'list2str({list} [, {utf8}])',
|
||||
},
|
||||
localtime = {
|
||||
@@ -6351,6 +6383,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'localtime',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'localtime()',
|
||||
},
|
||||
log = {
|
||||
@@ -6371,6 +6404,7 @@ M.funcs = {
|
||||
float_func = 'log',
|
||||
name = 'log',
|
||||
params = { { 'expr', 'number' } },
|
||||
returns = 'number',
|
||||
signature = 'log({expr})',
|
||||
},
|
||||
log10 = {
|
||||
@@ -6390,6 +6424,7 @@ M.funcs = {
|
||||
float_func = 'log10',
|
||||
name = 'log10',
|
||||
params = { { 'expr', 'number' } },
|
||||
returns = 'number',
|
||||
signature = 'log10({expr})',
|
||||
},
|
||||
luaeval = {
|
||||
@@ -7422,6 +7457,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'min',
|
||||
params = { { 'expr', 'any' } },
|
||||
returns = 'number',
|
||||
signature = 'min({expr})',
|
||||
},
|
||||
mkdir = {
|
||||
@@ -7470,6 +7506,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'mkdir',
|
||||
params = { { 'name', 'string' }, { 'flags', 'string' }, { 'prot', 'string' } },
|
||||
returns = 'integer',
|
||||
signature = 'mkdir({name} [, {flags} [, {prot}]])',
|
||||
tags = { 'E739' },
|
||||
},
|
||||
@@ -7649,6 +7686,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'nextnonblank',
|
||||
params = { { 'lnum', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'nextnonblank({lnum})',
|
||||
},
|
||||
nr2char = {
|
||||
@@ -7672,6 +7710,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'nr2char',
|
||||
params = { { 'expr', 'integer' }, { 'utf8', 'boolean' } },
|
||||
returns = 'string',
|
||||
signature = 'nr2char({expr} [, {utf8}])',
|
||||
},
|
||||
nvim_api__ = {
|
||||
@@ -7733,6 +7772,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'pathshorten',
|
||||
params = { { 'path', 'string' }, { 'len', 'integer' } },
|
||||
returns = 'string',
|
||||
signature = 'pathshorten({path} [, {len}])',
|
||||
},
|
||||
perleval = {
|
||||
@@ -7776,6 +7816,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'pow',
|
||||
params = { { 'x', 'number' }, { 'y', 'number' } },
|
||||
returns = 'number',
|
||||
signature = 'pow({x}, {y})',
|
||||
},
|
||||
prevnonblank = {
|
||||
@@ -7793,6 +7834,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'prevnonblank',
|
||||
params = { { 'lnum', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'prevnonblank({lnum})',
|
||||
},
|
||||
printf = {
|
||||
@@ -8682,6 +8724,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'rename',
|
||||
params = { { 'from', 'string' }, { 'to', 'string' } },
|
||||
returns = 'integer',
|
||||
signature = 'rename({from}, {to})',
|
||||
},
|
||||
['repeat'] = {
|
||||
@@ -8724,6 +8767,7 @@ M.funcs = {
|
||||
fast = true,
|
||||
name = 'resolve',
|
||||
params = { { 'filename', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'resolve({filename})',
|
||||
},
|
||||
reverse = {
|
||||
@@ -8765,6 +8809,7 @@ M.funcs = {
|
||||
float_func = 'round',
|
||||
name = 'round',
|
||||
params = { { 'expr', 'number' } },
|
||||
returns = 'number',
|
||||
signature = 'round({expr})',
|
||||
},
|
||||
rpcnotify = {
|
||||
@@ -8778,6 +8823,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'rpcnotify',
|
||||
params = { { 'channel', 'integer' }, { 'event', 'string' }, { '...', 'any' } },
|
||||
returns = 'integer',
|
||||
signature = 'rpcnotify({channel}, {event} [, {args}...])',
|
||||
},
|
||||
rpcrequest = {
|
||||
@@ -8849,6 +8895,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screenattr',
|
||||
params = { { 'row', 'integer' }, { 'col', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'screenattr({row}, {col})',
|
||||
},
|
||||
screenchar = {
|
||||
@@ -8867,6 +8914,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screenchar',
|
||||
params = { { 'row', 'integer' }, { 'col', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'screenchar({row}, {col})',
|
||||
},
|
||||
screenchars = {
|
||||
@@ -8882,6 +8930,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screenchars',
|
||||
params = { { 'row', 'integer' }, { 'col', 'integer' } },
|
||||
returns = 'integer[]',
|
||||
signature = 'screenchars({row}, {col})',
|
||||
},
|
||||
screencol = {
|
||||
@@ -8902,6 +8951,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screencol',
|
||||
params = {},
|
||||
returns = 'integer[]',
|
||||
signature = 'screencol()',
|
||||
},
|
||||
screenpos = {
|
||||
@@ -8947,6 +8997,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screenrow',
|
||||
params = {},
|
||||
returns = 'integer',
|
||||
signature = 'screenrow()',
|
||||
},
|
||||
screenstring = {
|
||||
@@ -8963,6 +9014,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'screenstring',
|
||||
params = { { 'row', 'integer' }, { 'col', 'integer' } },
|
||||
returns = 'string',
|
||||
signature = 'screenstring({row}, {col})',
|
||||
},
|
||||
search = {
|
||||
@@ -9404,6 +9456,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'serverlist',
|
||||
params = {},
|
||||
returns = 'string[]',
|
||||
signature = 'serverlist()',
|
||||
},
|
||||
serverstart = {
|
||||
@@ -9444,6 +9497,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'serverstart',
|
||||
params = { { 'address', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'serverstart([{address}])',
|
||||
},
|
||||
serverstop = {
|
||||
@@ -9456,6 +9510,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'serverstop',
|
||||
params = { { 'address', 'string' } },
|
||||
returns = 'integer',
|
||||
signature = 'serverstop({address})',
|
||||
},
|
||||
setbufline = {
|
||||
@@ -9489,6 +9544,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'setbufline',
|
||||
params = { { 'buf', 'integer|string' }, { 'lnum', 'integer' }, { 'text', 'string|string[]' } },
|
||||
returns = 'integer',
|
||||
signature = 'setbufline({buf}, {lnum}, {text})',
|
||||
},
|
||||
setbufvar = {
|
||||
@@ -9614,6 +9670,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'setcmdline',
|
||||
params = { { 'str', 'string' }, { 'pos', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'setcmdline({str} [, {pos}])',
|
||||
},
|
||||
setcmdpos = {
|
||||
@@ -9964,6 +10021,7 @@ M.funcs = {
|
||||
{ 'action', 'string' },
|
||||
{ 'what', 'vim.fn.setqflist.what' },
|
||||
},
|
||||
returns = 'integer',
|
||||
signature = 'setqflist({list} [, {action} [, {what}]])',
|
||||
},
|
||||
setreg = {
|
||||
@@ -10140,6 +10198,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'sha256',
|
||||
params = { { 'string', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'sha256({string})',
|
||||
},
|
||||
shellescape = {
|
||||
@@ -10180,6 +10239,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'shellescape',
|
||||
params = { { 'string', 'string' }, { 'special', 'boolean' } },
|
||||
returns = 'string',
|
||||
signature = 'shellescape({string} [, {special}])',
|
||||
},
|
||||
shiftwidth = {
|
||||
@@ -10694,6 +10754,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'simplify',
|
||||
params = { { 'filename', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'simplify({filename})',
|
||||
},
|
||||
sin = {
|
||||
@@ -10713,6 +10774,7 @@ M.funcs = {
|
||||
float_func = 'sin',
|
||||
name = 'sin',
|
||||
params = { { 'expr', 'number' } },
|
||||
returns = 'number',
|
||||
signature = 'sin({expr})',
|
||||
},
|
||||
sinh = {
|
||||
@@ -10879,6 +10941,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'soundfold',
|
||||
params = { { 'word', 'string' } },
|
||||
returns = 'string',
|
||||
signature = 'soundfold({word})',
|
||||
},
|
||||
spellbadword = {
|
||||
@@ -10940,6 +11003,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'spellsuggest',
|
||||
params = { { 'word', 'string' }, { 'max', 'integer' }, { 'capital', 'boolean' } },
|
||||
returns = 'string[]',
|
||||
signature = 'spellsuggest({word} [, {max} [, {capital}]])',
|
||||
},
|
||||
split = {
|
||||
@@ -10973,6 +11037,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'split',
|
||||
params = { { 'string', 'string' }, { 'pattern', 'string' }, { 'keepempty', 'boolean' } },
|
||||
returns = 'string[]',
|
||||
signature = 'split({string} [, {pattern} [, {keepempty}]])',
|
||||
},
|
||||
sqrt = {
|
||||
@@ -12209,6 +12274,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'termopen',
|
||||
params = { { 'cmd', 'string|string[]' }, { 'opts', 'table' } },
|
||||
returns = 'integer',
|
||||
signature = 'termopen({cmd} [, {opts}])',
|
||||
},
|
||||
test_garbagecollect_now = {
|
||||
@@ -12718,6 +12784,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'virtcol2col',
|
||||
params = { { 'winid', 'integer' }, { 'lnum', 'integer' }, { 'col', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'virtcol2col({winid}, {lnum}, {col})',
|
||||
},
|
||||
visualmode = {
|
||||
@@ -12742,6 +12809,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'visualmode',
|
||||
params = { { 'expr', 'boolean' } },
|
||||
returns = 'string',
|
||||
signature = 'visualmode([{expr}])',
|
||||
},
|
||||
wait = {
|
||||
@@ -12899,6 +12967,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'win_id2win',
|
||||
params = { { 'expr', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'win_id2win({expr})',
|
||||
},
|
||||
win_move_separator = {
|
||||
@@ -13145,6 +13214,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'winnr',
|
||||
params = { { 'arg', 'string|integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'winnr([{arg}])',
|
||||
},
|
||||
winrestcmd = {
|
||||
@@ -13161,6 +13231,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'winrestcmd',
|
||||
params = {},
|
||||
returns = 'string',
|
||||
signature = 'winrestcmd()',
|
||||
},
|
||||
winrestview = {
|
||||
@@ -13240,6 +13311,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'winwidth',
|
||||
params = { { 'nr', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'winwidth({nr})',
|
||||
},
|
||||
wordcount = {
|
||||
@@ -13335,7 +13407,8 @@ M.funcs = {
|
||||
<
|
||||
]=],
|
||||
name = 'xor',
|
||||
params = { { 'expr', 'number' }, { 'expr', 'number' } },
|
||||
params = { { 'expr', 'integer' }, { 'expr', 'integer' } },
|
||||
returns = 'integer',
|
||||
signature = 'xor({expr}, {expr})',
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user