[NeoVim] Slight syntax improvements
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
(import-macros {: map!} :hibiscus.vim)
|
(import-macros {: map!} :hibiscus.vim)
|
||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(setup :aerial {
|
(setup :aerial
|
||||||
:close_behavior "global"
|
{:close_behavior "global"
|
||||||
:open_automatic true
|
:open_automatic true
|
||||||
:placement_editor_edge true
|
:placement_editor_edge true
|
||||||
:width 30
|
:width 30
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
(local colors (require :solarized.colors))
|
(local colors (require :solarized.colors))
|
||||||
|
|
||||||
(setup :bufferline {
|
(setup :bufferline
|
||||||
:options {:close_command "Bdelete %d"
|
{:options {:close_command "Bdelete %d"
|
||||||
:right_mouse_command "Bdelete %d"
|
:right_mouse_command "Bdelete %d"
|
||||||
:offsets [{:filetype "neo-tree" :text "File Explorer" :padding 1}
|
:offsets [{:filetype "neo-tree" :text "File Explorer" :padding 1}
|
||||||
{:filetype "aerial" :text "Outline" :padding 1}]
|
{:filetype "aerial" :text "Outline" :padding 1}]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
(import-macros {: map!} :hibiscus.vim)
|
(import-macros {: map!} :hibiscus.vim)
|
||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(setup :diffview {
|
(setup :diffview
|
||||||
:keymaps {:view {:q ":tabc<CR>"}
|
{:keymaps {:view {:q ":tabc<CR>"}
|
||||||
:file_panel {:q ":tabc<CR>"}
|
:file_panel {:q ":tabc<CR>"}
|
||||||
:file_history_panel {:q ":tabc<CR>"}}})
|
:file_history_panel {:q ":tabc<CR>"}}})
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
(local colors (require :solarized.colors))
|
(local colors (require :solarized.colors))
|
||||||
|
|
||||||
(local theme {:fg colors.fg
|
(local theme
|
||||||
|
{:fg colors.fg
|
||||||
:bg colors.bg_alt
|
:bg colors.bg_alt
|
||||||
:black colors.black
|
:black colors.black
|
||||||
:skyblue colors.paleblue
|
:skyblue colors.paleblue
|
||||||
@@ -16,8 +17,8 @@
|
|||||||
:white colors.white
|
:white colors.white
|
||||||
:yellow colors.yellow})
|
:yellow colors.yellow})
|
||||||
|
|
||||||
(setup :feline {
|
(setup :feline
|
||||||
:theme theme
|
{:theme theme
|
||||||
:force_inactive {:filetypes ["^neo\\-tree$"
|
:force_inactive {:filetypes ["^neo\\-tree$"
|
||||||
"^aerial$"
|
"^aerial$"
|
||||||
"^packer$"
|
"^packer$"
|
||||||
|
|||||||
@@ -2,74 +2,86 @@
|
|||||||
|
|
||||||
(local M {})
|
(local M {})
|
||||||
|
|
||||||
(local files {:dictionary (.. (vim.fn.stdpath "config") "/spell/en.utf-8.add")
|
(local files
|
||||||
|
{:dictionary (.. (vim.fn.stdpath "config") "/spell/en.utf-8.add")
|
||||||
:disabledRules (.. (vim.fn.stdpath "config") "/spell/disable.txt")
|
:disabledRules (.. (vim.fn.stdpath "config") "/spell/disable.txt")
|
||||||
:hiddenFalsePositives (.. (vim.fn.stdpath "config") "/spell/false.txt")})
|
:hiddenFalsePositives (.. (vim.fn.stdpath "config") "/spell/false.txt")})
|
||||||
|
|
||||||
(fn file_exists [file] (let [f (io.open file "rb")]
|
(fn file_exists [file]
|
||||||
(match f nil false
|
(let [f (io.open file "rb")]
|
||||||
_ (do (f.close f) true))))
|
(if f
|
||||||
|
(do (f:close) true)
|
||||||
|
false)))
|
||||||
|
|
||||||
(fn lines_from [file] (match (file_exists file) false []
|
(fn lines_from [file]
|
||||||
true (let [lines []]
|
(if (file_exists file)
|
||||||
(do (each [line (io.lines file)]
|
(icollect [line (io.lines file)] line)
|
||||||
(table.insert lines line))
|
[]))
|
||||||
lines))))
|
|
||||||
|
|
||||||
(fn get_client_by_name [name] (let [buf_clients (vim.lsp.buf_get_clients)]
|
(fn get_client_by_name [name]
|
||||||
(each [_ client (ipairs buf_clients)]
|
(let [buf_clients (vim.lsp.buf_get_clients)]
|
||||||
(match client.name name (lua "return client")))))
|
(var found_client nil)
|
||||||
|
(each [_ client (ipairs buf_clients) :until found_client]
|
||||||
|
(match client.name name (set found_client client)))
|
||||||
|
found_client))
|
||||||
|
|
||||||
(fn update_config [lang configtype] (let [client (get_client_by_name "ltex")]
|
(fn update_config [lang configtype]
|
||||||
(if client
|
(let [client (get_client_by_name "ltex")]
|
||||||
(if (. client.config.settings.ltex configtype)
|
(if (and client (. client.config.settings.ltex configtype))
|
||||||
(do (tset client.config.settings.ltex configtype {lang (lines_from (. files configtype))})
|
(do (tset client.config.settings.ltex configtype {lang (lines_from (. files configtype))})
|
||||||
(client.notify "workspace/didChangeConfiguration" client.config.settings))
|
(client.notify "workspace/didChangeConfiguration" client.config.settings))
|
||||||
(vim.notify "Error when reading dictionary config, check it")))))
|
(vim.notify "Error when reading dictionary config, check it"))))
|
||||||
|
|
||||||
(fn add_to_file [configtype lang file value] (let [dict (lines_from file)]
|
(fn add_to_file [configtype lang file value]
|
||||||
(do (each [_ v (ipairs dict)]
|
(let [dict (lines_from file)]
|
||||||
(if (= v value) (lua "return nil")))
|
(var found_existing false)
|
||||||
|
(each [_ v (ipairs dict) :until found_existing]
|
||||||
|
(if (= v value) (set found_existing true)))
|
||||||
|
(if (not found_existing)
|
||||||
(let [file (io.open file "a+")]
|
(let [file (io.open file "a+")]
|
||||||
(if file
|
(if file
|
||||||
(do (file.write file (.. value "\n"))
|
(do (file:write (.. value "\n"))
|
||||||
(file.close file)
|
(file:close)
|
||||||
(update_config lang configtype))
|
(update_config lang configtype))
|
||||||
(vim.notify (string.format "Failed insert %s" value)))))))
|
(vim.notify (string.format "Failed insert %s" value)))))))
|
||||||
|
|
||||||
(fn do_command [arg configtype] (each [lang words (pairs arg)]
|
(fn do_command [arg configtype]
|
||||||
|
(each [lang words (pairs arg)]
|
||||||
(each [_ word (ipairs words)]
|
(each [_ word (ipairs words)]
|
||||||
(add_to_file configtype lang (. files configtype) word))))
|
(add_to_file configtype lang (. files configtype) word))))
|
||||||
|
|
||||||
(tset vim.lsp.commands "_ltex.addToDictionary"
|
(tset vim.lsp.commands "_ltex.addToDictionary"
|
||||||
(fn [command _] (do_command (. (. command.arguments 1) :words) "dictionary")))
|
(fn [command _] (do_command (. command.arguments 1 :words) :dictionary)))
|
||||||
(tset vim.lsp.commands "_ltex.disableRules"
|
(tset vim.lsp.commands "_ltex.disableRules"
|
||||||
(fn [command _] (do_command (. (. command.arguments 1) :ruleIds) "disabledRules")))
|
(fn [command _] (do_command (. command.arguments 1 :ruleIds) :disabledRules)))
|
||||||
(tset vim.lsp.commands "_ltex.hideFalsePositives"
|
(tset vim.lsp.commands "_ltex.hideFalsePositives"
|
||||||
(fn [command _] (do_command (. (. command.arguments 1) :falsePositives) "hiddenFalsePositives")))
|
(fn [command _] (do_command (. command.arguments 1 :falsePositives) :hiddenFalsePositives)))
|
||||||
|
|
||||||
(fn post_attach [] (do (exec [[:setlocal "spell"] [:setlocal "nospell"]])
|
(fn post_attach []
|
||||||
|
(exec [[:setlocal "spell"] [:setlocal "nospell"]])
|
||||||
(update_config "en-US" "dictionary")
|
(update_config "en-US" "dictionary")
|
||||||
(update_config "en-US" "disabledRules")
|
(update_config "en-US" "disabledRules")
|
||||||
(update_config "en-US" "hiddenFalsePositives")
|
(update_config "en-US" "hiddenFalsePositives")
|
||||||
(map! [n :buffer :verbose] :zug (fn [] (do (exec [[:normal! "zug"]])
|
(map! [n :buffer :verbose] :zug (fn [] (exec [[:normal! "zug"]])
|
||||||
(update_config "en-US" "dictionary")
|
(update_config "en-US" "dictionary")
|
||||||
nil))
|
nil)
|
||||||
"Remove word from spellfile and update ltex")
|
"Remove word from spellfile and update ltex")
|
||||||
(map! [n :buffer :verbose] :zg (fn [] (do (exec [[:normal! "zg"]])
|
(map! [n :buffer :verbose] :zg (fn [] (exec [[:normal! "zg"]])
|
||||||
(update_config "en-US" "dictionary")
|
(update_config "en-US" "dictionary")
|
||||||
nil))
|
nil)
|
||||||
"Add word to spellfile and update ltex")
|
"Add word to spellfile and update ltex")
|
||||||
nil))
|
nil)
|
||||||
|
|
||||||
(set M.setup (fn [opts]
|
(fn M.setup [opts]
|
||||||
((. (. (require "lspconfig") "ltex") :setup) {:on_attach (fn [client]
|
((. (require :lspconfig) :ltex :setup)
|
||||||
(do (opts.on_attach client) (post_attach) nil))
|
{:on_attach (fn [client] (opts.on_attach client)
|
||||||
|
(post_attach)
|
||||||
|
nil)
|
||||||
:capabilities opts.capabilities
|
:capabilities opts.capabilities
|
||||||
:flags opts.flags
|
:flags opts.flags
|
||||||
:settings {:ltex {:dictionary []
|
:settings {:ltex {:dictionary []
|
||||||
:disabledRules []
|
:disabledRules []
|
||||||
:hiddenFalsePositives []}
|
:hiddenFalsePositives []}
|
||||||
:additionalRules {:enablePickyRules true}}})))
|
:additionalRules {:enablePickyRules true}}}))
|
||||||
|
|
||||||
M
|
M
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
(import-macros {: map!} :hibiscus.vim)
|
(import-macros {: map!} :hibiscus.vim)
|
||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(local servers [:pyright :sumneko_lua :eslint :tsserver :ltex])
|
(local servers
|
||||||
|
[:eslint
|
||||||
|
:ltex
|
||||||
|
:pyright
|
||||||
|
:sumneko_lua
|
||||||
|
:tsserver])
|
||||||
|
|
||||||
; Mappings.
|
; Mappings.
|
||||||
(map! [n :noremap] "<space>e" vim.diagnostic.open_float)
|
(map! [n :noremap] "<space>e" vim.diagnostic.open_float)
|
||||||
@@ -10,7 +15,7 @@
|
|||||||
(map! [n :noremap] "<space>q" vim.diagnostic.setloclist)
|
(map! [n :noremap] "<space>q" vim.diagnostic.setloclist)
|
||||||
|
|
||||||
(fn on_attach [_ bufnr]
|
(fn on_attach [_ bufnr]
|
||||||
(do (map! [n :noremap :buffer] :gD vim.lsp.buf.declaration)
|
(map! [n :noremap :buffer] :gD vim.lsp.buf.declaration)
|
||||||
(map! [n :noremap :buffer] :gd vim.lsp.buf.definition)
|
(map! [n :noremap :buffer] :gd vim.lsp.buf.definition)
|
||||||
(map! [n :noremap :buffer] :K vim.lsp.buf.hover)
|
(map! [n :noremap :buffer] :K vim.lsp.buf.hover)
|
||||||
(map! [n :noremap :buffer] :gi vim.lsp.buf.implementation)
|
(map! [n :noremap :buffer] :gi vim.lsp.buf.implementation)
|
||||||
@@ -22,21 +27,23 @@
|
|||||||
(map! [n :noremap :buffer] :<space>rn vim.lsp.buf.rename)
|
(map! [n :noremap :buffer] :<space>rn vim.lsp.buf.rename)
|
||||||
(map! [n :noremap :buffer] :<space>ca vim.lsp.buf.code_action)
|
(map! [n :noremap :buffer] :<space>ca vim.lsp.buf.code_action)
|
||||||
(map! [n :noremap :buffer] :gr vim.lsp.buf.references)
|
(map! [n :noremap :buffer] :gr vim.lsp.buf.references)
|
||||||
(map! [n :noremap :buffer] :<space>f vim.lsp.buf.formatting)))
|
(map! [n :noremap :buffer] :<space>f vim.lsp.buf.formatting))
|
||||||
|
|
||||||
(local capabilities ((. (require :cmp_nvim_lsp) :update_capabilities) (vim.lsp.protocol.make_client_capabilities)))
|
(local capabilities ((. (require :cmp_nvim_lsp) :update_capabilities) (vim.lsp.protocol.make_client_capabilities)))
|
||||||
|
|
||||||
(setup :mason)
|
(setup :mason)
|
||||||
(setup :mason-lspconfig {:ensure_installed servers})
|
(setup :mason-lspconfig
|
||||||
|
{:ensure_installed servers})
|
||||||
|
|
||||||
(each [_ lsp (pairs servers)]
|
(each [_ lsp (pairs servers)]
|
||||||
(do (local lsp_opts {:on_attach on_attach
|
(local lsp_opts
|
||||||
|
{:on_attach on_attach
|
||||||
:capabilities capabilities
|
:capabilities capabilities
|
||||||
:flags {:debounce_text_changes 150}})
|
:flags {:debounce_text_changes 150}})
|
||||||
(local (status config) (pcall require (.. "settings.lsp." lsp)))
|
(local (status config) (pcall require (.. "settings.lsp." lsp)))
|
||||||
(if status
|
(if status
|
||||||
(config.setup lsp_opts)
|
(config.setup lsp_opts)
|
||||||
((. (. (require :lspconfig) lsp) :setup) lsp_opts))))
|
((. (require :lspconfig) lsp :setup) lsp_opts)))
|
||||||
|
|
||||||
; LuaSnip setup
|
; LuaSnip setup
|
||||||
(local luasnip (require :luasnip))
|
(local luasnip (require :luasnip))
|
||||||
@@ -45,25 +52,27 @@
|
|||||||
; nvim-cmp setup
|
; nvim-cmp setup
|
||||||
(local lspkind (require :lspkind))
|
(local lspkind (require :lspkind))
|
||||||
(local cmp (require :cmp))
|
(local cmp (require :cmp))
|
||||||
(cmp.setup {:snippet {:expand (fn [args] (luasnip.lsp_expand args.body))}
|
(cmp.setup
|
||||||
:mapping (cmp.mapping.preset.insert {:<C-d> (cmp.mapping.scroll_docs -4)
|
{:snippet {:expand (fn [args] (luasnip.lsp_expand args.body))}
|
||||||
|
:mapping (cmp.mapping.preset.insert
|
||||||
|
{:<C-d> (cmp.mapping.scroll_docs -4)
|
||||||
:<C-f> (cmp.mapping.scroll_docs 4)
|
:<C-f> (cmp.mapping.scroll_docs 4)
|
||||||
:<C-Space> (cmp.mapping.complete)
|
:<C-Space> (cmp.mapping.complete)
|
||||||
:<CR> (cmp.mapping.confirm {:behavior cmp.ConfirmBehavior.Replace
|
:<CR> (cmp.mapping.confirm {:behavior cmp.ConfirmBehavior.Replace
|
||||||
:select true})
|
:select true})
|
||||||
:<Tab> (cmp.mapping (fn [fallback]
|
:<Tab> (cmp.mapping
|
||||||
(if (cmp.visible)
|
(fn [fallback] (if (cmp.visible)
|
||||||
(cmp.select_next_item)
|
(cmp.select_next_item)
|
||||||
(if (luasnip.expand_or_jumpable)
|
(luasnip.expand_or_jumpable)
|
||||||
(luasnip.expand_or_jump)
|
(luasnip.expand_or_jump)
|
||||||
(fallback))))
|
(fallback)))
|
||||||
[:i :s])
|
[:i :s])
|
||||||
:<S-Tab> (cmp.mapping (fn [fallback]
|
:<S-Tab> (cmp.mapping
|
||||||
(if (cmp.visible)
|
(fn [fallback] (if (cmp.visible)
|
||||||
(cmp.select_prev_item)
|
(cmp.select_prev_item)
|
||||||
(if (luasnip.jumpable -1)
|
(luasnip.jumpable -1)
|
||||||
(luasnip.jump -1)
|
(luasnip.jump -1)
|
||||||
(fallback))))
|
(fallback)))
|
||||||
[:i :s])})
|
[:i :s])})
|
||||||
:sources [{:name "luasnip"}
|
:sources [{:name "luasnip"}
|
||||||
{:name "nvim_lsp"}
|
{:name "nvim_lsp"}
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
(g! :neo_tree_remove_legacy_commands 1)
|
(g! :neo_tree_remove_legacy_commands 1)
|
||||||
|
|
||||||
(setup :neo-tree {
|
(setup :neo-tree
|
||||||
:close_if_last_window true
|
{:close_if_last_window true
|
||||||
:window {:width 30
|
:window {:width 30
|
||||||
:mappings {:<cr> "open_with_window_picker"
|
:mappings {:<cr> "open_with_window_picker"
|
||||||
:S "split_with_window_picker"
|
:S "split_with_window_picker"
|
||||||
@@ -20,20 +20,20 @@
|
|||||||
:<S-Right> (fn [])
|
:<S-Right> (fn [])
|
||||||
:<S-Left> (fn [])}}
|
:<S-Left> (fn [])}}
|
||||||
:commands {:custom_open (fn [state]
|
:commands {:custom_open (fn [state]
|
||||||
(let [node (state.tree.get_node state.tree)
|
(let [node (state.tree:get_node)
|
||||||
quoted_path (.. "'" (.. (node.get_id node) "'"))]
|
quoted_path (.. "'" (.. (node:get_id) "'"))]
|
||||||
(do (exec [[:silent "!file -bL --mime" quoted_path "| grep -qv '^text\\|^inode' && xdg-open" quoted_path "&"]])
|
(exec [[:silent "!file -bL --mime" quoted_path "| grep -qv '^text\\|^inode' && xdg-open" quoted_path "&"]])
|
||||||
(if (= vim.v.shell_error 1)
|
(if (= vim.v.shell_error 1)
|
||||||
((. (require :neo-tree.sources.filesystem.commands) :open) state)))))}}
|
((. (require :neo-tree.sources.filesystem.commands) :open) state))))}}
|
||||||
:renderers {:directory [[:indent]
|
:renderers {:directory [[:indent]
|
||||||
[:icon]
|
[:icon]
|
||||||
[:current_filter]
|
[:current_filter]
|
||||||
[:name]
|
[:name]
|
||||||
[:clipboard]
|
[:clipboard]
|
||||||
{1 "diagnostics" :errors_only true}]
|
{1 :diagnostics :errors_only true}]
|
||||||
:file [[:indent]
|
:file [[:indent]
|
||||||
[:icon]
|
[:icon]
|
||||||
{1 "name" :use_git_status_colors true :zindex 10}
|
{1 :name :use_git_status_colors true :zindex 10}
|
||||||
[:clipboard]
|
[:clipboard]
|
||||||
[:bufnr]
|
[:bufnr]
|
||||||
[:modified]
|
[:modified]
|
||||||
@@ -48,4 +48,4 @@
|
|||||||
; Startup
|
; Startup
|
||||||
(if (or (= (vim.fn.expand "%") "") (not= (vim.fn.isdirectory (vim.fn.expand "%")) 0))
|
(if (or (= (vim.fn.expand "%") "") (not= (vim.fn.isdirectory (vim.fn.expand "%")) 0))
|
||||||
((. (require :neo-tree.command) :_command) (vim.fn.getcwd))
|
((. (require :neo-tree.command) :_command) (vim.fn.getcwd))
|
||||||
((. (require :neo-tree.command) :_command) "show" (vim.fn.getcwd)))
|
((. (require :neo-tree.command) :_command) :show (vim.fn.getcwd)))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(setup :null-ls {
|
(setup :null-ls
|
||||||
:sources [(. (. (. (require :null-ls) :builtins) :diagnostics) :flake8)]})
|
{:sources [(. (require :null-ls) :builtins :diagnostics :flake8)]})
|
||||||
|
|||||||
@@ -2,9 +2,18 @@
|
|||||||
|
|
||||||
(local actions (require :telescope.actions))
|
(local actions (require :telescope.actions))
|
||||||
|
|
||||||
(setup :telescope {
|
(setup :telescope
|
||||||
:defaults {:mappings {:n {:S actions.file_split
|
{:defaults {:mappings {:n {:S actions.file_split
|
||||||
:s actions.file_vsplit}}
|
:s actions.file_vsplit}}
|
||||||
:get_selection_window (. (require :window-picker) :pick_window)}
|
:get_selection_window (. (require :window-picker) :pick_window)}
|
||||||
:pickers {:find_files {:find_command [:fd "--type" "f" "--strip-cwd-prefix" "--hidden"]}
|
:pickers {:find_files {:find_command [:fd "--type" "f"
|
||||||
:live_grep {:vimgrep_arguments ["rg" "--color=never" "--no-heading" "--with-filename" "--line-number" "--column" "--smart-case" "--hidden"]}}})
|
"--strip-cwd-prefix"
|
||||||
|
"--hidden"]}
|
||||||
|
:live_grep {:vimgrep_arguments ["rg"
|
||||||
|
"--color=never"
|
||||||
|
"--no-heading"
|
||||||
|
"--with-filename"
|
||||||
|
"--line-number"
|
||||||
|
"--column"
|
||||||
|
"--smart-case"
|
||||||
|
"--hidden"]}}})
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(setup :nvim-treesitter.configs {
|
(setup :nvim-treesitter.configs
|
||||||
:ensure_installed [:c :lua :rust :java :python :javascript :typescript :fennel]
|
{:ensure_installed
|
||||||
|
[:c
|
||||||
|
:fennel
|
||||||
|
:java
|
||||||
|
:javascript
|
||||||
|
:lua
|
||||||
|
:python
|
||||||
|
:rust
|
||||||
|
:typescript]
|
||||||
:sync_install false
|
:sync_install false
|
||||||
:ignore_install []
|
:ignore_install []
|
||||||
:highlight {:enable true
|
:highlight {:enable true
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
(import-macros {: setup} :macros)
|
(import-macros {: setup} :macros)
|
||||||
|
|
||||||
(setup :window-picker {
|
(setup :window-picker
|
||||||
:autoselect_one true
|
{:autoselect_one true
|
||||||
:selection_chars "ABCDEFGHIJKLMNOP"
|
:selection_chars "ABCDEFGHIJKLMNOP"
|
||||||
:filter_rules {:bo {:filetype [:NvimTree :neo-tree :notify :aerial]
|
:filter_rules {:bo {:filetype [:NvimTree :neo-tree :notify :aerial]
|
||||||
:buftype [:terminal]}}})
|
:buftype [:terminal]}}})
|
||||||
|
|||||||
Reference in New Issue
Block a user