Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VIM 16.84 KB | None | 0 0
  1. " Vim-PLug Core {{{
  2. "*****************************************************************************
  3. let vimplug_exists=expand('~/.config/nvim/autoload/plug.vim')
  4.  
  5. if !filereadable(vimplug_exists)
  6.   if !executable("curl")
  7.     echoerr "You have to install curl or first install vim-plug yourself!"
  8.     execute "q!"
  9.   endif
  10.   echo "Installing Vim-Plug..."
  11.   echo ""
  12.   silent exec "!\curl -fLo " . vimplug_exists . " --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim"
  13.   let g:not_finish_vimplug = "yes"
  14.  
  15.   autocmd VimEnter * PlugInstall
  16. endif
  17.  
  18. " Required:
  19. call plug#begin(expand('~/.config/nvim/plugged'))
  20. " }}}
  21. " Plug install packages {{{
  22. "*****************************************************************************
  23. Plug 'scrooloose/nerdtree'
  24. Plug 'scrooloose/nerdcommenter'
  25. Plug 'tpope/vim-surround'
  26. Plug 'airblade/vim-gitgutter'
  27. Plug 'Raimondi/delimitMate'
  28. Plug 'w0rp/ale'
  29. Plug 'sheerun/vim-polyglot'
  30. Plug 'neoclide/coc.nvim', {'branch': 'release'}
  31. Plug 'ryanoasis/vim-devicons'
  32. Plug 'heavenshell/vim-jsdoc'
  33. Plug 'majutsushi/tagbar'
  34. Plug 'tpope/vim-fugitive'
  35. Plug 'mhinz/vim-startify'
  36. Plug 'wellle/targets.vim'
  37. Plug 'rhysd/git-messenger.vim'
  38. Plug 'dracula/vim',{'name':'dracula'}
  39.  
  40. if isdirectory('/usr/local/opt/fzf')
  41.   Plug '/usr/local/opt/fzf' | Plug 'junegunn/fzf.vim'
  42. else
  43.   Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' }
  44.   Plug 'junegunn/fzf.vim'
  45. endif
  46. let g:make = 'gmake'
  47. if exists('make')
  48.   let g:make = 'make'
  49. endif
  50. Plug 'Shougo/vimproc.vim', {'do': g:make}
  51.  
  52. "" Snippets
  53. Plug 'SirVer/ultisnips'
  54. Plug 'honza/vim-snippets'
  55. " }}}
  56. " Custom bundles {{{
  57. "*****************************************************************************
  58.  
  59. " html
  60. "" HTML Bundle
  61. Plug 'hail2u/vim-css3-syntax'
  62. "Plug 'gorodinskiy/vim-coloresque'
  63. Plug 'tpope/vim-haml'
  64. Plug 'mattn/emmet-vim'
  65.  
  66.  
  67. " javascript
  68. "" Javascript Bundle
  69. Plug 'jelera/vim-javascript-syntax'
  70.  
  71. "" Include user's extra bundle
  72. if filereadable(expand("~/.config/nvim/local_bundles.vim"))
  73.  source ~/.config/nvim/local_bundles.vim
  74. endif
  75.  
  76. call plug#end()
  77.  
  78. " Required:
  79. filetype plugin indent on
  80.  
  81. " }}}
  82. " Basic Setup {{{
  83. "*****************************************************************************"
  84. "" Sync and syntax refresh stuff
  85. syntax sync fromstart
  86. set redrawtime=10000
  87.  
  88. "" Encoding
  89. set encoding=utf-8
  90. set fileencoding=utf-8
  91. set fileencodings=utf-8
  92.  
  93. "" Disable soft wrapping
  94. set wrap!
  95.  
  96. "" automatically mkview and loadview on exit/open
  97. "" TODO: fix when using things like CTRL+P
  98. "" au BufWinLeave * mkview
  99. "" au BufWinEnter * silent loadview
  100.  
  101. "" Marker fold method
  102. set foldmethod=marker
  103.  
  104. "" Enable line numbers
  105. set number
  106.  
  107. "" Highlight the line on which the cursor lives
  108. set nocursorline
  109.  
  110. "" Map leader to ,
  111. let mapleader=' '
  112.  
  113. " Always show at least one line above/below the cursor.
  114. set scrolloff=2
  115. " Always show at least one line left/right of the cursor.
  116. set sidescrolloff=5
  117.  
  118. " Highlight matching pairs of brackets. Use the '%' character to jump between them.
  119. set matchpairs+=<:>
  120.  
  121. " Display different types of white spaces.
  122. set list
  123. set listchars=tab:›\ ,trail:•,extends:#,nbsp:.
  124.  
  125. " Use system clipboard
  126. set clipboard=unnamedplus
  127.  
  128. " Remove timeout for partially typed commands
  129. set notimeout
  130.  
  131. " F keys
  132. " Quick write session with F2
  133. map <F2> :mksession! ~/.vim_session<cr>
  134. " And load session with F3
  135. map <F3> :source ~/.vim_session<cr>
  136.  
  137. " Fix indentation
  138. map <F7> gg=G<C-o><C-o>
  139. " Toggle auto change directory
  140. map <F8> :set autochdir! autochdir?<CR>
  141.  
  142. " Indentation
  143. set smarttab
  144. set expandtab
  145. set tabstop=2
  146. set softtabstop=4
  147. set shiftwidth=2
  148.  
  149. "set smartindent
  150. set autoindent
  151. "set cindent
  152.  
  153. set nocompatible
  154. filetype plugin indent on
  155.  
  156. " Relative line numbers
  157. set number relativenumber
  158.  
  159. " Toggle vertical line
  160. set colorcolumn=
  161. set cc=
  162. fun! ToggleCC()
  163.  if &cc == ''
  164.    " set cc=1,4,21
  165.    set cc=80
  166.  else
  167.    set cc=
  168.  endif
  169. endfun
  170. nnoremap <silent> <F9> :call ToggleCC()<CR>
  171.  
  172. " Allow switching between buffers without saving
  173. set hidden
  174.  
  175. " Mouse support
  176. set mouse=a
  177.  
  178. "Case insensitive searching
  179. set ignorecase
  180.  
  181. "Will automatically switch to case sensitive if you use any capitals
  182. set smartcase
  183.  
  184. " Auto toggle smart case of for ex commands
  185. " Assumes 'set ignorecase smartcase'
  186. augroup dynamic_smartcase
  187.  autocmd!
  188.  autocmd CmdLineEnter : set nosmartcase
  189.  autocmd CmdLineLeave : set smartcase
  190. augroup END
  191.  
  192. " Substitute live preview
  193. set inccommand=nosplit
  194.  
  195. " Highlighted yank (-1 for persistent)
  196. let g:highlightedyank_highlight_duration = 400
  197.  
  198. " If lightline/airline is enabled, don't show mode under it
  199. set noshowmode
  200.  
  201. set fileformats=unix,dos,mac
  202.  
  203. if exists('$SHELL')
  204.   set shell=$SHELL
  205. else
  206.   set shell=/bin/sh
  207. endif
  208.  
  209. set background=dark
  210. syntax enable
  211.  
  212. " Clear search highlighting with Escape key
  213. nnoremap <silent><esc> :noh<return><esc>
  214.  
  215. " Allow color schemes to do bright colors without forcing bold.
  216. if &t_Co == 8 && $TERM !~# '^linux\|^Eterm'
  217.   set t_Co=16
  218. endif
  219.  
  220. set wildmenu
  221.  
  222. " remove trailing whitespaces
  223. command! FixWhitespace :%s/\s\+$//e
  224.  
  225. " Restore last cursor position and marks on open
  226. au BufReadPost *
  227.       \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit'
  228.       \ |   exe "normal! g`\""
  229.       \ | endif
  230.  
  231. " }}}
  232. " NERD Tree {{{
  233. "*****************************************************************************
  234.  
  235. "" NERDTree configuration
  236. let g:NERDTreeChDirMode=2
  237. let g:NERDTreeIgnore=['\.rbc$', '\~$', '\.pyc$', '\.db$', '\.sqlite$', '__pycache__']
  238. let g:NERDTreeSortOrder=['^__\.py$', '\/$', '*', '\.swp$', '\.bak$', '\~$']
  239. let g:NERDTreeShowBookmarks=1
  240. let g:nerdtree_tabs_focus_on_files=1
  241. let g:NERDTreeMapOpenInTabSilent = '<RightMouse>'
  242. let g:NERDTreeWinSize = 35
  243. let NERDTreeMinimalUI=1
  244. set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite
  245. nnoremap <silent> <C-b> :NERDTreeToggle<CR>
  246. nnoremap <silent> <leader>doc :JsDoc<CR>
  247.  
  248. "" NERDTree + Startify
  249.  "autocmd VimEnter *
  250.   "\   if !argc()
  251.   "\ |   Startify
  252.   "\ |   NERDTree
  253.   "\ |   wincmd w
  254.  " \ | endif
  255.  
  256. " grep.vim
  257. nnoremap <silent> <leader>s :Rgrep<CR>
  258. let Grep_Default_Options = '-IR'
  259. let Grep_Skip_Files = '*.log *.db'
  260. let Grep_Skip_Dirs = '.git node_modules'
  261.  
  262. " terminal emulation
  263. nnoremap <silent> <leader>sh :terminal<CR>
  264.  
  265. " }}}
  266. " Mappings {{{
  267. "*****************************************************************************
  268. "" allows navigating soft wraps with j and k but 10j still uses lines
  269. nnoremap <expr> j v:count ? 'j' : 'gj'
  270. nnoremap <expr> k v:count ? 'k' : 'gk'
  271.  
  272. "" Quick exit insert mode with jk
  273. inoremap jk <ESC>
  274.  
  275. "" Split
  276. noremap <Leader>h :<C-u>split<CR>
  277. noremap <Leader>v :<C-u>vsplit<CR>
  278. set splitbelow
  279. set splitright
  280.  
  281. " session management
  282. nnoremap <leader>so :OpenSession<Space>
  283. nnoremap <leader>ss :SaveSession<Space>
  284. nnoremap <leader>sd :DeleteSession<CR>
  285. nnoremap <leader>sc :CloseSession<CR>
  286.  
  287. "" Tabs
  288. nnoremap <C-Left>  :tabprevious<CR>
  289. nnoremap <C-Right> :tabnext<CR>
  290. nnoremap <C-t>     :e<CR>
  291.  
  292. "" Set working directory
  293. nnoremap <leader>. :lcd %:p:h<CR>
  294.  
  295. "" Opens an edit command with the path of the currently edited file filled in
  296. noremap <Leader>e :e <C-R>=expand("%:p:h") . "/" <CR>
  297.  
  298. "" Opens a tab edit command with the path of the currently edited file filled
  299. noremap <Leader>te :tabe <C-R>=expand("%:p:h") . "/" <CR>
  300.  
  301. "" Tag bar
  302. nmap <Leader># :TagbarToggle<CR>
  303.  
  304. " }}}
  305. " Plugin-specific Settings {{{
  306. "*****************************************************************************
  307. "" fzf.vim
  308. set wildmode=list:longest,list:full
  309. set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__
  310. let $FZF_DEFAULT_COMMAND =  "find * -path '*/\.*' -prune -o -path 'node_modules/**' -prune -o -path 'target/**' -prune -o -path 'dist/**' -prune -o  -type f -print -o -type l -print 2> /dev/null"
  311. let $FZF_DEFAULT_OPTS=' --color=dark --color=fg:15,bg:-1,hl:1,fg+:#ffffff,bg+:0,hl+:1 --color=info:0,prompt:0,pointer:12,marker:4,spinner:11,header:-1 --layout=reverse  --margin=1,4'
  312. let g:fzf_layout = { 'window': 'call FloatingFZF()' }
  313.  
  314. function! FloatingFZF()
  315.   let buf = nvim_create_buf(v:false, v:true)
  316.   call setbufvar(buf, '&signcolumn', 'no')
  317.  
  318.   let height = float2nr(10)
  319.   let width = float2nr(80)
  320.   let horizontal = float2nr((&columns - width) / 2)
  321.   let vertical = 1
  322.  
  323.   let opts = {
  324.         \ 'relative': 'editor',
  325.         \ 'row': vertical,
  326.         \ 'col': horizontal,
  327.         \ 'width': width,
  328.         \ 'height': height,
  329.         \ 'style': 'minimal'
  330.         \ }
  331.  
  332.   call nvim_open_win(buf, v:true, opts)
  333. endfunction
  334.  
  335. " Startify
  336. let g:startify_bookmarks=['~/.bashrc', '~/.config/nvim/init.vim', '~/.config/awesome', '~/Projects/coventry']
  337. let g:startify_lists = [
  338.           \ { 'type': 'sessions',  'header': ['   Sessions']       },
  339.           \ { 'type': 'files',     'header': ['   Recent Files']   },
  340.           \ { 'type': 'dir',       'header': ['   Recent Files in: '. getcwd()] },
  341.           \ { 'type': 'bookmarks', 'header': ['   Bookmarks']      },
  342.           \ { 'type': 'commands',  'header': ['   Commands']       },
  343.           \ ]
  344.  
  345. let g:startify_custom_header = systemlist('motivate --no-colors')
  346.  
  347. " The Silver Searcher
  348. if executable('ag')
  349.   let $FZF_DEFAULT_COMMAND = 'ag --hidden --ignore .git -g ""'
  350.   set grepprg=ag\ --nogroup\ --nocolor
  351. endif
  352.  
  353. " ripgrep
  354. if executable('rg')
  355.   let $FZF_DEFAULT_COMMAND = 'rg --files --hidden --follow --glob "!.git/*"'
  356.   set grepprg=rg\ --vimgrep
  357.   command! -bang -nargs=* Find call fzf#vim#grep('rg --column --line-number --no-heading --fixed-strings --ignore-case --hidden --follow --glob "!.git/*" --color "always" '.shellescape(<q-args>).'| tr -d "\017"', 1, <bang>0)
  358. endif
  359.  
  360. cnoremap <C-P> <C-R>=expand("%:p:h") . "/" <CR>
  361. nnoremap <silent> <leader>b :Buffers<CR>
  362. nnoremap <silent> <C-o> :Buffers<CR>
  363. nnoremap <silent> <C-f> :BLines<CR>
  364. nnoremap <silent> <leader>f :Lines<CR>
  365. nnoremap <silent> <leader>t :BTags<CR>
  366. nnoremap <silent> <C-p> :call fzf#vim#files('.', {'options': '--prompt ""'})<CR>
  367. "Recovery commands from history through FZF
  368. nmap <leader>y :History:<CR>
  369.  
  370. " snippets
  371. let g:UltiSnipsExpandTrigger="<tab>"
  372. let g:UltiSnipsJumpForwardTrigger="<tab>"
  373. let g:UltiSnipsJumpBackwardTrigger="<c-b>"
  374. let g:UltiSnipsEditSplit="vertical"
  375.  
  376. " ale
  377. let g:ale_sign_highlight_linenrs = 1
  378. let g:ale_linters = {}
  379. let g:ale_sign_error = ""
  380. let g:ale_sign_warning = ""
  381. let g:airline#extensions#ale#enabled = 1
  382. let g:formatdef_eslint = '"eslint-formatter"'
  383. let g:formatters_javascript = ['prettier', 'eslint']
  384. let g:ale_fix_on_save = 1
  385. let g:ale_fixers = {'javascript': ['eslint'], 'json': ['jq'], 'html': ['prettier'] }
  386. let g:ale_set_highlights = 0
  387. let g:ale_lint_on_text_changed = 'always'
  388. let g:ale_sign_column_always = 1
  389. let g:ale_echo_cursor = 1
  390. nmap <F5> <Plug>(ale_fix)
  391.  
  392. " vim workspace
  393. let g:workspace_session_directory = $HOME . '/.vim/sessions/'
  394.  
  395. " vim-devicons
  396. let g:webdevicons_enable = 1
  397. let g:webdevicons_enable_nerdtree = 1
  398. let g:webdevicons_enable_airline_statusline = 1
  399. let g:webdevicons_enable_airline_tabline = 1
  400. let g:WebDevIconsNerdTreeGitPluginForceVAlign = 1
  401.  
  402. " Disable visualbell
  403. set noerrorbells visualbell t_vb=
  404. if has('autocmd')
  405.   autocmd GUIEnter * set visualbell t_vb=
  406. endif
  407.  
  408. "" Copy/Paste/Cut
  409. if has('unnamedplus')
  410.   set clipboard=unnamed,unnamedplus
  411. endif
  412.  
  413. noremap YY "+y<CR>
  414. noremap <leader>p "+gP<CR>
  415. noremap XX "+x<CR>
  416.  
  417. if has('macunix')
  418.   " pbcopy for OSX copy/paste
  419.   vmap <C-x> :!pbcopy<CR>
  420.   vmap <C-c> :w !pbcopy<CR><CR>
  421. endif
  422.  
  423. "" Buffer nav
  424. noremap <leader>z :bp<CR>
  425. noremap <leader>q :bp<CR>
  426. noremap <leader>x :bn<CR>
  427. noremap <leader>w :bn<CR>
  428.  
  429. "" Close buffer
  430. noremap <leader>c :bd<CR>
  431.  
  432. "" Clean search (highlight)
  433. nnoremap <silent> <leader><space> :noh<cr>
  434.  
  435. "" Switching windows
  436. noremap <C-j> <C-w>j
  437. noremap <C-k> <C-w>k
  438. noremap <C-l> <C-w>l
  439. noremap <C-h> <C-w>h
  440.  
  441. "" Vmap for maintain Visual Mode after shifting > and <
  442. vmap < <gv
  443. vmap > >gv
  444.  
  445. "" Move visual block
  446. vnoremap J :m '>+1<CR>gv=gv
  447. vnoremap K :m '<-2<CR>gv=gv
  448.  
  449. " }}}
  450. " Coc-specific Settings {{{
  451. "*****************************************************************************
  452.  
  453. let g:airline#extensions#coc#enabled = 1
  454.  
  455. " if hidden is not set, TextEdit might fail.
  456. set hidden
  457.  
  458. " Some servers have issues with backup files, see #649
  459. set nobackup
  460. set nowritebackup
  461.  
  462. " Better display for messages
  463. set cmdheight=1
  464.  
  465. " You will have bad experience for diagnostic messages when it's default 4000.
  466. set updatetime=300
  467.  
  468. " don't give |ins-completion-menu| messages.
  469. set shortmess+=c
  470.  
  471. " always show signcolumns
  472. set signcolumn=yes
  473.  
  474. " Use tab for trigger completion with characters ahead and navigate.
  475. " Use command ':verbose imap <tab>' to make sure tab is not mapped by other plugin.
  476. inoremap <silent><expr> <TAB>
  477.       \ pumvisible() ? "\<C-n>" :
  478.       \ <SID>check_back_space() ? "\<TAB>" :
  479.       \ coc#refresh()
  480. inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
  481.  
  482. function! s:check_back_space() abort
  483.   let col = col('.') - 1
  484.   return !col || getline('.')[col - 1]  =~# '\s'
  485. endfunction
  486.  
  487. " Use <c-space> to trigger completion.
  488. inoremap <silent><expr> <c-space> coc#refresh()
  489.  
  490. " Use <cr> to confirm completion, `<C-g>u` means break undo chain at current position.
  491. " Coc only does snippet and additional edit on confirm.
  492. inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
  493.  
  494. " Use `[c` and `]c` to navigate diagnostics
  495. nmap <silent> [c <Plug>(coc-diagnostic-prev)
  496. nmap <silent> ]c <Plug>(coc-diagnostic-next)
  497.  
  498. " Remap keys for gotos
  499. nmap <silent> gd <Plug>(coc-definition)
  500. nmap <silent> gy <Plug>(coc-type-definition)
  501. nmap <silent> gi <Plug>(coc-implementation)
  502. nmap <silent> gr <Plug>(coc-references)
  503.  
  504. " Use K to show documentation in preview window
  505. nnoremap <silent> K :call <SID>show_documentation()<CR>
  506.  
  507. function! s:show_documentation()
  508.   if (index(['vim','help'], &filetype) >= 0)
  509.     execute 'h '.expand('<cword>')
  510.   else
  511.     call CocAction('doHover')
  512.   endif
  513. endfunction
  514.  
  515. " Highlight symbol under cursor on CursorHold
  516. " autocmd CursorHold * silent call CocActionAsync('highlight')
  517.  
  518. " Remap for rename current word
  519. nmap <leader>rn <Plug>(coc-rename)
  520.  
  521. " Remap for format selected region
  522. xmap <leader>format  <Plug>(coc-format-selected)
  523. nmap <leader>format  <Plug>(coc-format-selected)
  524.  
  525. augroup mygroup
  526.   autocmd!
  527.   " Setup formatexpr specified filetype(s).
  528.   autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  529.   " Update signature help on jump placeholder
  530.   autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
  531. augroup end
  532.  
  533. " Remap for do codeAction of selected region, ex: `<leader>aap` for current paragraph
  534. xmap <leader>a  <Plug>(coc-codeaction-selected)
  535. nmap <leader>a  <Plug>(coc-codeaction-selected)
  536.  
  537. " Remap for do codeAction of current line
  538. nmap <leader>ac  <Plug>(coc-codeaction)
  539. " Fix autofix problem of current line
  540. nmap <leader>qf  <Plug>(coc-fix-current)
  541.  
  542. " Use `:Format` to format current buffer
  543. command! -nargs=0 Format :call CocAction('format')
  544.  
  545. " Use `:Fold` to fold current buffer
  546. command! -nargs=? Fold :call     CocAction('fold', <f-args>)
  547.  
  548. " use `:OR` for organize import of current buffer
  549. command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')
  550.  
  551. " Add status line support, for integration with other plugin, checkout `:h coc-status`
  552. set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
  553.  
  554. " Using CocList
  555. " Show all diagnostics
  556. "nnoremap <silent> <space>a  :<C-u>CocList diagnostics<cr>
  557. " Manage extensions
  558. "nnoremap <silent> <space>e  :<C-u>CocList extensions<cr>
  559. " Show commands
  560. "nnoremap <silent> <space>c  :<C-u>CocList commands<cr>
  561. " Find symbol of current document
  562. "nnoremap <silent> <space>o  :<C-u>CocList outline<cr>
  563. " Search workspace symbols
  564. "nnoremap <silent> <space>s  :<C-u>CocList -I symbols<cr>
  565. " Do default action for next item.
  566. "nnoremap <silent> <space>j  :<C-u>CocNext<CR>
  567. " Do default action for previous item.
  568. "nnoremap <silent> <space>k  :<C-u>CocPrev<CR>
  569. " Resume latest coc list
  570. "nnoremap <silent> <space>p  :<C-u>CocListResume<CR>
  571.  
  572. " }}}
  573. " Theme {{{
  574. "*****************************************************************************
  575. " Colorscheme
  576. "if empty($DISPLAY)
  577.   "colorscheme lena
  578.   "else
  579.   "colorscheme onehalfdark
  580. "endif
  581. colorscheme ephemanord
  582. "colorscheme dracula
  583. set fillchars=vert::
  584.  
  585. source $HOME/.config/nvim/statusline.vim
  586.  
  587. " }}}
  588. " AutoCMDs {{{
  589. "*****************************************************************************
  590. command! -complete=customlist,s:project_complete -nargs=1 Project cd <args>
  591.  
  592. function! s:project_complete(lead, cmdline, _) abort
  593.   let results = keys(get(g:, 'PROJECTS', {}))
  594.  
  595.   " use projectionist if available
  596.   if exists('*projectionist#completion_filter')
  597.     return projectionist#completion_filter(results, a:lead, '/')
  598.   endif
  599.  
  600.   " fallback to cheap fuzzy matching
  601.   let regex = substitute(a:lead, '.', '[&].*', 'g')
  602.   return filter(results, 'v:val =~ regex')
  603. endfunction
  604.  
  605. " }}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement