• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1" LLVM coding guidelines conformance for VIM
2" $Revision$
3"
4" Maintainer: The LLVM Team, http://llvm.org
5" WARNING:    Read before you source in all these commands and macros!  Some
6"             of them may change VIM behavior that you depend on.
7"
8" You can run VIM with these settings without changing your current setup with:
9" $ vim -u /path/to/llvm/utils/vim/vimrc
10
11" It's VIM, not VI
12set nocompatible
13
14" A tab produces a 2-space indentation
15set softtabstop=2
16set shiftwidth=2
17set expandtab
18
19" Highlight trailing whitespace and lines longer than 80 columns.
20highlight LongLine ctermbg=DarkYellow guibg=DarkYellow
21highlight WhitespaceEOL ctermbg=DarkYellow guibg=DarkYellow
22if v:version >= 702
23  " Lines longer than 80 columns.
24  au BufWinEnter * let w:m0=matchadd('LongLine', '\%>80v.\+', -1)
25
26  " Whitespace at the end of a line. This little dance suppresses
27  " whitespace that has just been typed.
28  au BufWinEnter * let w:m1=matchadd('WhitespaceEOL', '\s\+$', -1)
29  au InsertEnter * call matchdelete(w:m1)
30  au InsertEnter * let w:m2=matchadd('WhitespaceEOL', '\s\+\%#\@<!$', -1)
31  au InsertLeave * call matchdelete(w:m2)
32  au InsertLeave * let w:m1=matchadd('WhitespaceEOL', '\s\+$', -1)
33else
34  au BufRead,BufNewFile * syntax match LongLine /\%>80v.\+/
35  au InsertEnter * syntax match WhitespaceEOL /\s\+\%#\@<!$/
36  au InsertLeave * syntax match WhitespaceEOL /\s\+$/
37endif
38
39" Enable filetype detection
40filetype on
41
42" Optional
43" C/C++ programming helpers
44augroup csrc
45  au!
46  autocmd FileType *      set nocindent smartindent
47  autocmd FileType c,cpp  set cindent
48augroup END
49" Set a few indentation parameters. See the VIM help for cinoptions-values for
50" details.  These aren't absolute rules; they're just an approximation of
51" common style in LLVM source.
52set cinoptions=:0,g0,(0,Ws,l1
53" Add and delete spaces in increments of `shiftwidth' for tabs
54set smarttab
55
56" Highlight syntax in programming languages
57syntax on
58
59" LLVM Makefiles can have names such as Makefile.rules or TEST.nightly.Makefile,
60" so it's important to categorize them as such.
61augroup filetype
62  au! BufRead,BufNewFile *Makefile* set filetype=make
63augroup END
64
65" In Makefiles, don't expand tabs to spaces, since we need the actual tabs
66autocmd FileType make set noexpandtab
67
68" Useful macros for cleaning up code to conform to LLVM coding guidelines
69
70" Delete trailing whitespace and tabs at the end of each line
71command! DeleteTrailingWs :%s/\s\+$//
72
73" Convert all tab characters to two spaces
74command! Untab :%s/\t/  /g
75
76" Enable syntax highlighting for LLVM files. To use, copy
77" utils/vim/syntax/llvm.vim to ~/.vim/syntax .
78augroup filetype
79  au! BufRead,BufNewFile *.ll     set filetype=llvm
80augroup END
81
82" Enable syntax highlighting for tablegen files. To use, copy
83" utils/vim/syntax/tablegen.vim to ~/.vim/syntax .
84augroup filetype
85  au! BufRead,BufNewFile *.td     set filetype=tablegen
86augroup END
87
88" Enable syntax highlighting for reStructuredText files. To use, copy
89" rest.vim (http://www.vim.org/scripts/script.php?script_id=973)
90" to ~/.vim/syntax .
91augroup filetype
92 au! BufRead,BufNewFile *.rst     set filetype=rest
93augroup END
94
95" Additional vim features to optionally uncomment.
96"set showcmd
97"set showmatch
98"set showmode
99"set incsearch
100"set ruler
101
102" Clang code-completion support. This is somewhat experimental!
103
104" A path to a clang executable.
105let g:clang_path = "clang++"
106
107" A list of options to add to the clang commandline, for example to add
108" include paths, predefined macros, and language options.
109let g:clang_opts = [
110  \ "-x","c++",
111  \ "-D__STDC_LIMIT_MACROS=1","-D__STDC_CONSTANT_MACROS=1",
112  \ "-Iinclude" ]
113
114function! ClangComplete(findstart, base)
115   if a:findstart == 1
116      " In findstart mode, look for the beginning of the current identifier.
117      let l:line = getline('.')
118      let l:start = col('.') - 1
119      while l:start > 0 && l:line[l:start - 1] =~ '\i'
120         let l:start -= 1
121      endwhile
122      return l:start
123   endif
124
125   " Get the current line and column numbers.
126   let l:l = line('.')
127   let l:c = col('.')
128
129   " Build a clang commandline to do code completion on stdin.
130   let l:the_command = shellescape(g:clang_path) .
131                     \ " -cc1 -code-completion-at=-:" . l:l . ":" . l:c
132   for l:opt in g:clang_opts
133      let l:the_command .= " " . shellescape(l:opt)
134   endfor
135
136   " Copy the contents of the current buffer into a string for stdin.
137   " TODO: The extra space at the end is for working around clang's
138   " apparent inability to do code completion at the very end of the
139   " input.
140   " TODO: Is it better to feed clang the entire file instead of truncating
141   " it at the current line?
142   let l:process_input = join(getline(1, l:l), "\n") . " "
143
144   " Run it!
145   let l:input_lines = split(system(l:the_command, l:process_input), "\n")
146
147   " Parse the output.
148   for l:input_line in l:input_lines
149      " Vim's substring operator is annoyingly inconsistent with python's.
150      if l:input_line[:11] == 'COMPLETION: '
151         let l:value = l:input_line[12:]
152
153        " Chop off anything after " : ", if present, and move it to the menu.
154        let l:menu = ""
155        let l:spacecolonspace = stridx(l:value, " : ")
156        if l:spacecolonspace != -1
157           let l:menu = l:value[l:spacecolonspace+3:]
158           let l:value = l:value[:l:spacecolonspace-1]
159        endif
160
161        " Chop off " (Hidden)", if present, and move it to the menu.
162        let l:hidden = stridx(l:value, " (Hidden)")
163        if l:hidden != -1
164           let l:menu .= " (Hidden)"
165           let l:value = l:value[:l:hidden-1]
166        endif
167
168        " Handle "Pattern". TODO: Make clang less weird.
169        if l:value == "Pattern"
170           let l:value = l:menu
171           let l:pound = stridx(l:value, "#")
172           " Truncate the at the first [#, <#, or {#.
173           if l:pound != -1
174              let l:value = l:value[:l:pound-2]
175           endif
176        endif
177
178         " Filter out results which don't match the base string.
179         if a:base != ""
180            if l:value[:strlen(a:base)-1] != a:base
181               continue
182            end
183         endif
184
185        " TODO: Don't dump the raw input into info, though it's nice for now.
186        " TODO: The kind string?
187        let l:item = {
188          \ "word": l:value,
189          \ "menu": l:menu,
190          \ "info": l:input_line,
191          \ "dup": 1 }
192
193        " Report a result.
194        if complete_add(l:item) == 0
195           return []
196        endif
197        if complete_check()
198           return []
199        endif
200
201      elseif l:input_line[:9] == "OVERLOAD: "
202         " An overload candidate. Use a crazy hack to get vim to
203         " display the results. TODO: Make this better.
204         let l:value = l:input_line[10:]
205         let l:item = {
206           \ "word": " ",
207           \ "menu": l:value,
208           \ "info": l:input_line,
209           \ "dup": 1}
210
211        " Report a result.
212        if complete_add(l:item) == 0
213           return []
214        endif
215        if complete_check()
216           return []
217        endif
218
219      endif
220   endfor
221
222
223   return []
224endfunction ClangComplete
225
226" This to enables the somewhat-experimental clang-based
227" autocompletion support.
228set omnifunc=ClangComplete
229