This commit is contained in:
@@ -1,269 +1,253 @@
|
||||
" dotfile location
|
||||
let g:dotfiledir = expand(fnamemodify(resolve(expand('<sfile>:p')), ':h').'/')
|
||||
" vim runtime folder
|
||||
let g:vim_dir = expand('~/.vim/')
|
||||
" Vim 9 configuration shared across Linux, WSL, Windows, and macOS.
|
||||
if v:version < 900
|
||||
echoerr 'This configuration requires Vim 9 or newer.'
|
||||
finish
|
||||
endif
|
||||
|
||||
" detect vim type(vim or nvim)
|
||||
let g:vim_v = 0
|
||||
if has('nvim')
|
||||
let g:vim_type = 'nvim'
|
||||
else
|
||||
let g:vim_type = 'vim'
|
||||
let g:vim_v = v:version
|
||||
endif
|
||||
let g:dotfiledir = fnamemodify(resolve(expand('<sfile>:p')), ':h') . '/'
|
||||
let g:dotvimdir = g:dotfiledir . 'config/vim'
|
||||
let g:vim_dir = has('win32') || has('win64') ? expand('~/vimfiles') : expand('~/.vim')
|
||||
execute 'set runtimepath^=' . fnameescape(g:dotvimdir)
|
||||
|
||||
" detect operating system (Windows/Linux/Darwin)
|
||||
let g:isWSL = 0
|
||||
if has("win64") || has("win32") || has("win16")
|
||||
let g:os = "Windows"
|
||||
set updatetime=50
|
||||
if executable('pwsh')
|
||||
" prefer to use powershell 7
|
||||
set shell=pwsh
|
||||
else
|
||||
set shell=powershell
|
||||
endif
|
||||
else
|
||||
let g:os = substitute(system('uname'), '\n', '', '')
|
||||
if system('uname -r') =~ "icrosoft"
|
||||
let g:isWSL = 1
|
||||
endif
|
||||
endif
|
||||
let g:os = has('win32') || has('win64') ? 'Windows'
|
||||
\ : has('macunix') ? 'Darwin'
|
||||
\ : substitute(system('uname'), '\n', '', '')
|
||||
|
||||
if g:os ==# 'Windows'
|
||||
if executable('pwsh')
|
||||
set shell=pwsh
|
||||
elseif executable('powershell')
|
||||
set shell=powershell
|
||||
endif
|
||||
endif
|
||||
|
||||
set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||
let &packpath=&runtimepath
|
||||
let mapleader = ','
|
||||
let maplocalleader = '_'
|
||||
|
||||
" The default leader is '\', but many people prefer ',' as it's in a standard
|
||||
let mapleader = ','
|
||||
let maplocalleader = '_'
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
set encoding=utf-8
|
||||
set belloff=all
|
||||
set mouse=a
|
||||
set hidden
|
||||
set history=1000
|
||||
set updatetime=300
|
||||
set shortmess+=filmnrxoOtTF
|
||||
set backspace=indent,eol,start
|
||||
set number
|
||||
set cursorline
|
||||
set cursorlineopt=number
|
||||
set noshowmode
|
||||
set showmatch
|
||||
set incsearch
|
||||
set hlsearch
|
||||
set ignorecase
|
||||
set smartcase
|
||||
set wildmenu
|
||||
set wildmode=list:longest,full
|
||||
set scrolloff=5
|
||||
set sidescrolloff=5
|
||||
set splitright
|
||||
set splitbelow
|
||||
set display=lastline
|
||||
set expandtab
|
||||
set shiftwidth=4
|
||||
set tabstop=4
|
||||
set softtabstop=4
|
||||
set autoindent
|
||||
set nojoinspaces
|
||||
set nospell
|
||||
set list
|
||||
set listchars=tab:•\ ,trail:•,extends:»,precedes:«
|
||||
let &fillchars = 'eob: ,vert:│,stl: ,stlnc: '
|
||||
set foldmethod=syntax
|
||||
set foldlevelstart=99
|
||||
set undofile
|
||||
set undolevels=1000
|
||||
set undoreload=10000
|
||||
set viewoptions=folds
|
||||
if has('termguicolors')
|
||||
set termguicolors
|
||||
endif
|
||||
|
||||
" General {
|
||||
for s:dir in ['backup', 'swap', 'undo', 'view']
|
||||
let s:path = g:vim_dir . '/' . s:dir
|
||||
if !isdirectory(s:path)
|
||||
silent! call mkdir(s:path, 'p')
|
||||
endif
|
||||
endfor
|
||||
execute 'set backupdir=' . fnameescape(g:vim_dir . '/backup//')
|
||||
execute 'set directory=' . fnameescape(g:vim_dir . '/swap//')
|
||||
execute 'set undodir=' . fnameescape(g:vim_dir . '/undo//')
|
||||
execute 'set viewdir=' . fnameescape(g:vim_dir . '/view//')
|
||||
|
||||
filetype plugin indent on " Automatically detect file types.
|
||||
syntax on " Syntax highlighting
|
||||
set belloff=all " Turn off the annoying bell
|
||||
set mouse=a " Automatically enable mouse usage
|
||||
set mousehide " Hide the mouse cursor while typing
|
||||
set shortmess+=F " Don't show the file name when open new file
|
||||
" scriptencoding utf-8
|
||||
if has('clipboard')
|
||||
if g:os ==# 'Darwin' || g:os ==# 'Windows'
|
||||
set clipboard=unnamed
|
||||
else
|
||||
set clipboard=unnamedplus
|
||||
endif
|
||||
endif
|
||||
|
||||
set shortmess+=filmnrxoOtT " Abbrev. of messages (avoids 'hit enter')
|
||||
" set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility
|
||||
" set virtualedit=onemore " Allow for cursor beyond last character
|
||||
set history=1000 " Store a ton of history (default is 20)
|
||||
set hidden " Allow buffer switching without saving
|
||||
set iskeyword-=. " '.' is an end of word designator
|
||||
set iskeyword-=# " '#' is an end of word designator
|
||||
set iskeyword+=-
|
||||
augroup DotfilesCore
|
||||
autocmd!
|
||||
autocmd FileType javascript,typescript,lua setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
autocmd FileType haskell,ruby,yaml setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
autocmd FileType c,cpp,vim,java,python,lua setlocal colorcolumn=80
|
||||
autocmd FileType help setlocal colorcolumn=
|
||||
autocmd FileType * setlocal formatoptions-=o
|
||||
autocmd BufNewFile,BufRead *.html.twig setfiletype html.twig
|
||||
autocmd BufNewFile,BufRead *.ts setfiletype typescript
|
||||
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line('$') | execute 'normal! g`"' | endif
|
||||
autocmd BufWinLeave ?* if &buftype ==# '' && !empty(expand('%:p')) | silent! mkview | endif
|
||||
autocmd BufWinEnter ?* if &buftype ==# '' && !empty(expand('%:p')) | silent! loadview | endif
|
||||
augroup END
|
||||
|
||||
augroup FileFormat
|
||||
autocmd!
|
||||
autocmd FileType javascript,typescript,lua setlocal tabstop=2 shiftwidth=2 softtabstop=2
|
||||
" autocmd FileType c,cpp,python,java setlocal tabstop=4 shiftwidth=4 softtabstop=4
|
||||
autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig
|
||||
autocmd FileType haskell,puppet,ruby,yml setlocal expandtab shiftwidth=2 softtabstop=2
|
||||
" Instead of reverting the cursor to the last position in the buffer, we
|
||||
" set it to the first line when editing a git commit message
|
||||
autocmd FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])
|
||||
augroup END
|
||||
nnoremap j gj
|
||||
nnoremap k gk
|
||||
nnoremap Y y$
|
||||
xnoremap < <gv
|
||||
xnoremap > >gv
|
||||
nnoremap <silent> <leader>h :nohlsearch<CR>
|
||||
nnoremap <leader>ws :%s/\s\+$//e<CR>
|
||||
nnoremap <Leader>s :%s/\<<C-r><C-w>\>/<C-r><C-w>
|
||||
nnoremap <silent> <space>q :bprevious<CR>
|
||||
nnoremap <silent> <space>e :bnext<CR>
|
||||
nnoremap <silent> <C-w>% :vsplit<CR>
|
||||
nnoremap <silent> <C-w>" :split<CR>
|
||||
nnoremap q: <nop>
|
||||
nnoremap Q <nop>
|
||||
command! WQ wq
|
||||
command! Wq wq
|
||||
command! W write
|
||||
command! Q quit
|
||||
|
||||
" Setting up the directories {
|
||||
" set backup " Backups are nice ...
|
||||
if has('persistent_undo')
|
||||
set undofile " So is persistent undo ...
|
||||
set undolevels=1000 " Maximum number of changes that can be undone
|
||||
set undoreload=10000 " Maximum number lines to save for undo on a buffer reload
|
||||
endif
|
||||
" }
|
||||
" Plugin installation is explicit: run install.sh or :PlugInstall/:PlugUpdate.
|
||||
let s:plug_vim = g:vim_dir . '/autoload/plug.vim'
|
||||
if filereadable(s:plug_vim)
|
||||
execute 'source ' . fnameescape(s:plug_vim)
|
||||
call plug#begin(g:vim_dir . '/plugged')
|
||||
Plug 'vim-fuzzbox/fuzzbox.vim'
|
||||
Plug 'preservim/nerdtree', { 'on': ['NERDTreeToggle', 'NERDTreeFind'] }
|
||||
Plug 'ryanoasis/vim-devicons'
|
||||
|
||||
" }
|
||||
Plug 'tpope/vim-repeat'
|
||||
Plug 'tpope/vim-surround'
|
||||
Plug 'tpope/vim-commentary'
|
||||
|
||||
" Vim UI {
|
||||
"
|
||||
set noshowmode
|
||||
set cursorline " Highlight current line
|
||||
set cursorlineopt=number " only highlight line number
|
||||
set cmdheight=1 " get rid of the extra useless line at the bottom(if not working, probably a plugin is changing the value)
|
||||
Plug 'tpope/vim-fugitive'
|
||||
Plug 'airblade/vim-gitgutter'
|
||||
|
||||
set backspace=indent,eol,start " Backspace for dummies
|
||||
set fillchars=eob:\ ,vert:│,stl:\ ,stlnc:\ , " it can remove '~' at the end of buffer, and window split line
|
||||
set number " Line numbers on
|
||||
set showmatch " Show matching brackets/parenthesis
|
||||
set incsearch " Find as you type search
|
||||
set hlsearch " Highlight search terms
|
||||
set winminheight=0 " Windows can be 0 line high
|
||||
set ignorecase " Case insensitive search
|
||||
set smartcase " Case sensitive when uc present
|
||||
set wildmenu " Show list instead of just completing
|
||||
set wildmode=list:longest,full " Command <Tab> completion, list matches, then longest common part, then all.
|
||||
set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too
|
||||
set scrolljump=1 " Lines to scroll when cursor leaves screen
|
||||
set scrolloff=5 " Minimum lines to keep above and below cursor
|
||||
set sidescrolloff=5 " Minimum lines to keep at the left or right of the cursor
|
||||
set display=lastline " don't replace whole long line with @@@
|
||||
augroup cc
|
||||
au!
|
||||
autocmd FileType c,cpp,vim,java,python,lua set colorcolumn=80
|
||||
autocmd FileType help set colorcolumn=
|
||||
augroup END
|
||||
Plug 'mhinz/vim-startify'
|
||||
Plug 'Donaldttt/vim-bufferline'
|
||||
Plug 'Donaldttt/vim-global-statusline', { 'branch': 'vim9' }
|
||||
Plug 'christoomey/vim-tmux-navigator'
|
||||
|
||||
" }
|
||||
Plug 'sainnhe/everforest'
|
||||
Plug 'bluz71/vim-moonfly-colors', { 'as': 'moonfly' }
|
||||
Plug 'NLKNguyen/papercolor-theme'
|
||||
call plug#end()
|
||||
else
|
||||
echohl WarningMsg
|
||||
echom 'vim-plug is not installed; run install.sh to install plugins.'
|
||||
echohl None
|
||||
endif
|
||||
|
||||
" Formatting {
|
||||
set autoindent " Indent at the same level of the previous line
|
||||
set expandtab " Tabs are spaces, not tabs
|
||||
set shiftwidth=4 " Use indents of 4 spaces
|
||||
set tabstop=4 " An indentation every four columns
|
||||
set softtabstop=4 " Let backspace delete indent
|
||||
" Fuzzbox replaces the former Fuzzyy plugin and keeps its familiar mappings.
|
||||
let g:fuzzbox_dropdown = 1
|
||||
let g:fuzzbox_window_defaults = {'maxwidth': 0.8, 'maxheight': 0.8}
|
||||
let g:fuzzbox_window_options = {
|
||||
\ 'files': {'width': 0.8},
|
||||
\ 'buffers': {'preview': 1, 'width': 0.8, 'preview_ratio': 0.5},
|
||||
\ 'grep': {'preview': 1, 'width': 0.8, 'preview_ratio': 0.5},
|
||||
\ 'mru': {'preview': 1}}
|
||||
nnoremap <silent> <leader>fl :FuzzyCmdHistory<CR>
|
||||
|
||||
set conceallevel=0
|
||||
set nojoinspaces " Prevents inserting two spaces after punctuation on a join (J)
|
||||
set splitright " Puts new vsplit windows to the right of the current
|
||||
set splitbelow " Puts new split windows to the bottom of the current
|
||||
" set nolist " let vim not showing '$' or other sign
|
||||
set list " Display unprintable characters f12 - switches
|
||||
" NERDTree remains intentionally small; Fuzzbox handles most navigation.
|
||||
let g:NERDShutUp = 1
|
||||
let g:NERDTreeMinimalMenu = 1
|
||||
let g:NERDTreeMinimalUI = 1
|
||||
let g:NERDTreeChDirMode = 0
|
||||
let g:NERDTreeQuitOnOpen = 1
|
||||
let g:NERDTreeMouseMode = 2
|
||||
let g:NERDTreeShowHidden = 1
|
||||
let g:NERDTreeMapOpenExpl = ''
|
||||
let g:NERDTreeDirArrowCollapsible = ''
|
||||
let g:NERDTreeDirArrowExpandable = ''
|
||||
|
||||
" stop inserting the current comment leader after hitting 'o' or 'O' in Normal mode
|
||||
au FileType * setlocal formatoptions-=o
|
||||
function! s:ToggleTree() abort
|
||||
if exists('t:NERDTreeBufName') && bufwinnr(t:NERDTreeBufName) != -1
|
||||
NERDTreeClose
|
||||
elseif &filetype ==# 'startify' || empty(expand('%:p'))
|
||||
NERDTreeToggle
|
||||
else
|
||||
NERDTreeFind
|
||||
endif
|
||||
endfunction
|
||||
nnoremap <silent> <leader>e :call <SID>ToggleTree()<CR>
|
||||
|
||||
set listchars=tab:•\ ,trail:•,extends:»,precedes:« " Unprintable chars mapping
|
||||
let g:gitgutter_map_keys = 0
|
||||
nnoremap <silent> <leader>gt :GitGutterBufferToggle<CR>
|
||||
|
||||
set nospell " Spell checking off
|
||||
set matchpairs+=<:> " Match, to be used with %
|
||||
let g:tmux_navigator_no_mappings = 1
|
||||
nnoremap <silent> <C-h> :TmuxNavigateLeft<CR>
|
||||
nnoremap <silent> <C-j> :TmuxNavigateDown<CR>
|
||||
nnoremap <silent> <C-k> :TmuxNavigateUp<CR>
|
||||
nnoremap <silent> <C-l> :TmuxNavigateRight<CR>
|
||||
|
||||
" }
|
||||
let g:bufferline_echo = 0
|
||||
let g:bufferline_modified = '+'
|
||||
let g:bufferline_active_buffer_left = '['
|
||||
let g:bufferline_active_buffer_right = ']'
|
||||
|
||||
" Key (re)Mappings {
|
||||
let g:startify_change_to_dir = 0
|
||||
let g:startify_files_number = 8
|
||||
let g:startify_bookmarks = [g:dotfiledir . '.vimrc']
|
||||
let g:startify_lists = [
|
||||
\ {'header': [' RECENT'], 'type': 'files'},
|
||||
\ {'header': [' BOOKMARKS'], 'type': 'bookmarks'}]
|
||||
|
||||
" Wrapped lines goes down/up to next row, rather than next line in file.
|
||||
noremap j gj
|
||||
noremap k gk
|
||||
function! s:StatuslineHighlights() abort
|
||||
highlight default DotModeNormal cterm=reverse gui=reverse
|
||||
highlight default link DotModeInsert DiffAdd
|
||||
highlight default link DotModeVisual Visual
|
||||
highlight default link DotModeCommand DiffChange
|
||||
endfunction
|
||||
|
||||
" Yank from the cursor to the end of the line, to be consistent with C and D.
|
||||
nnoremap Y y$
|
||||
function! s:StatuslineUpdate() abort
|
||||
if !exists('g:StlSetPart') || !exists('g:StlRefresh')
|
||||
return
|
||||
endif
|
||||
let l:modes = {
|
||||
\ 'n': [' NORMAL ', 'DotModeNormal'],
|
||||
\ 'i': [' INSERT ', 'DotModeInsert'],
|
||||
\ 'v': [' VISUAL ', 'DotModeVisual'],
|
||||
\ 'V': [' V-LINE ', 'DotModeVisual'],
|
||||
\ nr2char(22): [' V-BLOCK ', 'DotModeVisual'],
|
||||
\ 'c': [' COMMAND ', 'DotModeCommand']}
|
||||
let l:current = get(l:modes, mode(), [' ' . &filetype . ' ', 'StatusLine'])
|
||||
call g:StlSetPart(0, l:current[0], l:current[1], 'mode')
|
||||
let l:name = empty(expand('%:t')) ? '[No Name]' : expand('%:t')
|
||||
call g:StlSetPart(10, ' ' . l:name . (&modified ? ' [+]' : ''), '', 'filename')
|
||||
try
|
||||
call g:StlSetPart(30, ' ' . bufferline#get_echo_string(), '', 'buffers')
|
||||
catch
|
||||
endtry
|
||||
call g:StlSetPart(max([0, &columns - 14]), printf(' %d:%d ', line('.'), virtcol('.')), '', 'position')
|
||||
call g:StlRefresh()
|
||||
endfunction
|
||||
|
||||
set foldmethod=syntax
|
||||
augroup vimfold
|
||||
autocmd!
|
||||
if has('nvim')
|
||||
" check tree-sitter config
|
||||
else
|
||||
autocmd FileType python set foldmethod=indent
|
||||
autocmd FileType vim set foldmethod=syntax
|
||||
endif
|
||||
augroup END
|
||||
augroup DotfilesUi
|
||||
autocmd!
|
||||
autocmd VimEnter * call theme#Init() | call <SID>StatuslineHighlights() | call <SID>StatuslineUpdate()
|
||||
autocmd ModeChanged,BufEnter,BufDelete,BufWritePost * call <SID>StatuslineUpdate()
|
||||
autocmd CursorHold * call <SID>StatuslineUpdate()
|
||||
autocmd ColorScheme * call <SID>StatuslineHighlights()
|
||||
augroup END
|
||||
|
||||
" so when a buffer open it wouldn't be fold by default
|
||||
" set nofoldenable
|
||||
set foldlevelstart=99
|
||||
nnoremap <silent> <leader>cbg :call theme#toggleBg()<CR>
|
||||
nnoremap <silent> <leader>ctb :call theme#toggleTransparent()<CR>
|
||||
|
||||
" Visual shifting (does not exit Visual mode)
|
||||
vnoremap < <gv
|
||||
vnoremap > >gv
|
||||
|
||||
" Allow using the repeat operator with a visual selection (!)
|
||||
" http://stackoverflow.com/a/8064607/127816
|
||||
vnoremap . :normal .<CR>
|
||||
|
||||
" For when you forget to sudo.. Really Write the file.
|
||||
" cmap w!! w !sudo tee % >/dev/null
|
||||
|
||||
" Adjust viewports to the same size
|
||||
map <Leader>= <C-w>=
|
||||
|
||||
" Map <Leader>ff to display all lines with keyword under cursor
|
||||
" and ask which one to jump to
|
||||
nmap <Leader>j [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[\t"<CR>
|
||||
|
||||
" Easier horizontal scrolling
|
||||
map zl zL
|
||||
map zh zH
|
||||
|
||||
" Functions {
|
||||
|
||||
" Initialize directories for undo, swap, viewdir (see :h undodir, etc.)
|
||||
" to ~/.vim/.vim*
|
||||
function! InitializeDirectories()
|
||||
let common_dir = g:vim_dir
|
||||
let dir_list = {
|
||||
\ 'backupdir' : '.vimbackup',
|
||||
\ 'viewdir' : '.vimviews',
|
||||
\ 'directory' : '.vimswap' }
|
||||
|
||||
if has('persistent_undo')
|
||||
let dir_list['undodir'] = '.vimundo'
|
||||
endif
|
||||
|
||||
for [settingname, dirname] in items(dir_list)
|
||||
let directory = common_dir . dirname . '/'
|
||||
if exists("*mkdir")
|
||||
if !isdirectory(directory)
|
||||
call mkdir(directory)
|
||||
endif
|
||||
endif
|
||||
if !isdirectory(directory)
|
||||
echo "Warning: Unable to create backup directory: " . directory
|
||||
echo "Try: mkdir -p " . directory
|
||||
else
|
||||
let directory = substitute(directory, " ", "\\\\ ", "g")
|
||||
exec "set " . settingname . "=" . directory
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
call InitializeDirectories()
|
||||
|
||||
" Visual mode pressing * or # searches for the current selection
|
||||
" Super useful! From an idea by Michael Naumann
|
||||
vnoremap <silent> * :<C-u>call VisualSelection('', '')<CR>/<C-R>=@/<CR><CR>
|
||||
vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR>
|
||||
|
||||
" Fix file type error for typescript
|
||||
autocmd BufNewFile,BufRead *.ts set filetype=typescript
|
||||
|
||||
" copy to system
|
||||
if g:os == 'Darwin' || g:os == 'Windows'
|
||||
set clipboard=unnamed
|
||||
else
|
||||
if g:isWSL && has('nvim')
|
||||
" :h clipboard-wsl
|
||||
set clipboard=unnamedplus
|
||||
|
||||
" cache has to be enabled otherwise cause freeze
|
||||
" obviously wsl without xclip won't work
|
||||
let g:clipboard = {
|
||||
\ 'name': 'WSLxclip',
|
||||
\ 'copy': {
|
||||
\ '+': 'xclip -quiet -i -selection clipboard',
|
||||
\ '*': 'xclip -quiet -i -selection primary',
|
||||
\ },
|
||||
\ 'paste': {
|
||||
\ '+': 'xclip -o -selection clipboard',
|
||||
\ '*': 'xclip -o -selection primary',
|
||||
\ },
|
||||
\ 'cache_enabled': 1,
|
||||
\ }
|
||||
elseif g:isWSL
|
||||
set clipboard=unnamedplus
|
||||
else
|
||||
set clipboard=unnamedplus
|
||||
endif
|
||||
endif
|
||||
|
||||
" fix paste mess up when using tmux
|
||||
if &term =~ "screen"
|
||||
let &t_BE = "\e[?2004h"
|
||||
let &t_BD = "\e[?2004l"
|
||||
exec "set t_PS=\e[200~"
|
||||
exec "set t_PE=\e[201~"
|
||||
endif
|
||||
|
||||
" disable netrw as i am using nerdtree and nvim-tree
|
||||
let g:loaded_netrw = 1
|
||||
let g:loaded_netrwPlugin = 1
|
||||
|
||||
" Use bundles config {
|
||||
if filereadable(g:dotfiledir."/main.vim")
|
||||
execute('source '.g:dotfiledir.'/main.vim')
|
||||
endif
|
||||
" }
|
||||
if has('gui_running')
|
||||
set guifont=Hack\ Nerd\ Font:h13
|
||||
endif
|
||||
|
||||
Reference in New Issue
Block a user