" Set global flag to allow checking in custom user config let g:vscode = 1 let s:currDir = fnamemodify(resolve(expand(':p')), ':h') " Adjust rtp path let &runtimepath = &runtimepath . ',' . s:currDir . '/vim-altercmd' " Used to execute vscode command let s:vscodeCommandEventName = 'vscode-command' " Used to execute vscode command with some range (the specified range will be selected and the command will be executed on this range) let s:vscodeRangeCommandEventName = 'vscode-range-command' " Used for externsion inter-communications let s:vscodePluginEventName = 'vscode-neovim' " RPC and global functions function! VSCodeCall(cmd, ...) abort call rpcrequest(g:vscode_channel, s:vscodeCommandEventName, a:cmd, a:000) endfunction function! VSCodeCallRange(cmd, line1, line2, leaveSelection, ...) abort call rpcrequest(g:vscode_channel, s:vscodeRangeCommandEventName, a:cmd, a:line1, a:line2, 0, 0, a:leaveSelection, a:000) endfunction function! VSCodeCallRangePos(cmd, line1, line2, pos1, pos2, leaveSelection, ...) abort call rpcrequest(g:vscode_channel, s:vscodeRangeCommandEventName, a:cmd, a:line1, a:line2, a:pos1, a:pos2, a:leaveSelection, a:000) endfunction function! VSCodeNotify(cmd, ...) call rpcnotify(g:vscode_channel, s:vscodeCommandEventName, a:cmd, a:000) endfunction function! VSCodeNotifyRange(cmd, line1, line2, leaveSelection, ...) call rpcnotify(g:vscode_channel, s:vscodeRangeCommandEventName, a:cmd, a:line1, a:line2, 0, 0, a:leaveSelection, a:000) endfunction function! VSCodeNotifyRangePos(cmd, line1, line2, pos1, pos2, leaveSelection, ...) call rpcnotify(g:vscode_channel, s:vscodeRangeCommandEventName, a:cmd, a:line1, a:line2, a:pos1, a:pos2, a:leaveSelection, a:000) endfunction function! VSCodeExtensionCall(cmd, ...) abort call rpcrequest(g:vscode_channel, s:vscodePluginEventName, a:cmd, a:000) endfunction function! VSCodeExtensionNotify(cmd, ...) abort call rpcnotify(g:vscode_channel, s:vscodePluginEventName, a:cmd, a:000) endfunction " Called from extension when opening/creating new file in vscode to reset undo tree function! VSCodeClearUndo(bufId) let oldlevels = &undolevels call nvim_buf_set_option(a:bufId, 'undolevels', -1) call nvim_buf_set_lines(a:bufId, 0, 0, 0, []) call nvim_buf_set_option(a:bufId, 'undolevels', oldlevels) unlet oldlevels endfunction " Called from extension to align screen row in neovim after scrolling " function! VSCodeAlignScreenRow(row) " let currentRow = winline() " let diff = abs(currentRow - a:row) " if diff > 0 " if (a:row - currentRow) < 0 " if diff > 1 " silent! exe "normal! " . diff . "\" " else " silent! exe "normal! \" " endif " else " if diff > 1 " silent! exe "normal! " . diff . "\" " else " silent! exe "normal! \" " endif " endif " endif " endfunction " Set text decorations for given ranges. Used in easymotion function! VSCodeSetTextDecorations(hlName, rowsCols) call VSCodeExtensionNotify('text-decorations', a:hlName, a:rowsCols) endfunction " Used for ctrl-a insert keybinding function! VSCodeGetLastInsertText() let [lineStart, colStart] = getpos("'[")[1:2] let [lineEnd, colEnd] = getpos("']")[1:2] if (lineStart == 0) return [] endif let lines = getline(lineStart, lineEnd) let lines[0] = lines[0][colStart - 1:] let lines[-1] = lines[-1][:colEnd - 1] return lines endfunction " Used for ctrl-r [reg] insert keybindings function! VSCodeGetRegister(reg) return getreg(a:reg) endfunction " This is called by extension when created new buffer function! s:onBufEnter(name, id) if exists('b:vscode_temp') && b:vscode_temp return endif set conceallevel=0 let tabstop = &tabstop let isJumping = 0 if exists('g:isJumping') let isJumping = g:isJumping endif call VSCodeExtensionCall('external-buffer', a:name, a:id, 1, tabstop, isJumping) endfunction function! s:runFileTypeDetection() doautocmd BufRead if exists('b:vscode_controlled') && b:vscode_controlled " make sure we disable syntax (global option seems doesn't take effect for 2nd+ windows) setlocal syntax=off endif endfunction function! s:onInsertEnter() let reg = reg_recording() if !empty(reg) call VSCodeExtensionCall('notify-recording', reg) endif endfunction " Load altercmd first execute 'source ' . s:currDir . '/vim-altercmd/plugin/altercmd.vim' execute 'source ' . s:currDir . '/vscode-insert.vim' execute 'source ' . s:currDir . '/vscode-scrolling.vim' execute 'source ' . s:currDir . '/vscode-jumplist.vim' execute 'source ' . s:currDir . '/vscode-code-actions.vim' execute 'source ' . s:currDir . '/vscode-file-commands.vim' execute 'source ' . s:currDir . '/vscode-tab-commands.vim' execute 'source ' . s:currDir . '/vscode-window-commands.vim' execute 'source ' . s:currDir . '/vscode-motion.vim' augroup VscodeGeneral autocmd! " autocmd BufWinEnter,WinNew,WinEnter * :only autocmd BufWinEnter * call onBufEnter(expand(''), expand('')) " Help and other buffer types may explicitly disable line numbers - reenable them, !important - set nowrap since it may be overriden and this option is crucial for now " autocmd FileType * :setlocal conceallevel=0 | :setlocal number | :setlocal numberwidth=8 | :setlocal nowrap | :setlocal nofoldenable autocmd InsertEnter * call onInsertEnter() autocmd BufAdd * call runFileTypeDetection() " Looks like external windows are coming with "set wrap" set automatically, disable them " autocmd WinNew,WinEnter * :set nowrap augroup END