2013-07-10 01:30:32 +10:00
|
|
|
" Language: Rust
|
2014-05-27 15:00:22 -07:00
|
|
|
" Description: Vim syntax file for Rust
|
2013-07-10 01:30:32 +10:00
|
|
|
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
2014-05-27 15:00:22 -07:00
|
|
|
" Maintainer: Kevin Ballard <kevin@sb.org>
|
2014-07-07 22:19:59 -07:00
|
|
|
" Last Change: Jul 07, 2014
|
2013-07-10 01:30:32 +10:00
|
|
|
|
|
|
|
if exists("b:did_ftplugin")
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
let b:did_ftplugin = 1
|
|
|
|
|
2014-05-27 15:00:22 -07:00
|
|
|
let s:save_cpo = &cpo
|
|
|
|
set cpo&vim
|
|
|
|
|
|
|
|
" Variables {{{1
|
|
|
|
|
2013-07-10 09:56:08 +10:00
|
|
|
" 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.
|
|
|
|
if exists("g:rust_bang_comment_leader") && g:rust_bang_comment_leader == 1
|
|
|
|
" 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:*/,:///,://!,://
|
|
|
|
else
|
|
|
|
setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
|
|
|
|
endif
|
2013-07-10 01:30:32 +10:00
|
|
|
setlocal commentstring=//%s
|
2013-09-04 13:33:40 +10:00
|
|
|
setlocal formatoptions-=t formatoptions+=croqnl
|
|
|
|
" j was only added in 7.3.541, so stop complaints about its nonexistence
|
|
|
|
silent! setlocal formatoptions+=j
|
2013-07-10 01:30:32 +10:00
|
|
|
|
2014-07-04 14:09:47 -07:00
|
|
|
" smartindent will be overridden by indentexpr if filetype indent is on, but
|
|
|
|
" otherwise it's better than nothing.
|
|
|
|
setlocal smartindent nocindent
|
|
|
|
|
2014-07-06 01:09:03 -07:00
|
|
|
setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab
|
|
|
|
|
2014-07-07 22:19:59 -07:00
|
|
|
setlocal textwidth=99
|
2014-07-04 14:09:47 -07:00
|
|
|
|
2013-07-10 01:30:32 +10:00
|
|
|
" This includeexpr isn't perfect, but it's a good start
|
|
|
|
setlocal includeexpr=substitute(v:fname,'::','/','g')
|
|
|
|
|
|
|
|
" NOT adding .rc as it's being phased out (0.7)
|
|
|
|
setlocal suffixesadd=.rs
|
|
|
|
|
|
|
|
if exists("g:ftplugin_rust_source_path")
|
|
|
|
let &l:path=g:ftplugin_rust_source_path . ',' . &l:path
|
|
|
|
endif
|
|
|
|
|
2013-07-12 15:30:51 +10:00
|
|
|
if exists("g:loaded_delimitMate")
|
|
|
|
if exists("b:delimitMate_excluded_regions")
|
|
|
|
let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions
|
|
|
|
endif
|
|
|
|
let b:delimitMate_excluded_regions = delimitMate#Get("excluded_regions") . ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
|
|
|
|
endif
|
|
|
|
|
2014-08-13 16:52:26 -07:00
|
|
|
if has('conceal') && exists('g:rust_conceal')
|
|
|
|
let b:rust_set_conceallevel=1
|
|
|
|
setlocal conceallevel=2
|
|
|
|
endif
|
|
|
|
|
2014-05-27 15:00:22 -07:00
|
|
|
" Motion Commands {{{1
|
|
|
|
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
" Bind motion commands to support hanging indents
|
2014-05-27 15:00:22 -07:00
|
|
|
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>
|
|
|
|
|
|
|
|
" Commands {{{1
|
|
|
|
|
2014-05-30 00:06:52 -07:00
|
|
|
" See |:RustRun| for docs
|
2014-05-29 23:43:52 -07:00
|
|
|
command! -nargs=* -complete=file -bang -bar -buffer RustRun call rust#Run(<bang>0, [<f-args>])
|
2014-05-27 15:00:22 -07:00
|
|
|
|
2014-05-30 00:06:52 -07:00
|
|
|
" See |:RustExpand| for docs
|
2014-05-29 23:43:52 -07:00
|
|
|
command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -bar -buffer RustExpand call rust#Expand(<bang>0, [<f-args>])
|
2014-05-27 15:00:22 -07:00
|
|
|
|
2014-05-30 16:35:10 -07:00
|
|
|
" See |:RustEmitIr| for docs
|
|
|
|
command! -nargs=* -bar -buffer RustEmitIr call rust#Emit("ir", [<f-args>])
|
|
|
|
|
|
|
|
" See |:RustEmitAsm| for docs
|
|
|
|
command! -nargs=* -bar -buffer RustEmitAsm call rust#Emit("asm", [<f-args>])
|
|
|
|
|
2014-05-27 15:00:22 -07:00
|
|
|
" Mappings {{{1
|
|
|
|
|
2014-05-29 23:43:52 -07:00
|
|
|
" Bind ⌘R in MacVim to :RustRun
|
|
|
|
nnoremap <silent> <buffer> <D-r> :RustRun<CR>
|
|
|
|
" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args
|
|
|
|
nnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR>
|
2014-05-27 15:00:22 -07:00
|
|
|
|
|
|
|
if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args")
|
|
|
|
let b:rust_last_rustc_args = []
|
|
|
|
let b:rust_last_args = []
|
|
|
|
endif
|
|
|
|
|
|
|
|
" Cleanup {{{1
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
|
|
|
|
let b:undo_ftplugin = "
|
2014-07-06 01:09:03 -07:00
|
|
|
\ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd<
|
|
|
|
\|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
\|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
|
2014-05-27 15:00:22 -07:00
|
|
|
\|else
|
|
|
|
\|unlet! b:delimitMate_excluded_regions
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
\|endif
|
2014-08-13 16:52:26 -07:00
|
|
|
\|if exists('b:rust_set_conceallevel')
|
|
|
|
\|setlocal conceallevel<
|
|
|
|
\|unlet b:rust_set_conceallevel
|
|
|
|
\|endif
|
2014-05-27 15:00:22 -07:00
|
|
|
\|unlet! b:rust_last_rustc_args b:rust_last_args
|
2014-05-29 23:43:52 -07:00
|
|
|
\|delcommand RustRun
|
|
|
|
\|delcommand RustExpand
|
2014-05-30 16:35:10 -07:00
|
|
|
\|delcommand RustEmitIr
|
|
|
|
\|delcommand RustEmitAsm
|
2014-05-27 15:00:22 -07:00
|
|
|
\|nunmap <buffer> <D-r>
|
|
|
|
\|nunmap <buffer> <D-R>
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
\|nunmap <buffer> [[
|
|
|
|
\|nunmap <buffer> ]]
|
|
|
|
\|xunmap <buffer> [[
|
|
|
|
\|xunmap <buffer> ]]
|
|
|
|
\|ounmap <buffer> [[
|
|
|
|
\|ounmap <buffer> ]]
|
|
|
|
\"
|
|
|
|
|
2014-05-27 15:00:22 -07:00
|
|
|
" }}}1
|
Fix Vim section movements for standard Rust style.
(Expressed another way: make `[[` et al. work with the curly brace at
the end of a line as is standard Rust style, not just at the start is it
is by default in Vim, from K&R style.)
This came out of #11492, where a simpler but less effective technique
was initially proposed; some discussion of the techniques, ways and
means can be found there.
There are still a few caveats:
- Operator-pending mode behaves differently to the standard behaviour:
if inside curly braces, it should delete up to and including the
closing of the outermost curly brace (that doesn't seem to me
consistent with documented behaviour, but it's what it does). Actual
behaviour (the more logical and consistent, in my opinion): up to the
start of the next outermost curly brace.
- With folding enabled (`set fdm=syntax`), `[[` and `]]` do not behave
as they should: the default behaviour treats an entire closed fold as
one line for these purposes while this code does not (I explicitly
`set nofoldenable` in the function—the side-effects are worse with
folds enabled), leading to unexpected behaviour, the worst of which is
`[[` and/or `]]` not working in visual mode on a closed fold (visual
mode keeps it at the extreme end of the region line of the folded
region, so it's always going back to the opening line of that fold and
immediately being shoved back to the end by visual mode).
- `[[` and `]]` are operating inside comments, whereas the standard
behaviour skips comments.
- The viewport position is sometimes changed when it should not be
necessary.
2014-02-27 16:54:54 +11:00
|
|
|
|
2014-05-27 15:00:22 -07:00
|
|
|
let &cpo = s:save_cpo
|
|
|
|
unlet s:save_cpo
|
|
|
|
|
|
|
|
" vim: set noet sw=4 ts=4:
|