| 
									
										
										
										
											2024-06-03 20:40:45 +02:00
										 |  |  | " Language:	Rust | 
					
						
							|  |  |  | " Description:	Vim ftplugin for Rust | 
					
						
							|  |  |  | " Maintainer:	Chris Morgan <me@chrismorgan.info> | 
					
						
							|  |  |  | " Last Change:	2024 Mar 17 | 
					
						
							|  |  |  | "		2024 May 23 by Riley Bruins <ribru17@gmail.com ('commentstring') | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " For bugs, patches and license go to https://github.com/rust-lang/rust.vim | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | if exists("b:did_ftplugin") | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |     finish | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | let b:did_ftplugin = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " vint: -ProhibitAbbreviationOption | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | let s:save_cpo = &cpo | 
					
						
							|  |  |  | set cpo&vim | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " vint: +ProhibitAbbreviationOption | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if get(b:, 'current_compiler', '') ==# '' | 
					
						
							|  |  |  |     if strlen(findfile('Cargo.toml', '.;')) > 0 | 
					
						
							|  |  |  |         compiler cargo | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         compiler rustc | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Variables {{{1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " The rust source code at present seems to typically omit a leader on /*! | 
					
						
							|  |  |  | " comments, so we'll use that as our default, but make it easy to switch. | 
					
						
							|  |  |  | " This does not affect indentation at all (I tested it with and without | 
					
						
							|  |  |  | " leader), merely whether a leader is inserted by default or not. | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | if get(g:, 'rust_bang_comment_leader', 0) | 
					
						
							|  |  |  |     " Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why, | 
					
						
							|  |  |  |     " but without it, */ gets indented one space even if there were no | 
					
						
							|  |  |  |     " leaders. I'm fairly sure that's a Vim bug. | 
					
						
							|  |  |  |     setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,:// | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | else | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |     setlocal comments=s0:/*!,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,:// | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							| 
									
										
										
										
											2024-06-03 20:40:45 +02:00
										 |  |  | setlocal commentstring=//\ %s | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | setlocal formatoptions-=t formatoptions+=croqnl | 
					
						
							|  |  |  | " j was only added in 7.3.541, so stop complaints about its nonexistence | 
					
						
							|  |  |  | silent! setlocal formatoptions+=j | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " smartindent will be overridden by indentexpr if filetype indent is on, but | 
					
						
							|  |  |  | " otherwise it's better than nothing. | 
					
						
							|  |  |  | setlocal smartindent nocindent | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | if get(g:, 'rust_recommended_style', 1) | 
					
						
							|  |  |  |     let b:rust_set_style = 1 | 
					
						
							|  |  |  |     setlocal shiftwidth=4 softtabstop=4 expandtab | 
					
						
							|  |  |  |     setlocal textwidth=99 | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | setlocal include=\\v^\\s*(pub\\s+)?use\\s+\\zs(\\f\|:)+ | 
					
						
							|  |  |  | setlocal includeexpr=rust#IncludeExpr(v:fname) | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | setlocal suffixesadd=.rs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if exists("g:ftplugin_rust_source_path") | 
					
						
							|  |  |  |     let &l:path=g:ftplugin_rust_source_path . ',' . &l:path | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if exists("g:loaded_delimitMate") | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |     if exists("b:delimitMate_excluded_regions") | 
					
						
							|  |  |  |         let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     augroup rust.vim.DelimitMate | 
					
						
							|  |  |  |         autocmd! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         autocmd User delimitMate_map   :call rust#delimitmate#onMap() | 
					
						
							|  |  |  |         autocmd User delimitMate_unmap :call rust#delimitmate#onUnmap() | 
					
						
							|  |  |  |     augroup END | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " Integration with auto-pairs (https://github.com/jiangmiao/auto-pairs) | 
					
						
							|  |  |  | if exists("g:AutoPairsLoaded") && !get(g:, 'rust_keep_autopairs_default', 0) | 
					
						
							|  |  |  |     let b:AutoPairs = {'(':')', '[':']', '{':'}','"':'"', '`':'`'} | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | if has("folding") && get(g:, 'rust_fold', 0) | 
					
						
							|  |  |  |     let b:rust_set_foldmethod=1 | 
					
						
							|  |  |  |     setlocal foldmethod=syntax | 
					
						
							|  |  |  |     if g:rust_fold == 2 | 
					
						
							|  |  |  |         setlocal foldlevel< | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         setlocal foldlevel=99 | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | if has('conceal') && get(g:, 'rust_conceal', 0) | 
					
						
							|  |  |  |     let b:rust_set_conceallevel=1 | 
					
						
							|  |  |  |     setlocal conceallevel=2 | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " Motion Commands {{{1 | 
					
						
							| 
									
										
										
										
											2024-03-18 20:38:09 +02:00
										 |  |  | if !exists("g:no_plugin_maps") && !exists("g:no_rust_maps") | 
					
						
							|  |  |  |     " Bind motion commands to support hanging indents | 
					
						
							|  |  |  |     nnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR> | 
					
						
							|  |  |  |     nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR> | 
					
						
							|  |  |  |     xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR> | 
					
						
							|  |  |  |     xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR> | 
					
						
							|  |  |  |     onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR> | 
					
						
							|  |  |  |     onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR> | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Commands {{{1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustRun| for docs | 
					
						
							|  |  |  | command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(<bang>0, <q-args>) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustExpand| for docs | 
					
						
							|  |  |  | command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(<bang>0, <q-args>) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustEmitIr| for docs | 
					
						
							|  |  |  | command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", <q-args>) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustEmitAsm| for docs | 
					
						
							|  |  |  | command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustPlay| for docs | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | command! -range=% -buffer RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>) | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | " See |:RustFmt| for docs | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | command! -bar -buffer RustFmt call rustfmt#Format() | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | " See |:RustFmtRange| for docs | 
					
						
							|  |  |  | command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " See |:RustInfo| for docs | 
					
						
							|  |  |  | command! -bar -buffer RustInfo call rust#debugging#Info() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustInfoToClipboard| for docs | 
					
						
							|  |  |  | command! -bar -buffer RustInfoToClipboard call rust#debugging#InfoToClipboard() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " See |:RustInfoToFile| for docs | 
					
						
							|  |  |  | command! -bar -nargs=1 -buffer RustInfoToFile call rust#debugging#InfoToFile(<f-args>) | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " See |:RustTest| for docs | 
					
						
							|  |  |  | command! -buffer -nargs=* -count -bang RustTest call rust#Test(<q-mods>, <count>, <bang>0, <q-args>) | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args") | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |     let b:rust_last_rustc_args = [] | 
					
						
							|  |  |  |     let b:rust_last_args = [] | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " Cleanup {{{1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let b:undo_ftplugin = "
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |             \ setlocal formatoptions< comments< commentstring< include< includeexpr< suffixesadd< | 
					
						
							|  |  |  |             \|if exists('b:rust_set_style') | 
					
						
							|  |  |  |                 \|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth< | 
					
						
							|  |  |  |                 \|endif | 
					
						
							|  |  |  |                 \|if exists('b:rust_original_delimitMate_excluded_regions') | 
					
						
							|  |  |  |                     \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions | 
					
						
							|  |  |  |                     \|unlet b:rust_original_delimitMate_excluded_regions | 
					
						
							|  |  |  |                     \|else | 
					
						
							|  |  |  |                         \|unlet! b:delimitMate_excluded_regions | 
					
						
							|  |  |  |                         \|endif | 
					
						
							|  |  |  |                         \|if exists('b:rust_set_foldmethod') | 
					
						
							|  |  |  |                             \|setlocal foldmethod< foldlevel< | 
					
						
							|  |  |  |                             \|unlet b:rust_set_foldmethod | 
					
						
							|  |  |  |                             \|endif | 
					
						
							|  |  |  |                             \|if exists('b:rust_set_conceallevel') | 
					
						
							|  |  |  |                                 \|setlocal conceallevel< | 
					
						
							|  |  |  |                                 \|unlet b:rust_set_conceallevel | 
					
						
							|  |  |  |                                 \|endif | 
					
						
							|  |  |  |                                 \|unlet! b:rust_last_rustc_args b:rust_last_args | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustRun | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustExpand | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustEmitIr | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustEmitAsm | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustPlay | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustFmt | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustFmtRange | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustInfo | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustInfoToClipboard | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustInfoToFile | 
					
						
							|  |  |  |                                 \|delcommand -buffer RustTest | 
					
						
							| 
									
										
										
										
											2024-03-18 20:38:09 +02:00
										 |  |  |                                 \|silent! nunmap <buffer> [[ | 
					
						
							|  |  |  |                                 \|silent! nunmap <buffer> ]] | 
					
						
							|  |  |  |                                 \|silent! xunmap <buffer> [[ | 
					
						
							|  |  |  |                                 \|silent! xunmap <buffer> ]] | 
					
						
							|  |  |  |                                 \|silent! ounmap <buffer> [[ | 
					
						
							|  |  |  |                                 \|silent! ounmap <buffer> ]] | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  |                                 \|setlocal matchpairs-=<:> | 
					
						
							|  |  |  |                                 \|unlet b:match_skip | 
					
						
							|  |  |  |                                 \" | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | " }}}1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " Code formatting on save | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | augroup rust.vim.PreWrite | 
					
						
							|  |  |  |     autocmd! | 
					
						
							|  |  |  |     autocmd BufWritePre *.rs silent! call rustfmt#PreWrite() | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | augroup END | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | setlocal matchpairs+=<:> | 
					
						
							|  |  |  | " For matchit.vim (rustArrow stops `Fn() -> X` messing things up) | 
					
						
							|  |  |  | let b:match_skip = 's:comment\|string\|rustCharacter\|rustArrow' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | command! -buffer -nargs=+ Cargo call cargo#cmd(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cbuild call cargo#build(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Ccheck call cargo#check(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cclean call cargo#clean(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cdoc call cargo#doc(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=+ Cnew call cargo#new(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cinit call cargo#init(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Crun call cargo#run(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Ctest call cargo#test(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cbench call cargo#bench(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cupdate call cargo#update(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Csearch  call cargo#search(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cpublish call cargo#publish(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cinstall call cargo#install(<q-args>) | 
					
						
							|  |  |  | command! -buffer -nargs=* Cruntarget call cargo#runtarget(<q-args>) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let b:undo_ftplugin .= ' | 
					
						
							|  |  |  |             \|delcommand -buffer Cargo | 
					
						
							|  |  |  |             \|delcommand -buffer Cbuild | 
					
						
							|  |  |  |             \|delcommand -buffer Ccheck | 
					
						
							|  |  |  |             \|delcommand -buffer Cclean | 
					
						
							|  |  |  |             \|delcommand -buffer Cdoc | 
					
						
							|  |  |  |             \|delcommand -buffer Cnew | 
					
						
							|  |  |  |             \|delcommand -buffer Cinit | 
					
						
							|  |  |  |             \|delcommand -buffer Crun | 
					
						
							|  |  |  |             \|delcommand -buffer Ctest | 
					
						
							|  |  |  |             \|delcommand -buffer Cbench | 
					
						
							|  |  |  |             \|delcommand -buffer Cupdate | 
					
						
							|  |  |  |             \|delcommand -buffer Csearch | 
					
						
							|  |  |  |             \|delcommand -buffer Cpublish | 
					
						
							|  |  |  |             \|delcommand -buffer Cinstall | 
					
						
							|  |  |  |             \|delcommand -buffer Cruntarget' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " vint: -ProhibitAbbreviationOption | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | let &cpo = s:save_cpo | 
					
						
							|  |  |  | unlet s:save_cpo | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " vint: +ProhibitAbbreviationOption | 
					
						
							| 
									
										
										
										
											2017-03-21 19:18:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 13:23:38 -05:00
										 |  |  | " vim: set et sw=4 sts=4 ts=8: |