Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 102 additions & 55 deletions vim/init.vim
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ call plug#begin('~/.config/nvim/plugged')
Plug 'lambdalisue/suda.vim'
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'zackhsi/fzf-tags'
Plug 'mileszs/ack.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'dense-analysis/ale'
Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
Plug 'tpope/vim-fugitive'
Plug 'junegunn/gv.vim'
Expand All @@ -29,15 +26,22 @@ Plug 'ludovicchabant/vim-gutentags'
" For Rails
Plug 'vim-ruby/vim-ruby'
Plug 'tpope/vim-rails'
Plug 'neoclide/coc-solargraph', {'do': 'yarn install --frozen-lockfile'}
Plug 'nelstrom/vim-textobj-rubyblock'
Plug 'tpope/vim-endwise'
" For Python
Plug 'neoclide/coc-python', {'do': 'yarn install --frozen-lockfile'}
" Frontend
Plug 'pangloss/vim-javascript'
" UI
Plug 'vim-airline/vim-airline'

"Test
Plug 'neovim/nvim-lspconfig'
if has('python3')
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'nvim-lua/completion-nvim'
Plug 'steelsojka/completion-buffers'
endif
Plug 'lambdalisue/fern.vim'
call plug#end()

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Expand Down Expand Up @@ -96,7 +100,6 @@ au FocusGained,BufEnter * :checktime
if has('nvim')
autocmd TermOpen * setlocal nonumber norelativenumber
end

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Mappings "
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Expand Down Expand Up @@ -163,15 +166,15 @@ map <leader>cd :cd %:p:h<cr>:pwd<cr>"

" Coc.nvim
" nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gd :call <SID>GoToDefinition()<CR>
nmap <silent> gr <Plug>(coc-references)
nmap <leader>rn <Plug>(coc-rename)
nnoremap <silent> K :call <SID>show_documentation()<CR>
" nmap <silent> gd :call <SID>GoToDefinition()<CR>
" nmap <silent> gr <Plug>(coc-references)
" nmap <leader>rn <Plug>(coc-rename)
" nnoremap <silent> K :call <SID>show_documentation()<CR>

" ALE
map <leader>= :ALEFix<cr>
nmap <silent> [e <Plug>(ale_previous_wrap)
nmap <silent> ]e <Plug>(ale_next_wrap)
" map <leader>= :ALEFix<cr>
" nmap <silent> [e <Plug>(ale_previous_wrap)
" nmap <silent> ]e <Plug>(ale_next_wrap)

" Ack
nnoremap <leader>a :Ack!<Space>
Expand Down Expand Up @@ -318,6 +321,33 @@ vnoremap <leader>rw "hy:%s/<C-r>h//g<left><left>
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Plugin config "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has('python3')
" deoplete
let g:deoplete#enable_at_startup = 1
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ deoplete#manual_complete()
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<S-Tab>"
else
" completion-nvim
let g:completion_matching_smart_case = 1
autocmd BufEnter * lua require'completion'.on_attach()
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <c-j> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <c-k> pumvisible() ? "\<C-p>" : "\<S-Tab>"
set completeopt=menuone,noinsert,noselect
set shortmess+=c
let g:completion_chain_complete_list = [
\{'complete_items': ['buffers', 'lsp']},
\{'mode': '<c-p>'},
\{'mode': '<c-n>'}
\]
endif

