29450
|
1 " Support for bitbake indenting, see runtime/indent/bitbake.vim
|
|
2
|
|
3 function s:is_bb_python_func_def(lnum)
|
|
4 let stack = synstack(a:lnum, 1)
|
|
5 if len(stack) == 0
|
|
6 return 0
|
|
7 endif
|
|
8
|
|
9 return synIDattr(stack[0], "name") == "bbPyFuncDef"
|
|
10 endfunction
|
|
11
|
|
12 function bitbake#Indent(lnum)
|
|
13 if !has('syntax_items')
|
|
14 return -1
|
|
15 endif
|
|
16
|
|
17 let stack = synstack(a:lnum, 1)
|
|
18 if len(stack) == 0
|
|
19 return -1
|
|
20 endif
|
|
21
|
|
22 let name = synIDattr(stack[0], "name")
|
|
23
|
|
24 " TODO: support different styles of indentation for assignments. For now,
|
|
25 " we only support like this:
|
|
26 " VAR = " \
|
|
27 " value1 \
|
|
28 " value2 \
|
|
29 " "
|
|
30 "
|
|
31 " i.e. each value indented by shiftwidth(), with the final quote " completely unindented.
|
|
32 if name == "bbVarValue"
|
|
33 " Quote handling is tricky. kernel.bbclass has this line for instance:
|
|
34 " EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" " HOSTCPP="${BUILD_CPP}""
|
|
35 " Instead of trying to handle crazy cases like that, just assume that a
|
|
36 " double-quote on a line by itself (following an assignment) means the
|
|
37 " user is closing the assignment, and de-dent.
|
|
38 if getline(a:lnum) =~ '^\s*"$'
|
|
39 return 0
|
|
40 endif
|
|
41
|
|
42 let prevstack = synstack(a:lnum - 1, 1)
|
|
43 if len(prevstack) == 0
|
|
44 return -1
|
|
45 endif
|
|
46
|
|
47 let prevname = synIDattr(prevstack[0], "name")
|
|
48
|
|
49 " Only indent if there was actually a continuation character on
|
|
50 " the previous line, to avoid misleading indentation.
|
|
51 let prevlinelastchar = synIDattr(synID(a:lnum - 1, col([a:lnum - 1, "$"]) - 1, 1), "name")
|
|
52 let prev_continued = prevlinelastchar == "bbContinue"
|
|
53
|
|
54 " Did the previous line introduce an assignment?
|
|
55 if index(["bbVarDef", "bbVarFlagDef"], prevname) != -1
|
|
56 if prev_continued
|
|
57 return shiftwidth()
|
|
58 endif
|
|
59 endif
|
|
60
|
|
61 if !prev_continued
|
|
62 return 0
|
|
63 endif
|
|
64
|
|
65 " Autoindent can take it from here
|
|
66 return -1
|
|
67 endif
|
|
68
|
|
69 if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
|
|
70 let ret = python#GetIndent(a:lnum, function('s:is_bb_python_func_def'))
|
|
71 " Should normally always be indented by at least one shiftwidth; but allow
|
|
72 " return of -1 (defer to autoindent) or -2 (force indent to 0)
|
|
73 if ret == 0
|
|
74 return shiftwidth()
|
|
75 elseif ret == -2
|
|
76 return 0
|
|
77 endif
|
|
78 return ret
|
|
79 endif
|
|
80
|
|
81 " TODO: GetShIndent doesn't detect tasks prepended with 'fakeroot'
|
|
82 " Need to submit a patch upstream to Vim to provide an extension point.
|
|
83 " Unlike the Python indenter, the Sh indenter is way too large to copy and
|
|
84 " modify here.
|
|
85 if name == "bbShFuncRegion"
|
|
86 return GetShIndent()
|
|
87 endif
|
|
88
|
|
89 " TODO:
|
|
90 " + heuristics for de-denting out of a bbPyDefRegion? e.g. when the user
|
|
91 " types an obvious BB keyword like addhandler or addtask, or starts
|
|
92 " writing a shell task. Maybe too hard to implement...
|
|
93
|
|
94 return -1
|
|
95 endfunction
|