racket.vim (2600B)
1 " Vim filetype plugin 2 " Language: Racket 3 " Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com> 4 " Previous Maintainer: Will Langstroth <will@langstroth.com> 5 " URL: https://github.com/benknoble/vim-racket 6 " Last Change: 2025 Aug 09 7 8 if exists("b:did_ftplugin") 9 finish 10 endif 11 let b:did_ftplugin = 1 12 13 let s:cpo_save = &cpo 14 set cpo&vim 15 16 " quick hack to allow adding values 17 setlocal iskeyword=@,!,#-',*-:,<-Z,a-z,~,_,94 18 19 setlocal shiftwidth=2 softtabstop=2 20 21 " Enable auto begin new comment line when continuing from an old comment line 22 setlocal comments=:;;;;,:;;;,:;;,:; 23 setlocal formatoptions+=r 24 25 setlocal commentstring=;;\ %s 26 27 setlocal formatprg=raco\ fmt 28 29 " Undo our settings when the filetype changes away from Racket 30 " (this should be amended if settings/mappings are added above!) 31 let b:undo_ftplugin = 32 \ "setlocal iskeyword< shiftwidth< softtabstop< comments< formatoptions< formatprg<" 33 \. " | setlocal commentstring<" 34 35 if !exists("no_plugin_maps") && !exists("no_racket_maps") 36 " Simply setting keywordprg like this works: 37 " setlocal keywordprg=raco\ docs 38 " but then vim says: 39 " "press ENTER or type a command to continue" 40 " We avoid the annoyance of having to hit enter by remapping K directly. 41 function s:RacketDoc(word) abort 42 execute 'silent !raco docs --' shellescape(a:word, v:true) 43 redraw! 44 endfunction 45 nnoremap <buffer> <Plug>RacketDoc :call <SID>RacketDoc(expand('<cword>'))<CR> 46 nmap <buffer> K <Plug>RacketDoc 47 48 " For the visual mode K mapping, it's slightly more convoluted to get the 49 " selected text: 50 function! s:Racket_visual_doc() 51 try 52 let l:old_a = @a 53 normal! gv"ay 54 call system("raco docs '". @a . "'") 55 redraw! 56 return @a 57 finally 58 let @a = l:old_a 59 endtry 60 endfunction 61 62 xnoremap <buffer> <Plug>RacketDoc :call <SID>Racket_visual_doc()<cr> 63 xmap <buffer> K <Plug>RacketDoc 64 65 let b:undo_ftplugin .= 66 \ " | silent! execute 'nunmap <buffer> K'" 67 \. " | silent! execute 'xunmap <buffer> K'" 68 endif 69 70 if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") 71 let b:browsefilter = 72 \ "Racket Source Files (*.rkt, *.rktl)\t*.rkt;*.rktl\n" 73 if has("win32") 74 let b:browsefilter .= "All Files (*.*)\t*\n" 75 else 76 let b:browsefilter .= "All Files (*)\t*\n" 77 endif 78 let b:undo_ftplugin .= " | unlet! b:browsefilter" 79 endif 80 81 if exists("loaded_matchit") && !exists("b:match_words") 82 let b:match_words = '#|:|#' 83 let b:undo_ftplugin .= " | unlet! b:match_words" 84 endif 85 86 let &cpo = s:cpo_save 87 unlet s:cpo_save