" ctrlsf
let g:ctrlsf_backend = 'rg'
let g:ctrlsf_extra_backend_args = {
\ 'rg': '--vimgrep --type-not sql --smart-case'
Expand Down Expand Up @@ -358,28 +388,11 @@ nmap <leader>7 <Plug>AirlineSelectTab7
nmap <leader>8 <Plug>AirlineSelectTab8
nmap <leader>9 <Plug>AirlineSelectTab9

" Coc.nvim setting
inoremap <silent><expr> <Tab>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<S-Tab>"

function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction

function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction

" Fzf
let g:fzf_layout = { 'down': '~30%' }

Expand Down Expand Up @@ -415,23 +428,9 @@ command! -bang -nargs=* Rg
" Fzf tags
let g:fzf_tags_prompt = "Gd "

" Ale plugin
let g:ale_ruby_rubocop_executable = 'bundle'

let b:ale_linters = {
\ 'python': ['pylint'],
\ 'ruby': ['rubocop'],
\}

let g:ale_fixers = {
\ '*': ['remove_trailing_lines', 'trim_whitespace'],
\ 'python': ['black'],
\ 'ruby': ['rubocop'],
\}

" Indentline
let g:indentLine_char = '│'
let g:indentLine_fileTypeExclude = ['defx']
let g:indentLine_fileTypeExclude = ['defx', 'fern']

" Vim test
let test#strategy = "asyncrun"
Expand Down Expand Up @@ -539,16 +538,16 @@ function! VisualSelection(direction, extra_filter) range
let @" = l:saved_reg
endfunction

function! s:GoToDefinition()
if CocAction('jumpDefinition')
return v:true
endif
" function! s:GoToDefinition()
" if CocAction('jumpDefinition')
" return v:true
" endif

let ret = execute("silent! normal \<C-]>")
if ret !~ 'not found'
execute("normal 0")
endif
endfunction
" let ret = execute("FZFTags")
" if ret !~ 'not found'
" execute("normal 0")
" endif
" endfunction

function! ToggleDefxWidth(winwidth)
if a:winwidth == '30'
Expand All @@ -563,3 +562,51 @@ augroup RubySpecialKeywordCharacters
autocmd Filetype ruby setlocal iskeyword+=!
autocmd Filetype ruby setlocal iskeyword+=?
augroup END

lua require("lsp_config")

" Fern
let g:fern#disable_default_mappings = 1
let g:fern#renderer#default#root_symbol = '[root] '
let g:fern#renderer#default#leading = ' '
let g:fern#renderer#default#leaf_symbol = ' '
let g:fern#renderer#default#collapsed_symbol = ' '
let g:fern#renderer#default#expanded_symbol = 'ﱮ '

nnoremap <C-b> :Fern . -drawer<CR>
function! s:init_fern() abort
nmap <nowait><buffer> d <Plug>(fern-action-remove)
nmap <nowait><buffer> c <Plug>(fern-action-clipboard-copy)
nmap <buffer> x <Plug>(fern-action-clipboard-move)
nmap <buffer> p <Plug>(fern-action-clipboard-paste)
nmap <buffer> o <Plug>(fern-action-open-or-expand)
nmap <buffer> i <Plug>(fern-action-collapse)
nmap <buffer> l <Plug>(fern-action-open-or-enter)
nmap <buffer> h <Plug>(fern-action-leave)
nmap <buffer> m <Plug>(fern-action-new-path)
nmap <buffer> v <Plug>(fern-action-mark:toggle)
nmap <buffer> V <Plug>(fern-action-mark:clear)
nmap <buffer> r <Plug>(fern-action-rename)
nmap <buffer> H <Plug>(fern-action-hidden:toggle)
nmap <buffer> fi <Plug>(fern-action-include)
nmap <buffer> <CR> <Plug>(fern-action-open-or-expand)
nmap <buffer> <C-C> <Plug>(fern-action-cancel)
nmap <buffer> q :<C-u>quit<CR>
endfunction

augroup fern-custom
autocmd! *
autocmd FileType fern call s:init_fern()
augroup END

nnoremap <silent> <Leader>ee :Fern . -drawer -reveal=%<CR>

function! s:on_highlight() abort
highlight link FernRootSymbol Comment
highlight link FernRootText Statement
endfunction

augroup MyFernHighlight
autocmd!
autocmd User FernHighlight call s:on_highlight()
augroup END
63 changes: 63 additions & 0 deletions vim/lua/lsp_config.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
local nvim_lsp = require('lspconfig')
local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end

buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')

-- Mappings.
local opts = { noremap=true, silent=true }
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
buf_set_keymap('n', '[e', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
buf_set_keymap('n', ']e', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts)
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)

-- buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
-- buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
-- buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)

-- Set some keybinds conditional on server capabilities
if client.resolved_capabilities.document_formatting then
buf_set_keymap("n", "<space>=", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
elseif client.resolved_capabilities.document_range_formatting then
buf_set_keymap("n", "<space>=", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
end

-- Set autocommands conditional on server_capabilities
if client.resolved_capabilities.document_highlight then
require('lspconfig').util.nvim_multiline_command [[
:hi LspReferenceRead cterm=bold ctermbg=red guibg=LightYellow
:hi LspReferenceText cterm=bold ctermbg=red guibg=LightYellow
:hi LspReferenceWrite cterm=bold ctermbg=red guibg=LightYellow
augroup lsp_document_highlight
autocmd!
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
augroup END
]]
end
end

-- Use a loop to conveniently both setup defined servers
-- and map buffer local keybindings when the language server attaches
local servers = { "solargraph" }
for _, lsp in ipairs(servers) do
nvim_lsp[lsp].setup { on_attach = on_attach }
end

vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
vim.lsp.diagnostic.on_publish_diagnostics, {
underline = true,
virtual_text = false,
signs = true,
update_in_insert = false,
}
)