xref: /vim-8.2.3635/runtime/ftplugin/rust.vim (revision 3c2881dc)
1*3c2881dcSBram Moolenaar" Language:     Rust
2*3c2881dcSBram Moolenaar" Description:  Vim ftplugin for Rust
3*3c2881dcSBram Moolenaar" Maintainer:   Chris Morgan <[email protected]>
4*3c2881dcSBram Moolenaar" Maintainer:   Kevin Ballard <[email protected]>
5*3c2881dcSBram Moolenaar" Last Change:  June 08, 2016
6*3c2881dcSBram Moolenaar" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
7*3c2881dcSBram Moolenaar
8*3c2881dcSBram Moolenaarif exists("b:did_ftplugin")
9*3c2881dcSBram Moolenaar	finish
10*3c2881dcSBram Moolenaarendif
11*3c2881dcSBram Moolenaarlet b:did_ftplugin = 1
12*3c2881dcSBram Moolenaar
13*3c2881dcSBram Moolenaarlet s:save_cpo = &cpo
14*3c2881dcSBram Moolenaarset cpo&vim
15*3c2881dcSBram Moolenaar
16*3c2881dcSBram Moolenaaraugroup rust.vim
17*3c2881dcSBram Moolenaarautocmd!
18*3c2881dcSBram Moolenaar
19*3c2881dcSBram Moolenaar" Variables {{{1
20*3c2881dcSBram Moolenaar
21*3c2881dcSBram Moolenaar" The rust source code at present seems to typically omit a leader on /*!
22*3c2881dcSBram Moolenaar" comments, so we'll use that as our default, but make it easy to switch.
23*3c2881dcSBram Moolenaar" This does not affect indentation at all (I tested it with and without
24*3c2881dcSBram Moolenaar" leader), merely whether a leader is inserted by default or not.
25*3c2881dcSBram Moolenaarif exists("g:rust_bang_comment_leader") && g:rust_bang_comment_leader != 0
26*3c2881dcSBram Moolenaar	" Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why,
27*3c2881dcSBram Moolenaar	" but without it, */ gets indented one space even if there were no
28*3c2881dcSBram Moolenaar	" leaders. I'm fairly sure that's a Vim bug.
29*3c2881dcSBram Moolenaar	setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,://
30*3c2881dcSBram Moolenaarelse
31*3c2881dcSBram Moolenaar	setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
32*3c2881dcSBram Moolenaarendif
33*3c2881dcSBram Moolenaarsetlocal commentstring=//%s
34*3c2881dcSBram Moolenaarsetlocal formatoptions-=t formatoptions+=croqnl
35*3c2881dcSBram Moolenaar" j was only added in 7.3.541, so stop complaints about its nonexistence
36*3c2881dcSBram Moolenaarsilent! setlocal formatoptions+=j
37*3c2881dcSBram Moolenaar
38*3c2881dcSBram Moolenaar" smartindent will be overridden by indentexpr if filetype indent is on, but
39*3c2881dcSBram Moolenaar" otherwise it's better than nothing.
40*3c2881dcSBram Moolenaarsetlocal smartindent nocindent
41*3c2881dcSBram Moolenaar
42*3c2881dcSBram Moolenaarif !exists("g:rust_recommended_style") || g:rust_recommended_style != 0
43*3c2881dcSBram Moolenaar	setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab
44*3c2881dcSBram Moolenaar	setlocal textwidth=99
45*3c2881dcSBram Moolenaarendif
46*3c2881dcSBram Moolenaar
47*3c2881dcSBram Moolenaar" This includeexpr isn't perfect, but it's a good start
48*3c2881dcSBram Moolenaarsetlocal includeexpr=substitute(v:fname,'::','/','g')
49*3c2881dcSBram Moolenaar
50*3c2881dcSBram Moolenaarsetlocal suffixesadd=.rs
51*3c2881dcSBram Moolenaar
52*3c2881dcSBram Moolenaarif exists("g:ftplugin_rust_source_path")
53*3c2881dcSBram Moolenaar    let &l:path=g:ftplugin_rust_source_path . ',' . &l:path
54*3c2881dcSBram Moolenaarendif
55*3c2881dcSBram Moolenaar
56*3c2881dcSBram Moolenaarif exists("g:loaded_delimitMate")
57*3c2881dcSBram Moolenaar	if exists("b:delimitMate_excluded_regions")
58*3c2881dcSBram Moolenaar		let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions
59*3c2881dcSBram Moolenaar	endif
60*3c2881dcSBram Moolenaar
61*3c2881dcSBram Moolenaar	let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
62*3c2881dcSBram Moolenaar
63*3c2881dcSBram Moolenaar	" For this buffer, when delimitMate issues the `User delimitMate_map`
64*3c2881dcSBram Moolenaar	" event in the autocommand system, add the above-defined extra excluded
65*3c2881dcSBram Moolenaar	" regions to delimitMate's state, if they have not already been added.
66*3c2881dcSBram Moolenaar	autocmd User <buffer>
67*3c2881dcSBram Moolenaar		\ if expand('<afile>') ==# 'delimitMate_map' && match(
68*3c2881dcSBram Moolenaar		\     delimitMate#Get("excluded_regions"),
69*3c2881dcSBram Moolenaar		\     s:delimitMate_extra_excluded_regions) == -1
70*3c2881dcSBram Moolenaar		\|  let b:delimitMate_excluded_regions =
71*3c2881dcSBram Moolenaar		\       delimitMate#Get("excluded_regions")
72*3c2881dcSBram Moolenaar		\       . s:delimitMate_extra_excluded_regions
73*3c2881dcSBram Moolenaar		\|endif
74*3c2881dcSBram Moolenaar
75*3c2881dcSBram Moolenaar	" For this buffer, when delimitMate issues the `User delimitMate_unmap`
76*3c2881dcSBram Moolenaar	" event in the autocommand system, delete the above-defined extra excluded
77*3c2881dcSBram Moolenaar	" regions from delimitMate's state (the deletion being idempotent and
78*3c2881dcSBram Moolenaar	" having no effect if the extra excluded regions are not present in the
79*3c2881dcSBram Moolenaar	" targeted part of delimitMate's state).
80*3c2881dcSBram Moolenaar	autocmd User <buffer>
81*3c2881dcSBram Moolenaar		\ if expand('<afile>') ==# 'delimitMate_unmap'
82*3c2881dcSBram Moolenaar		\|  let b:delimitMate_excluded_regions = substitute(
83*3c2881dcSBram Moolenaar		\       delimitMate#Get("excluded_regions"),
84*3c2881dcSBram Moolenaar		\       '\C\V' . s:delimitMate_extra_excluded_regions,
85*3c2881dcSBram Moolenaar		\       '', 'g')
86*3c2881dcSBram Moolenaar		\|endif
87*3c2881dcSBram Moolenaarendif
88*3c2881dcSBram Moolenaar
89*3c2881dcSBram Moolenaarif has("folding") && exists('g:rust_fold') && g:rust_fold != 0
90*3c2881dcSBram Moolenaar	let b:rust_set_foldmethod=1
91*3c2881dcSBram Moolenaar	setlocal foldmethod=syntax
92*3c2881dcSBram Moolenaar	if g:rust_fold == 2
93*3c2881dcSBram Moolenaar		setlocal foldlevel<
94*3c2881dcSBram Moolenaar	else
95*3c2881dcSBram Moolenaar		setlocal foldlevel=99
96*3c2881dcSBram Moolenaar	endif
97*3c2881dcSBram Moolenaarendif
98*3c2881dcSBram Moolenaar
99*3c2881dcSBram Moolenaarif has('conceal') && exists('g:rust_conceal') && g:rust_conceal != 0
100*3c2881dcSBram Moolenaar	let b:rust_set_conceallevel=1
101*3c2881dcSBram Moolenaar	setlocal conceallevel=2
102*3c2881dcSBram Moolenaarendif
103*3c2881dcSBram Moolenaar
104*3c2881dcSBram Moolenaar" Motion Commands {{{1
105*3c2881dcSBram Moolenaar
106*3c2881dcSBram Moolenaar" Bind motion commands to support hanging indents
107*3c2881dcSBram Moolenaarnnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR>
108*3c2881dcSBram Moolenaarnnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR>
109*3c2881dcSBram Moolenaarxnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR>
110*3c2881dcSBram Moolenaarxnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
111*3c2881dcSBram Moolenaaronoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
112*3c2881dcSBram Moolenaaronoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
113*3c2881dcSBram Moolenaar
114*3c2881dcSBram Moolenaar" Commands {{{1
115*3c2881dcSBram Moolenaar
116*3c2881dcSBram Moolenaar" See |:RustRun| for docs
117*3c2881dcSBram Moolenaarcommand! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(<bang>0, <q-args>)
118*3c2881dcSBram Moolenaar
119*3c2881dcSBram Moolenaar" See |:RustExpand| for docs
120*3c2881dcSBram Moolenaarcommand! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(<bang>0, <q-args>)
121*3c2881dcSBram Moolenaar
122*3c2881dcSBram Moolenaar" See |:RustEmitIr| for docs
123*3c2881dcSBram Moolenaarcommand! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", <q-args>)
124*3c2881dcSBram Moolenaar
125*3c2881dcSBram Moolenaar" See |:RustEmitAsm| for docs
126*3c2881dcSBram Moolenaarcommand! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>)
127*3c2881dcSBram Moolenaar
128*3c2881dcSBram Moolenaar" See |:RustPlay| for docs
129*3c2881dcSBram Moolenaarcommand! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
130*3c2881dcSBram Moolenaar
131*3c2881dcSBram Moolenaar" See |:RustFmt| for docs
132*3c2881dcSBram Moolenaarcommand! -buffer RustFmt call rustfmt#Format()
133*3c2881dcSBram Moolenaar
134*3c2881dcSBram Moolenaar" See |:RustFmtRange| for docs
135*3c2881dcSBram Moolenaarcommand! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
136*3c2881dcSBram Moolenaar
137*3c2881dcSBram Moolenaar" Mappings {{{1
138*3c2881dcSBram Moolenaar
139*3c2881dcSBram Moolenaar" Bind ⌘R in MacVim to :RustRun
140*3c2881dcSBram Moolenaarnnoremap <silent> <buffer> <D-r> :RustRun<CR>
141*3c2881dcSBram Moolenaar" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args
142*3c2881dcSBram Moolenaarnnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR>
143*3c2881dcSBram Moolenaar
144*3c2881dcSBram Moolenaarif !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args")
145*3c2881dcSBram Moolenaar	let b:rust_last_rustc_args = []
146*3c2881dcSBram Moolenaar	let b:rust_last_args = []
147*3c2881dcSBram Moolenaarendif
148*3c2881dcSBram Moolenaar
149*3c2881dcSBram Moolenaar" Cleanup {{{1
150*3c2881dcSBram Moolenaar
151*3c2881dcSBram Moolenaarlet b:undo_ftplugin = "
152*3c2881dcSBram Moolenaar		\ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd<
153*3c2881dcSBram Moolenaar		\|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<
154*3c2881dcSBram Moolenaar		\|if exists('b:rust_original_delimitMate_excluded_regions')
155*3c2881dcSBram Moolenaar		  \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions
156*3c2881dcSBram Moolenaar		  \|unlet b:rust_original_delimitMate_excluded_regions
157*3c2881dcSBram Moolenaar		\|else
158*3c2881dcSBram Moolenaar		  \|unlet! b:delimitMate_excluded_regions
159*3c2881dcSBram Moolenaar		\|endif
160*3c2881dcSBram Moolenaar		\|if exists('b:rust_set_foldmethod')
161*3c2881dcSBram Moolenaar		  \|setlocal foldmethod< foldlevel<
162*3c2881dcSBram Moolenaar		  \|unlet b:rust_set_foldmethod
163*3c2881dcSBram Moolenaar		\|endif
164*3c2881dcSBram Moolenaar		\|if exists('b:rust_set_conceallevel')
165*3c2881dcSBram Moolenaar		  \|setlocal conceallevel<
166*3c2881dcSBram Moolenaar		  \|unlet b:rust_set_conceallevel
167*3c2881dcSBram Moolenaar		\|endif
168*3c2881dcSBram Moolenaar		\|unlet! b:rust_last_rustc_args b:rust_last_args
169*3c2881dcSBram Moolenaar		\|delcommand RustRun
170*3c2881dcSBram Moolenaar		\|delcommand RustExpand
171*3c2881dcSBram Moolenaar		\|delcommand RustEmitIr
172*3c2881dcSBram Moolenaar		\|delcommand RustEmitAsm
173*3c2881dcSBram Moolenaar		\|delcommand RustPlay
174*3c2881dcSBram Moolenaar		\|nunmap <buffer> <D-r>
175*3c2881dcSBram Moolenaar		\|nunmap <buffer> <D-R>
176*3c2881dcSBram Moolenaar		\|nunmap <buffer> [[
177*3c2881dcSBram Moolenaar		\|nunmap <buffer> ]]
178*3c2881dcSBram Moolenaar		\|xunmap <buffer> [[
179*3c2881dcSBram Moolenaar		\|xunmap <buffer> ]]
180*3c2881dcSBram Moolenaar		\|ounmap <buffer> [[
181*3c2881dcSBram Moolenaar		\|ounmap <buffer> ]]
182*3c2881dcSBram Moolenaar		\|set matchpairs-=<:>
183*3c2881dcSBram Moolenaar		\"
184*3c2881dcSBram Moolenaar
185*3c2881dcSBram Moolenaar" }}}1
186*3c2881dcSBram Moolenaar
187*3c2881dcSBram Moolenaar" Code formatting on save
188*3c2881dcSBram Moolenaarif get(g:, "rustfmt_autosave", 0)
189*3c2881dcSBram Moolenaar	autocmd BufWritePre *.rs silent! call rustfmt#Format()
190*3c2881dcSBram Moolenaarendif
191*3c2881dcSBram Moolenaar
192*3c2881dcSBram Moolenaaraugroup END
193*3c2881dcSBram Moolenaar
194*3c2881dcSBram Moolenaarlet &cpo = s:save_cpo
195*3c2881dcSBram Moolenaarunlet s:save_cpo
196*3c2881dcSBram Moolenaar
197*3c2881dcSBram Moolenaar" vim: set noet sw=8 ts=8:
198