모던 Hotwire 및 Rails 시대를 위한 개발 도구: LSP를 통한 개발자 경험 향상
모던 Rails 및 Hotwire 애플리케이션 개발에 있어 JavaScript 생태계 대비 부족했던 개발 도구의 필요성을 강조합니다.
모던 Hotwire 및 Rails 시대를 위한 개발 도구: LSP를 통한 개발자 경험 향상
모던 Rails 및 Hotwire 애플리케이션 개발에 있어 JavaScript 생태계 대비 부족했던 개발 도구의 필요성을 강조합니다.
Сколько стоит контекст для кодового агента: grep vs граф vs LSP на большом проекте (936 прогонов)
Я взял одного и того же агента (Claude Code), менял у него ровно одну вещь — какой MCP-сервер отдаёт контекст по коду, — и гонял по 26 задачам на apache/superset . Четыре «руки»: filesystem (grep + read), graphlens (структурный граф), serena (LSP) и codegraph . Три модели (haiku / sonnet / opus), три сида — 936 прогонов . Главный результат: вывод переворачивается в зависимости от типа задачи. Смотреть цифры
https://habr.com/ru/articles/1051504/
#MCP #LLMагенты #Claude_Code #бенчмарк #graphlens #code_intelligence #статический_анализ_кода #LSP #codegraph #AI_для_разработки

Продолжение статьи про graphlens . Там я описал, что инструмент делает и как устроен, и по дороге уверенно заявил, что «агент жжёт токены, бегая grep'ом по репозиторию». Заявил — но ни одной цифры не...
Roman Space Telescope and Artemis III SLS Core Stage Weather Cover Arrive at KSC 🌑🚀🧑🚀
#Artemis #ArtemisIII #GoddardSpaceFlightCenter #KSC #KennedySpaceCenter #LSP #LaunchServicesProgram #Moon
⏩ 8 new pictures from NASA (Image Library) https://commons.wikimedia.org/wiki/Special:ListFiles?limit=8&user=OptimusPrimeBot&ilshowall=1&offset=20260623010413
graphlens: превращаем репозиторий в типизированный граф — Python, TypeScript, Go и Rust в одной модели
Любой инструмент для «понимания кода», которым я пользовался, рано или поздно упирался в одну из двух стен. Первая — цикл «grep → открыть → прочитать → перейти по импорту → снова grep» . Работает, но медленно, и у него нет ни малейшего представления о том, что process_order , найденный в services.py — это тот самый process_order , который вызывается из api.py , а не однофамилец из tests/ . Когда этим занимается LLM-агент, он ещё и сжигает на этом тонну токенов. Вторая стена — моноязычность . Инструмент прекрасно понимает Python, но слепнет в ту секунду, когда фронтенд на TypeScript дёргает ручку FastAPI на Python. Реальные системы полиглотны. Инструменты вокруг них — обычно нет. graphlens — это open-source фреймворк (MIT), который спроектирован так, чтобы обойти обе стены. Он парсит исходный проект, нормализует его структуру в общий граф-IR и отдаёт этот граф вам — делайте с ним что хотите: анализ зависимостей, навигацию, поиск мёртвого кода или подачу точных ответов LLM-агенту вместо вываливания файлов в контекст.
https://habr.com/ru/articles/1050204/
#graphlens #статический_анализ_кода #граф_кода #treesitter #Python #LSP #code_intelligence #MCP

