Improve the codes for sumneko friendly
This commit is contained in:
@@ -307,7 +307,7 @@ autocmd.subscribe('CmdlineChanged', async.debounce_next_tick(on_text_changed))
|
|||||||
autocmd.subscribe('CursorMovedI', function()
|
autocmd.subscribe('CursorMovedI', function()
|
||||||
if config.enabled() then
|
if config.enabled() then
|
||||||
cmp.core:on_moved()
|
cmp.core:on_moved()
|
||||||
else
|
else
|
||||||
cmp.core:reset()
|
cmp.core:reset()
|
||||||
cmp.core.view:close()
|
cmp.core.view:close()
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ local char = require('cmp.utils.char')
|
|||||||
---@field public complete_dedup function
|
---@field public complete_dedup function
|
||||||
local source = {}
|
local source = {}
|
||||||
|
|
||||||
---@alias cmp.SourceStatus "1" | "2" | "3"
|
---@alias cmp.SourceStatus 1 | 2 | 3
|
||||||
source.SourceStatus = {}
|
source.SourceStatus = {}
|
||||||
source.SourceStatus.WAITING = 1
|
source.SourceStatus.WAITING = 1
|
||||||
source.SourceStatus.FETCHING = 2
|
source.SourceStatus.FETCHING = 2
|
||||||
|
|||||||
@@ -1,37 +1,43 @@
|
|||||||
local cmp = {}
|
local cmp = {}
|
||||||
|
|
||||||
---@alias cmp.ConfirmBehavior "'insert'" | "'replace'"
|
---@alias cmp.ConfirmBehavior 'insert' | 'replace'
|
||||||
cmp.ConfirmBehavior = {}
|
cmp.ConfirmBehavior = {
|
||||||
cmp.ConfirmBehavior.Insert = 'insert'
|
Insert = 'insert',
|
||||||
cmp.ConfirmBehavior.Replace = 'replace'
|
Replace = 'replace',
|
||||||
|
}
|
||||||
|
|
||||||
---@alias cmp.SelectBehavior "'insert'" | "'select'"
|
---@alias cmp.SelectBehavior 'insert' | 'select'
|
||||||
cmp.SelectBehavior = {}
|
cmp.SelectBehavior = {
|
||||||
cmp.SelectBehavior.Insert = 'insert'
|
Insert = 'insert',
|
||||||
cmp.SelectBehavior.Select = 'select'
|
Select = 'select',
|
||||||
|
}
|
||||||
|
|
||||||
---@alias cmp.ContextReason "'auto'" | "'manual'" | "'none'"
|
---@alias cmp.ContextReason 'auto' | 'manual' 'triggerOnly' | 'none'
|
||||||
cmp.ContextReason = {}
|
cmp.ContextReason = {
|
||||||
cmp.ContextReason.Auto = 'auto'
|
Auto = 'auto',
|
||||||
cmp.ContextReason.Manual = 'manual'
|
Manual = 'manual',
|
||||||
cmp.ContextReason.TriggerOnly = 'triggerOnly'
|
TriggerOnly = 'triggerOnly',
|
||||||
cmp.ContextReason.None = 'none'
|
None = 'none',
|
||||||
|
}
|
||||||
|
|
||||||
---@alias cmp.TriggerEvent "'InsertEnter'" | "'TextChanged'"
|
---@alias cmp.TriggerEvent 'InsertEnter' | 'TextChanged'
|
||||||
cmp.TriggerEvent = {}
|
cmp.TriggerEvent = {
|
||||||
cmp.TriggerEvent.InsertEnter = 'InsertEnter'
|
InsertEnter = 'InsertEnter',
|
||||||
cmp.TriggerEvent.TextChanged = 'TextChanged'
|
TextChanged = 'TextChanged',
|
||||||
|
}
|
||||||
|
|
||||||
---@alias cmp.PreselectMode "'item'" | "'None'"
|
---@alias cmp.PreselectMode 'item' | 'None'
|
||||||
cmp.PreselectMode = {}
|
cmp.PreselectMode = {
|
||||||
cmp.PreselectMode.Item = 'item'
|
Item = 'item',
|
||||||
cmp.PreselectMode.None = 'none'
|
None = 'none',
|
||||||
|
}
|
||||||
|
|
||||||
---@alias cmp.ItemField "'abbr'" | "'kind'" | "'menu'"
|
---@alias cmp.ItemField 'abbr' | 'kind' | 'menu'
|
||||||
cmp.ItemField = {}
|
cmp.ItemField = {
|
||||||
cmp.ItemField.Abbr = 'abbr'
|
Abbr = 'abbr',
|
||||||
cmp.ItemField.Kind = 'kind'
|
Kind = 'kind',
|
||||||
cmp.ItemField.Menu = 'menu'
|
Menu = 'menu',
|
||||||
|
}
|
||||||
|
|
||||||
---@class cmp.ContextOption
|
---@class cmp.ContextOption
|
||||||
---@field public reason cmp.ContextReason|nil
|
---@field public reason cmp.ContextReason|nil
|
||||||
@@ -86,9 +92,9 @@ cmp.ItemField.Menu = 'menu'
|
|||||||
---@field public view cmp.ViewConfig
|
---@field public view cmp.ViewConfig
|
||||||
---@field public experimental cmp.ExperimentalConfig
|
---@field public experimental cmp.ExperimentalConfig
|
||||||
|
|
||||||
--- @class cmp.WindowConfig
|
---@class cmp.WindowConfig
|
||||||
--- @field completion cmp.WindowConfig
|
---@field completion cmp.WindowConfig
|
||||||
--- @field documentation cmp.WindowConfig|nil
|
---@field documentation cmp.WindowConfig|nil
|
||||||
|
|
||||||
---@class cmp.CompletionConfig
|
---@class cmp.CompletionConfig
|
||||||
---@field public autocomplete cmp.TriggerEvent[]
|
---@field public autocomplete cmp.TriggerEvent[]
|
||||||
@@ -125,8 +131,7 @@ cmp.ItemField.Menu = 'menu'
|
|||||||
---@field public expand fun(args: cmp.SnippetExpansionParams)
|
---@field public expand fun(args: cmp.SnippetExpansionParams)
|
||||||
|
|
||||||
---@class cmp.ExperimentalConfig
|
---@class cmp.ExperimentalConfig
|
||||||
---@field public native_menu boolean
|
---@field public ghost_text cmp.GhostTextConfig|false
|
||||||
---@field public ghost_text cmp.GhostTextConfig|"false"
|
|
||||||
|
|
||||||
---@class cmp.GhostTextConfig
|
---@class cmp.GhostTextConfig
|
||||||
---@field hl_group string
|
---@field hl_group string
|
||||||
@@ -147,14 +152,14 @@ cmp.ItemField.Menu = 'menu'
|
|||||||
---@alias cmp.EntriesConfig cmp.CustomEntriesConfig|cmp.NativeEntriesConfig|cmp.WildmenuEntriesConfig|string
|
---@alias cmp.EntriesConfig cmp.CustomEntriesConfig|cmp.NativeEntriesConfig|cmp.WildmenuEntriesConfig|string
|
||||||
|
|
||||||
---@class cmp.CustomEntriesConfig
|
---@class cmp.CustomEntriesConfig
|
||||||
---@field name "'custom'"
|
---@field name 'custom'
|
||||||
---@field selection_order "'top_down'"|"'near_cursor'"
|
---@field selection_order 'top_down'|'near_cursor'
|
||||||
|
|
||||||
---@class cmp.NativeEntriesConfig
|
---@class cmp.NativeEntriesConfig
|
||||||
---@field name "'native'"
|
---@field name 'native'
|
||||||
|
|
||||||
---@class cmp.WildmenuEntriesConfig
|
---@class cmp.WildmenuEntriesConfig
|
||||||
---@field name "'wildmenu'"
|
---@field name 'wildmenu'
|
||||||
---@field separator string|nil
|
---@field separator string|nil
|
||||||
|
|
||||||
return cmp
|
return cmp
|
||||||
|
|||||||
@@ -1,138 +1,138 @@
|
|||||||
local misc = require('cmp.utils.misc')
|
local misc = require('cmp.utils.misc')
|
||||||
|
|
||||||
---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/
|
---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/
|
||||||
---@class lsp
|
---@class lsp
|
||||||
local lsp = {}
|
local lsp = {}
|
||||||
|
|
||||||
lsp.Position = {}
|
lsp.Position = {
|
||||||
|
---Convert lsp.Position to vim.Position
|
||||||
---Convert lsp.Position to vim.Position
|
---@param buf number|string
|
||||||
---@param buf number|string
|
---@param position lsp.Position
|
||||||
---@param position lsp.Position
|
---@return vim.Position
|
||||||
---@return vim.Position
|
to_vim = function(buf, position)
|
||||||
lsp.Position.to_vim = function(buf, position)
|
if not vim.api.nvim_buf_is_loaded(buf) then
|
||||||
if not vim.api.nvim_buf_is_loaded(buf) then
|
vim.fn.bufload(buf)
|
||||||
vim.fn.bufload(buf)
|
end
|
||||||
end
|
local lines = vim.api.nvim_buf_get_lines(buf, position.line, position.line + 1, false)
|
||||||
local lines = vim.api.nvim_buf_get_lines(buf, position.line, position.line + 1, false)
|
if #lines > 0 then
|
||||||
if #lines > 0 then
|
return {
|
||||||
|
row = position.line + 1,
|
||||||
|
col = misc.to_vimindex(lines[1], position.character),
|
||||||
|
}
|
||||||
|
end
|
||||||
return {
|
return {
|
||||||
row = position.line + 1,
|
row = position.line + 1,
|
||||||
col = misc.to_vimindex(lines[1], position.character),
|
col = position.character + 1,
|
||||||
}
|
}
|
||||||
end
|
end,
|
||||||
return {
|
---Convert vim.Position to lsp.Position
|
||||||
row = position.line + 1,
|
---@param buf number|string
|
||||||
col = position.character + 1,
|
---@param position vim.Position
|
||||||
}
|
---@return lsp.Position
|
||||||
end
|
to_lsp = function(buf, position)
|
||||||
|
if not vim.api.nvim_buf_is_loaded(buf) then
|
||||||
---Convert vim.Position to lsp.Position
|
vim.fn.bufload(buf)
|
||||||
---@param buf number|string
|
end
|
||||||
---@param position vim.Position
|
local lines = vim.api.nvim_buf_get_lines(buf, position.row - 1, position.row, false)
|
||||||
---@return lsp.Position
|
if #lines > 0 then
|
||||||
lsp.Position.to_lsp = function(buf, position)
|
return {
|
||||||
if not vim.api.nvim_buf_is_loaded(buf) then
|
line = position.row - 1,
|
||||||
vim.fn.bufload(buf)
|
character = misc.to_utfindex(lines[1], position.col),
|
||||||
end
|
}
|
||||||
local lines = vim.api.nvim_buf_get_lines(buf, position.row - 1, position.row, false)
|
end
|
||||||
if #lines > 0 then
|
|
||||||
return {
|
return {
|
||||||
line = position.row - 1,
|
line = position.row - 1,
|
||||||
character = misc.to_utfindex(lines[1], position.col),
|
character = position.col - 1,
|
||||||
}
|
}
|
||||||
end
|
end,
|
||||||
return {
|
}
|
||||||
line = position.row - 1,
|
|
||||||
character = position.col - 1,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
lsp.Range = {}
|
lsp.Range = {
|
||||||
|
---Convert lsp.Range to vim.Range
|
||||||
|
---@param buf number|string
|
||||||
|
---@param range lsp.Range
|
||||||
|
---@return vim.Range
|
||||||
|
to_vim = function(buf, range)
|
||||||
|
return {
|
||||||
|
start = lsp.Position.to_vim(buf, range.start),
|
||||||
|
['end'] = lsp.Position.to_vim(buf, range['end']),
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
|
||||||
---Convert lsp.Range to vim.Range
|
---Convert vim.Range to lsp.Range
|
||||||
---@param buf number|string
|
---@param buf number|string
|
||||||
---@param range lsp.Range
|
---@param range vim.Range
|
||||||
---@return vim.Range
|
---@return lsp.Range
|
||||||
lsp.Range.to_vim = function(buf, range)
|
to_lsp = function(buf, range)
|
||||||
return {
|
return {
|
||||||
start = lsp.Position.to_vim(buf, range.start),
|
start = lsp.Position.to_lsp(buf, range.start),
|
||||||
['end'] = lsp.Position.to_vim(buf, range['end']),
|
['end'] = lsp.Position.to_lsp(buf, range['end']),
|
||||||
}
|
}
|
||||||
end
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
---Convert vim.Range to lsp.Range
|
---@alias lsp.CompletionTriggerKind 1 | 2 | 3
|
||||||
---@param buf number|string
|
lsp.CompletionTriggerKind = {
|
||||||
---@param range vim.Range
|
Invoked = 1,
|
||||||
---@return lsp.Range
|
TriggerCharacter = 2,
|
||||||
lsp.Range.to_lsp = function(buf, range)
|
TriggerForIncompleteCompletions = 3,
|
||||||
return {
|
}
|
||||||
start = lsp.Position.to_lsp(buf, range.start),
|
|
||||||
['end'] = lsp.Position.to_lsp(buf, range['end']),
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
---@alias lsp.CompletionTriggerKind "1" | "2" | "3"
|
---@alias lsp.InsertTextFormat 1 | 2
|
||||||
lsp.CompletionTriggerKind = {}
|
lsp.InsertTextFormat = {}
|
||||||
lsp.CompletionTriggerKind.Invoked = 1
|
lsp.InsertTextFormat.PlainText = 1
|
||||||
lsp.CompletionTriggerKind.TriggerCharacter = 2
|
lsp.InsertTextFormat.Snippet = 2
|
||||||
lsp.CompletionTriggerKind.TriggerForIncompleteCompletions = 3
|
|
||||||
|
---@alias lsp.InsertTextMode 1 | 2
|
||||||
|
lsp.InsertTextMode = {
|
||||||
|
AsIs = 1,
|
||||||
|
AdjustIndentation = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
---@alias lsp.MarkupKind 'plaintext' | 'markdown'
|
||||||
|
lsp.MarkupKind = {
|
||||||
|
PlainText = 'plaintext',
|
||||||
|
Markdown = 'markdown',
|
||||||
|
}
|
||||||
|
|
||||||
|
---@alias lsp.CompletionItemTag 1
|
||||||
|
lsp.CompletionItemTag = {
|
||||||
|
Deprecated = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
---@alias lsp.CompletionItemKind 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25
|
||||||
|
lsp.CompletionItemKind = {
|
||||||
|
Text = 1,
|
||||||
|
Method = 2,
|
||||||
|
Function = 3,
|
||||||
|
Constructor = 4,
|
||||||
|
Field = 5,
|
||||||
|
Variable = 6,
|
||||||
|
Class = 7,
|
||||||
|
Interface = 8,
|
||||||
|
Module = 9,
|
||||||
|
Property = 10,
|
||||||
|
Unit = 11,
|
||||||
|
Value = 12,
|
||||||
|
Enum = 13,
|
||||||
|
Keyword = 14,
|
||||||
|
Snippet = 15,
|
||||||
|
Color = 16,
|
||||||
|
File = 17,
|
||||||
|
Reference = 18,
|
||||||
|
Folder = 19,
|
||||||
|
EnumMember = 20,
|
||||||
|
Constant = 21,
|
||||||
|
Struct = 22,
|
||||||
|
Event = 23,
|
||||||
|
Operator = 24,
|
||||||
|
TypeParameter = 25,
|
||||||
|
}
|
||||||
|
|
||||||
---@class lsp.CompletionContext
|
---@class lsp.CompletionContext
|
||||||
---@field public triggerKind lsp.CompletionTriggerKind
|
---@field public triggerKind lsp.CompletionTriggerKind
|
||||||
---@field public triggerCharacter string|nil
|
---@field public triggerCharacter string|nil
|
||||||
|
|
||||||
---@alias lsp.InsertTextFormat "1" | "2"
|
|
||||||
lsp.InsertTextFormat = {}
|
|
||||||
lsp.InsertTextFormat.PlainText = 1
|
|
||||||
lsp.InsertTextFormat.Snippet = 2
|
|
||||||
lsp.InsertTextFormat = vim.tbl_add_reverse_lookup(lsp.InsertTextFormat)
|
|
||||||
|
|
||||||
---@alias lsp.InsertTextMode "1" | "2"
|
|
||||||
lsp.InsertTextMode = {}
|
|
||||||
lsp.InsertTextMode.AsIs = 0
|
|
||||||
lsp.InsertTextMode.AdjustIndentation = 1
|
|
||||||
lsp.InsertTextMode = vim.tbl_add_reverse_lookup(lsp.InsertTextMode)
|
|
||||||
|
|
||||||
---@alias lsp.MarkupKind "'plaintext'" | "'markdown'"
|
|
||||||
lsp.MarkupKind = {}
|
|
||||||
lsp.MarkupKind.PlainText = 'plaintext'
|
|
||||||
lsp.MarkupKind.Markdown = 'markdown'
|
|
||||||
lsp.MarkupKind = vim.tbl_add_reverse_lookup(lsp.MarkupKind)
|
|
||||||
|
|
||||||
---@alias lsp.CompletionItemTag "1"
|
|
||||||
lsp.CompletionItemTag = {}
|
|
||||||
lsp.CompletionItemTag.Deprecated = 1
|
|
||||||
lsp.CompletionItemTag = vim.tbl_add_reverse_lookup(lsp.CompletionItemTag)
|
|
||||||
|
|
||||||
---@alias lsp.CompletionItemKind "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "17" | "18" | "19" | "20" | "21" | "22" | "23" | "24" | "25"
|
|
||||||
lsp.CompletionItemKind = {}
|
|
||||||
lsp.CompletionItemKind.Text = 1
|
|
||||||
lsp.CompletionItemKind.Method = 2
|
|
||||||
lsp.CompletionItemKind.Function = 3
|
|
||||||
lsp.CompletionItemKind.Constructor = 4
|
|
||||||
lsp.CompletionItemKind.Field = 5
|
|
||||||
lsp.CompletionItemKind.Variable = 6
|
|
||||||
lsp.CompletionItemKind.Class = 7
|
|
||||||
lsp.CompletionItemKind.Interface = 8
|
|
||||||
lsp.CompletionItemKind.Module = 9
|
|
||||||
lsp.CompletionItemKind.Property = 10
|
|
||||||
lsp.CompletionItemKind.Unit = 11
|
|
||||||
lsp.CompletionItemKind.Value = 12
|
|
||||||
lsp.CompletionItemKind.Enum = 13
|
|
||||||
lsp.CompletionItemKind.Keyword = 14
|
|
||||||
lsp.CompletionItemKind.Snippet = 15
|
|
||||||
lsp.CompletionItemKind.Color = 16
|
|
||||||
lsp.CompletionItemKind.File = 17
|
|
||||||
lsp.CompletionItemKind.Reference = 18
|
|
||||||
lsp.CompletionItemKind.Folder = 19
|
|
||||||
lsp.CompletionItemKind.EnumMember = 20
|
|
||||||
lsp.CompletionItemKind.Constant = 21
|
|
||||||
lsp.CompletionItemKind.Struct = 22
|
|
||||||
lsp.CompletionItemKind.Event = 23
|
|
||||||
lsp.CompletionItemKind.Operator = 24
|
|
||||||
lsp.CompletionItemKind.TypeParameter = 25
|
|
||||||
lsp.CompletionItemKind = vim.tbl_add_reverse_lookup(lsp.CompletionItemKind)
|
|
||||||
|
|
||||||
---@class lsp.CompletionList
|
---@class lsp.CompletionList
|
||||||
---@field public isIncomplete boolean
|
---@field public isIncomplete boolean
|
||||||
---@field public items lsp.CompletionItem[]
|
---@field public items lsp.CompletionItem[]
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
---@field public abbr string|nil
|
---@field public abbr string|nil
|
||||||
---@field public kind string|nil
|
---@field public kind string|nil
|
||||||
---@field public menu string|nil
|
---@field public menu string|nil
|
||||||
---@field public equal "1"|nil
|
---@field public equal 1|nil
|
||||||
---@field public empty "1"|nil
|
---@field public empty 1|nil
|
||||||
---@field public dup "1"|nil
|
---@field public dup 1|nil
|
||||||
---@field public id any
|
---@field public id any
|
||||||
---@field public abbr_hl_group string|nil
|
---@field public abbr_hl_group string|nil
|
||||||
---@field public kind_hl_group string|nil
|
---@field public kind_hl_group string|nil
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ local binary = {}
|
|||||||
---Insert item to list to ordered index
|
---Insert item to list to ordered index
|
||||||
---@param list any[]
|
---@param list any[]
|
||||||
---@param item any
|
---@param item any
|
||||||
---@param func fun(a: any, b: any): "1"|"-1"|"0"
|
---@param func fun(a: any, b: any): 1|-1|0
|
||||||
binary.insort = function(list, item, func)
|
binary.insort = function(list, item, func)
|
||||||
table.insert(list, binary.search(list, item, func), item)
|
table.insert(list, binary.search(list, item, func), item)
|
||||||
end
|
end
|
||||||
@@ -11,7 +11,7 @@ end
|
|||||||
---Search suitable index from list
|
---Search suitable index from list
|
||||||
---@param list any[]
|
---@param list any[]
|
||||||
---@param item any
|
---@param item any
|
||||||
---@param func fun(a: any, b: any): "1"|"-1"|"0"
|
---@param func fun(a: any, b: any): 1|-1|0
|
||||||
---@return number
|
---@return number
|
||||||
binary.search = function(list, item, func)
|
binary.search = function(list, item, func)
|
||||||
local s = 1
|
local s = 1
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
|
local _
|
||||||
|
|
||||||
local alpha = {}
|
local alpha = {}
|
||||||
string.gsub('abcdefghijklmnopqrstuvwxyz', '.', function(char)
|
_ = string.gsub('abcdefghijklmnopqrstuvwxyz', '.', function(char)
|
||||||
alpha[string.byte(char)] = true
|
alpha[string.byte(char)] = true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local ALPHA = {}
|
local ALPHA = {}
|
||||||
string.gsub('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '.', function(char)
|
_ = string.gsub('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '.', function(char)
|
||||||
ALPHA[string.byte(char)] = true
|
ALPHA[string.byte(char)] = true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local digit = {}
|
local digit = {}
|
||||||
string.gsub('1234567890', '.', function(char)
|
_ = string.gsub('1234567890', '.', function(char)
|
||||||
digit[string.byte(char)] = true
|
digit[string.byte(char)] = true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local white = {}
|
local white = {}
|
||||||
string.gsub(' \t\n', '.', function(char)
|
_ = string.gsub(' \t\n', '.', function(char)
|
||||||
white[string.byte(char)] = true
|
white[string.byte(char)] = true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ misc.safe = function(v)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---Treat 1/0 as bool value
|
---Treat 1/0 as bool value
|
||||||
---@param v boolean|"1"|"0"
|
---@param v boolean|1|0
|
||||||
---@param def boolean
|
---@param def boolean
|
||||||
---@return boolean
|
---@return boolean
|
||||||
misc.bool = function(v, def)
|
misc.bool = function(v, def)
|
||||||
|
|||||||
Reference in New Issue
Block a user