Любой инструмент для «понимания кода», которым я пользовался, рано или поздно упирался в одну из двух стен. Первая — цикл «grep → открыть → прочитать → перейти по импорту → снова grep» . Работает, но...
Roman Space Telescope Arrival
#GoddardSpaceFlightCenter #KSC #KennedySpaceCenter #LSP #LaunchServicesProgram #NancyGraceRomanSpaceTelescope #PHSF #PayloadHazardousServicingFacility
⏩ 5 new pictures from NASA (Image Library) https://commons.wikimedia.org/wiki/Special:ListFiles?limit=5&user=OptimusPrimeBot&ilshowall=1&offset=20260622010258
"Wer ständig Ausnahmen braucht, hat meist kein Ausnahmeproblem - sondern ein Planungsproblem"
you cannot handle my vimrc. its too powerful for you. you’ll have to find another vimscript merchant in uganda
vim9script
set termguicolors
set hidden
set relativenumber
set cursorline
set cursorlineopt=both
set list
set listchars=trail:·,tab:»\ ,nbsp:␣,extends:›,precedes:‹
set showbreak=↪\
set breakindent
set laststatus=2
set statusline=%#Status1#%y\[%{empty(&fenc)\ ?\ &enc\ :\ &fenc}\|%{&fileformat}\]%r%m%#Status2#\ %F\ %=\ %l:%c\ %L
set tabstop=4
set shiftwidth=4
packadd! matchit
set smartindent
set equalalways
set splitbelow
set splitright
set splitkeep=screen
set nostartofline
set completeopt=menuone,noselect,noinsert
set scrolloff=8
set sidescrolloff=4
set pumheight=16
set shortmess+=c
set ignorecase
set smartcase
set undofile
set swapfile
set directory=~/.cache/vim/swap
set undodir=~/.cache/vim/undo
set path+=**
set wildmenu
set wildmode=longest:full,full
set title
set ttimeoutlen=67
set updatetime=420
set mouse=a
augroup terminal_setup
au!
autocmd TerminalOpen * setlocal nospell nonumber nobuflisted textwidth=0 winheight=1
augroup END
filetype plugin on
filetype plugin indent on
syntax on
imap <C-BS> <C-W>
cnoremap %% <C-R>=fnameescape(expand("%:p:h")."/")<CR>
if has('clipboard_provider') && executable('wl-copy')
set t_fd=
set t_fe=
def WlClipCopy(reg: string, regtype: string, lines: list<string>)
call system('wl-copy', join(lines, "\n") .. (regtype[0] ==# 'V' ? "\n" : ''))
if v:shell_error != 0
echohl WarningMsg | echom 'wl-copy failed' | echohl None
endif
enddef
def WlClipPaste(reg: string): list<any>
var lines = systemlist('wl-paste --no-newline')
if v:shell_error != 0
return [] # invalid return = register left unchanged, per the docs
endif
return ['', lines]
enddef
v:clipproviders['wl'] = {
available: () => !empty($WAYLAND_DISPLAY),
copy: {'+': WlClipCopy, '*': WlClipCopy},
paste: {'+': WlClipPaste, '*': WlClipPaste},
}
set clipmethod^=wl
endif
# git clone https://github.com/k-takata/minpac.git ~/.config/vim/pack/minpac/opt/minpac
def PackInit()
packadd minpac
call minpac#init()
call minpac#add('k-takata/minpac', {'type': 'opt'})
# colorscheme
call minpac#add('ayu-theme/ayu-vim')
#lsp/linting/formatting
call minpac#add('yegappan/lsp')
call minpac#add('dense-analysis/ale')
#git stuff this shit runs git like every second
call minpac#add('airblade/vim-gitgutter')
call minpac#add('Eliot00/git-lens.vim')
#useful shortcuts
call minpac#add('ubaldot/vim-op-surround')
call minpac#add('mao-yining/undotree.vim')
#repl
call minpac#add('ubaldot/vim-replica')
# vimwiki :)
call minpac#add('vimwiki/vimwiki')
enddef
command! PackUpdate source $MYVIMRC | call PackInit() | call minpac#update()
command! PackClean source $MYVIMRC | call PackInit() | call minpac#clean()
command! PackStatus packadd minpac | call PackInit() | call minpac#status()
# silently add now so ayu-vim doesnt error
silent! packadd ayu-vim
#light
#set background=light
#highlight LineNr guifg=#f040a0
#highlight CursorLine guibg=#f7f7f7 term=none cterm=none
#highlight CursorLineNr guibg=#f4f4f4 gui=bold term=none cterm=bold
#highlight CursorColumn guibg=#f8f8f8
#highlight Folded guibg=#ff4faf guifg=#ffffff gui=bold
#highlight Status1 guibg=#f040a0 guifg=#ffffff gui=bold
#highlight Status2 guibg=#f040a0 guifg=#ffffff
#dark
#set background=dark
#highlight CursorLine guibg=#984373 term=none cterm=none
#highlight CursorLineNr guibg=#984373 gui=bold term=none cterm=bold
#highlight CursorColumn guibg=#984373
#highlight Folded guibg=#5a5a5a guifg=#f040a0 gui=bold
#highlight Status1 guibg=#f040a0 guifg=#ffffff gui=bold
#highlight Status2 guibg=#f040a0 guifg=#ffffff
#powershell
#set background=dark
#highlight CursorLine guibg=#084483 term=none cterm=none
#highlight CursorLineNr guibg=#084483 gui=bold term=none cterm=bold
#highlight CursorColumn guibg=#084483
#highlight Folded guibg=#5a5a5a guifg=#0b57a8 gui=bold
#highlight Status1 guibg=#0b57a8 guifg=#ffffff gui=bold
#highlight Status2 guibg=#0b57a8 guifg=#ffffff
#ayu
g:ayucolor = "dark"
colorscheme ayu
augroup lsp_options
au!
autocmd User LspSetup call g:LspOptionsSet({
\ 'autoComplete': v:true,
\ 'showDiagWithSign': v:true,
\ 'showDiagWithVirtualText': v:false,
\ 'highlightDiagInline': v:true,
\ 'showDiagInPopup': v:false,
\ 'autoHighlightDiags': v:true,
\ 'autoHighlight': v:true,
\ 'semanticHighlight': v:true,
\ 'showInlayHints': v:true,
\ 'showSignature': v:true,
\ 'echoSignature': v:true,
\ 'diagSignErrorText': '✘',
\ 'diagSignWarningText': '▲',
\ 'diagSignInfoText': 'ℹ',
\ 'diagSignHintText': '●',
\ })
augroup END
highlight Error ctermfg=red guifg=red ctermbg=NONE guibg=NONE cterm=bold gui=bold
highlight Todo ctermfg=lightyellow guifg=lightyellow ctermbg=NONE guibg=NONE cterm=bold gui=bold
# diagnostics
highlight LspDiagInlineError ctermfg=red guisp=#e06c75 cterm=undercurl gui=undercurl
highlight LspDiagInlineWarning ctermfg=yellow guisp=#e5c07b cterm=underline gui=underline
highlight LspDiagInlineInfo ctermfg=lightblue guisp=#61afef cterm=underline gui=underline
highlight LspDiagInlineHint ctermfg=lightmagenta guisp=#c678dd cterm=underline gui=underline
#gutter
highlight LspErrorText guifg=#FF3333 guibg=NONE gui=bold
highlight LspWarningText guifg=#FFB454 guibg=NONE gui=bold
highlight LspInformationText guifg=#36A3D9 guibg=NONE
highlight LspHintText guifg=#95E6CB guibg=NONE
highlight LspCodeActionText guifg=#E7C547 guibg=NONE
# document highlight
highlight LspReference guibg=#253340 guifg=NONE
highlight LspReferenceText guibg=#253340 guifg=NONE
highlight LspReferenceRead guibg=#253340 guifg=NONE
highlight LspReferenceWrite guibg=#2E3A2A guifg=NONE
highlight Status1 guibg=#FFB454 guifg=#0F1419 gui=bold
highlight Status2 guibg=#253340 guifg=#E6E1CF gui=NONE
highlight StatusLine guibg=#253340 guifg=#E6E1CF gui=NONE
highlight StatusLineNC guibg=#161D24 guifg=#8A94A0 gui=NONE
highlight LineNr guifg=#5C6773 guibg=NONE
highlight CursorLineNr guifg=#FFB454 guibg=#1B232C gui=bold
highlight CursorLine guibg=#1B232C guifg=NONE
highlight CursorColumn guibg=#1B232C guifg=NONE
highlight CursorLineConceal guibg=#1B232C guifg=#5C6773
highlight VertSplit guifg=#5C6773 guibg=NONE gui=NONE
highlight WinSeparator guifg=#5C6773 guibg=NONE gui=NONE
g:ale_disable_lsp = 1
g:ale_linters_explicit = 1
g:ale_fix_on_save = 1
g:ale_fixers = {
\ 'zig': ['zigfmt'],
\ 'rust': ['rustfmt'],
\ 'go': ['goimports', 'gofmt'],
\ 'c': ['clang-format'],
\ 'cpp': ['clang-format'],
\ 'cmake': ['cmake-format'],
\ 'python': ['ruff', 'ruff_format'],
\ 'sh': ['shfmt'],
\ 'bash': ['shfmt'],
\ 'terraform': ['terraform'],
\ 'typescript': ['prettier'],
\ 'javascript': ['prettier'],
\ 'html': ['prettier'],
\ 'css': ['prettier'],
\ 'json': ['prettier'],
\ 'jsonc': ['prettier'],
\ }
au BufRead,BufNewFile *.vrl setlocal filetype=vrl
if executable('vrl')
autocmd FileType vrl setlocal makeprg=vrl\ --program\ %\ --input\ /dev/null
elseif executable('vector')
autocmd FileType vrl setlocal makeprg=vector\ vrl\ --program\ %\ --input\ /dev/null
endif
def SqlFluffFormat()
var view = winsaveview()
var src = getline(1, '$')
var out = systemlist('sqlfluff format --dialect ansi -', src)
if v:shell_error == 0 && !empty(out)
if out !=# src
deletebufline('%', 1, '$')
setline(1, out)
endif
else
echohl WarningMsg | echom 'sqlfluff: ' .. join(out, ' ') | echohl None
endif
winrestview(view)
enddef
if executable('sqlfluff')
augroup sqlfluff_format
au!
autocmd BufWritePre * if &filetype ==# 'sql' | SqlFluffFormat() | endif
autocmd FileType sql setlocal formatprg=SqlFluffFormat()
augroup END
endif
def OnLspAttached()
augroup lsp_cursor_diag
autocmd! CursorHold <buffer>
autocmd CursorHold <buffer> silent! LspDiag current
augroup END
nnoremap <buffer> <silent> <leader>gd <Cmd>LspGotoDefinition<CR>
nnoremap <buffer> <silent> <leader>gD <Cmd>LspGotoDeclaration<CR>
nnoremap <buffer> <silent> <leader>gi <Cmd>LspGotoImpl<CR>
nnoremap <buffer> <silent> <leader>gr <Cmd>LspShowReferences<CR>
nnoremap <buffer> <silent> <leader>gt <Cmd>LspGotoTypeDef<CR>
nnoremap <buffer> <silent> <leader>K <Cmd>LspHover<CR>
nnoremap <buffer> <silent> <leader>rn <Cmd>LspRename<CR>
nnoremap <buffer> <silent> <leader>ca <Cmd>LspCodeAction<CR>
nnoremap <buffer> <silent> <leader>dl <Cmd>LspDiag show<CR>
nnoremap <buffer> <silent> [d <Cmd>LspDiag prev<CR>
nnoremap <buffer> <silent> ]d <Cmd>LspDiag next<CR>
nnoremap <buffer> <silent> <leader>f <Cmd>LspFormat<CR>
nnoremap <buffer> <silent> <leader>ds <Cmd>LspDocumentSymbol<CR>
nnoremap <buffer> <silent> <leader>ws <Cmd>LspSymbolSearch<CR>
nnoremap <buffer> <silent> <leader>pe <Cmd>LspPeekDefinition<CR>
nnoremap <buffer> ]q :cnext<CR>
nnoremap <buffer> [q :cprev<CR>
nnoremap <buffer> ]Q :clast<CR>
nnoremap <buffer> [Q :cfirst<CR>
setlocal signcolumn=yes
enddef
augroup lsp_attach
au!
autocmd User LspAttached call OnLspAttached()
augroup END
def HasPrettierRc(): bool
var dir = expand('%:p:h')
for name in [
\ '.prettierrc',
\ '.prettierrc.json', '.prettierrc.yaml', '.prettierrc.yml',
\ '.prettierrc.json5', '.prettierrc.toml',
\ '.prettierrc.js', '.prettierrc.cjs', '.prettierrc.mjs',
\ '.prettierrc.ts', '.prettierrc.cts', '.prettierrc.mts',
\ 'prettier.config.js', 'prettier.config.cjs', 'prettier.config.mjs',
\ 'prettier.config.ts', 'prettier.config.cts', 'prettier.config.mts']
if !empty(findfile(name, dir .. ';'))
return true
endif
endfor
return false
enddef
def PrettierYaml()
var view = winsaveview()
var src = getline(1, '$')
var out = systemlist('prettier --stdin-filepath ' .. shellescape(expand('%:p')), src)
if v:shell_error == 0 && !empty(out)
if out !=# src
call deletebufline('%', 1, '$')
call setline(1, out)
endif
else
echohl WarningMsg | echom 'prettier: ' .. join(out, ' ') | echohl None
endif
call winrestview(view)
enddef
def YamlFormatOnSave()
if executable('prettier') && HasPrettierRc()
call PrettierYaml()
else
silent! LspFormat
endif
enddef
augroup yaml_fmt
au!
autocmd BufWritePre *.yaml,*.yml call YamlFormatOnSave()
augroup END
def RegisterLspServers()
# append to this and we will declare everything at the end once
var servers = []
if executable('ty') && executable('ruff')
call add(servers, {'name': 'ruff', 'filetype': ['python'], 'path': 'ruff', 'args': ['server']})
call add(servers, {'name': 'ty', 'filetype': ['python'], 'path': 'ty', 'args': ['server']})
elseif executable('pylsp') && executable('ruff')
var pylsp_cfg = {'pylsp': {'plugins': {
\ 'pycodestyle': {'enabled': v:false},
\ 'pyflakes': {'enabled': v:false},
\ 'mccabe': {'enabled': v:false},
\ 'yapf': {'enabled': v:false},
\ 'autopep8': {'enabled': v:false},
\ 'ruff': {'enabled': v:true, 'formatEnabled': v:true},
\ }}}
call add(servers, {'name': 'pylsp', 'filetype': ['python'], 'path': 'pylsp', 'args': [], 'workspaceConfig': pylsp_cfg})
elseif executable('ty')
call add(servers, {'name': 'ty', 'filetype': ['python'], 'path': 'ty', 'args': ['server']})
elseif executable('ruff')
call add(servers, {'name': 'ruff', 'filetype': ['python'], 'path': 'ruff', 'args': ['server']})
elseif executable('pylsp')
var pylsp_cfg = {'pylsp': {'plugins': {
\ 'pycodestyle': {'enabled': v:false},
\ 'pyflakes': {'enabled': v:true},
\ 'yapf': {'enabled': v:false},
\ }}}
call add(servers, {'name': 'pylsp', 'filetype': ['python'], 'path': 'pylsp', 'args': [], 'workspaceConfig': pylsp_cfg})
endif
if executable('bash-language-server')
call add(servers, {'name': 'bashls', 'filetype': ['sh', 'bash'], 'path': 'bash-language-server', 'args': ['start']})
endif
if executable('nixd')
call add(servers, {'name': 'nixd', 'filetype': ['nix'], 'path': 'nixd', 'args': []})
endif
if executable('ansible-language-server')
var ansible_opts = {'ansible': {'validation': {'lint': {'enabled': v:true}}}}
call add(servers, {'name': 'ansiblels', 'filetype': ['yaml.ansible'], 'path': 'ansible-language-server', 'args': ['--stdio'], 'initializationOptions': ansible_opts})
endif
if executable('tofu-ls')
call add(servers, {'name': 'tofu-ls', 'filetype': ['terraform'], 'path': 'tofu-ls', 'args': ['serve']})
elseif executable('terraform-ls')
call add(servers, {'name': 'terraform-ls', 'filetype': ['terraform'], 'path': 'terraform-ls', 'args': ['serve']})
endif
if executable('nu')
call add(servers, {'name': 'nushell', 'filetype': ['nu'], 'path': 'nu', 'args': ['--lsp']})
endif
if executable('jsonnet-language-server')
call add(servers, {'name': 'jsonnet', 'filetype': ['jsonnet', 'libsonnet'], 'path': 'jsonnet-language-server', 'args': []})
endif
if executable('dhall-lsp-server')
call add(servers, {'name': 'dhall', 'filetype': ['dhall'], 'path': 'dhall-lsp-server', 'args': []})
endif
if executable('pwsh')
var pses_paths = [
\ expand('~/.local/share/powershell/Modules/PowerShellEditorServices/Start-EditorServices.ps1'),
\ expand('~/Documents/PowerShell/Modules/PowerShellEditorServices/Start-EditorServices.ps1'),
\ expand('~/.local/share/powershell/Modules/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1'),
\ expand('~/Documents/PowerShell/Modules/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1')]
var pses_found = null_string
for p in pses_paths
if filereadable(p)
pses_found = p
break
endif
endfor
if pses_found != ''
var pses_bundle = fnamemodify(pses_found, ':h')
add(servers, {
name: 'powershell-es',
filetype: ['ps1', 'powershell'],
path: 'pwsh',
args: ['-NoLogo', '-NoProfile', '-NonInteractive', '-Command', pses_found,
'-BundledModulesPath', pses_bundle, '-Stdio',
'-LogPath', expand('~/.cache/vim/pses.log'),
'-LogLevel', 'Warning', '-FeatureFlags', '@()'],
})
endif
endif
if executable('yaml-language-server')
var yaml_cfg = {'yaml': {'validate': v:true, 'completion': v:true, 'hover': v:true, 'yamlVersion': '1.2', 'schemaStore': {'enable': v:true}}}
call add(servers, {'name': 'yamlls', 'filetype': ['yaml', 'yml'], 'path': 'yaml-language-server', 'args': ['--stdio'], 'workspaceConfig': yaml_cfg})
endif
if executable('sqls')
call add(servers, {'name': 'sqls', 'filetype': ['sql', 'mysql', 'plsql', 'mssql'], 'path': 'sqls', 'args': []})
elseif executable('sql-language-server')
call add(servers, {'name': 'sqlls', 'filetype': ['sql', 'mysql', 'plsql', 'mssql'], 'path': 'sql-language-server', 'args': ['up', '--method', 'stdio']})
endif
if executable('gopls')
var gopls_cfg = {'gopls': {'staticcheck': v:true, 'usePlaceholders': v:true, 'completeUnimported': v:true}}
call add(servers, {'name': 'gopls', 'filetype': ['go', 'gomod', 'gowork', 'gohtmltmpl', 'gotexttmpl'], 'path': 'gopls', 'args': ['-remote=auto'], 'syncInit': v:true, 'workspaceConfig': gopls_cfg})
endif
if executable('rust-analyzer')
call add(servers, {'name': 'rust-analyzer', 'filetype': ['rust'], 'path': 'rust-analyzer', 'args': [], 'syncInit': v:true})
endif
if executable('typescript-language-server')
call add(servers, {'name': 'tsserver', 'filetype': ['javascript', 'typescript', 'typescriptreact', 'javascriptreact', 'typescript.tsx', 'javascript.jsx'], 'path': 'typescript-language-server', 'args': ['--stdio']})
endif
if executable('vscode-eslint-language-server')
call add(servers, {'name': 'eslint', 'filetype': ['javascript', 'typescript', 'typescriptreact', 'javascriptreact'], 'path': 'vscode-eslint-language-server', 'args': ['--stdio']})
endif
if executable('zls')
call add(servers, {'name': 'zls', 'filetype': ['zig'], 'path': 'zls', 'args': []})
endif
if executable('vscode-json-language-server')
call add(servers, {'name': 'jsonls', 'filetype': ['json', 'jsonc'], 'path': 'vscode-json-language-server', 'args': ['--stdio']})
endif
if executable('taplo')
call add(servers, {'name': 'taplo', 'filetype': ['toml'], 'path': 'taplo', 'args': ['lsp', 'stdio']})
endif
if executable('awk-language-server')
call add(servers, {'name': 'awkls', 'filetype': ['awk'], 'path': 'awk-language-server', 'args': []})
endif
if executable('csharp-ls')
call add(servers, {'name': 'csharp-ls', 'filetype': ['cs'], 'path': 'csharp-ls', 'args': []})
endif
if executable('clangd')
call add(servers, {'name': 'clangd', 'filetype': ['c', 'cpp', 'objc', 'objcpp', 'cuda'], 'path': 'clangd', 'args': ['--background-index']})
endif
if executable('promql-langserver')
call add(servers, {'name': 'promql', 'filetype': ['promql'], 'path': 'promql-langserver', 'args': ['--config-file', expand('~/.config/promql-langserver.yaml')]})
endif
if !empty(servers)
call g:LspAddServer(servers)
endif
enddef
augroup lsp_servers
au!
autocmd User LspSetup call RegisterLspServers()
augroup END
augroup lsp_filetypes
au!
au BufRead,BufNewFile *.nu setlocal filetype=nu
au BufRead,BufNewFile *.ps1,*.psm1,*.psd1 setlocal filetype=ps1
au BufRead,BufNewFile *.zig,*.zon setlocal filetype=zig
au BufRead,BufNewFile *.jsonc setlocal filetype=jsonc
au BufRead,BufNewFile *.hujson setlocal filetype=jsonc
au BufRead,BufNewFile *.jsonld setlocal filetype=json
au BufRead,BufNewFile *.toml,Cargo.lock setlocal filetype=toml
au BufRead,BufNewFile *.awk,*.gawk setlocal filetype=awk
au BufRead,BufNewFile *.csx setlocal filetype=cs
au BufRead,BufNewFile *.promql setlocal filetype=promql
au BufRead,BufNewFile *.hcl setlocal filetype=hcl
au BufRead,BufNewFile *.pkr.hcl setlocal filetype=hcl
au BufRead,BufNewFile *.pkr.json setlocal filetype=json
augroup END
augroup hcl_fmt
au!
if executable('packer')
autocmd FileType hcl setlocal formatprg=packer\ fmt\ -
endif
augroup END
if executable('ansible-language-server')
augroup lsp_ansible_detect
au!
au BufRead,BufNewFile */playbooks/*.yml,*/playbooks/*.yaml setlocal filetype=yaml.ansible
au BufRead,BufNewFile */roles/*.yml,*/roles/*.yaml setlocal filetype=yaml.ansible
au BufRead,BufNewFile */tasks/*.yml,*/tasks/*.yaml setlocal filetype=yaml.ansible
au BufRead,BufNewFile */handlers/*.yml,*/handlers/*.yaml setlocal filetype=yaml.ansible
au BufRead,BufNewFile *ansible*/*.yml,*ansible*/*.yaml setlocal filetype=yaml.ansible
augroup END
endif
if executable('rg')
set grepprg=rg\ --vimgrep\ --smart-case
set grepformat=%f:%l:%c:%m
endif
packadd! editorconfig
nnoremap <silent> <leader>gl :call ToggleGitLens()<CR>
g:gitgutter_sign_priority = 9
g:op_surround_maps = [
\ {'map': 'sa(', 'open_delim': '(', 'close_delim': ')', 'action': 'append'},
\ {'map': 'sd(', 'open_delim': '(', 'close_delim': ')', 'action': 'delete'},
\ {'map': 'sa[', 'open_delim': '[', 'close_delim': ']', 'action': 'append'},
\ {'map': 'sd[', 'open_delim': '[', 'close_delim': ']', 'action': 'delete'},
\ {'map': 'sa{', 'open_delim': '{', 'close_delim': '}', 'action': 'append'},
\ {'map': 'sd{', 'open_delim': '{', 'close_delim': '}', 'action': 'delete'},
\ {'map': 'sa"', 'open_delim': '"', 'close_delim': '"', 'action': 'append'},
\ {'map': 'sd"', 'open_delim': '"', 'close_delim': '"', 'action': 'delete'},
\ {'map': "sa'", 'open_delim': "'", 'close_delim': "'", 'action': 'append'},
\ {'map': "sd'", 'open_delim': "'", 'close_delim': "'", 'action': 'delete'},
\ {'map': 'sa`', 'open_delim': '`', 'close_delim': '`', 'action': 'append'},
\ {'map': 'sd`', 'open_delim': '`', 'close_delim': '`', 'action': 'delete'},
\ ]
nnoremap <silent> <leader>u :UndotreeToggle<CR>
xnoremap <silent> <leader>r :ReplicaSendLines<CR>
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
g:vimwiki_list = [{'path': '~/wiki/', 'syntax': 'markdown', 'ext': '.md'}]
g:vimwiki_autowriteall = 0
g:vimwiki_global_ext = 0
g:vim_markdown_conceal = 3
g:vim_markdown_edit_url_in = 'tab'
for i in ['follow_anchor', 'conceal_code_blocks', 'math',
'toml_frontmatter', 'frontmatter', 'strikethrough']
g:['vim_markdown_' .. i] = 1
endfor
I have implemented (broken) LSP semantic highlighting in Builder.
Currently, Builder's will highlight any text (except for in comments and strings) that matches the name of a symbol that is provided by the LSP, which can cause problems.
This is in addition to GtkSourceView's regex based highlighting, which is limited at best, if not problematic.
https://github.com/tachyons/ruby-lsp-refactor
ruby-lsp plugin to perform common refactoring in the editor. Inspired by vim ruby refactor plugin