All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/9] BitBake Vim indentation plugin
@ 2019-10-17 16:36 Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

This patchset adds Vim indentation support for the BitBake language.

It supports indenting variable assignments, Python and shell tasks/functions.
To accomplish Python indentation, it uses a hacked-up version of the Python indenter
from Vim upstream. The upstream shell indenter is used directly, without
modification, however in the future it will be necessary to modify the shell
indenter to properly support "fakeroot" shell tasks.

Changes:
    v1->v2: mention the license of the copied Python indent code
            add upstream commit ID from which code was taken to commit message


The following changes since commit 52a625582e616aeb7a60411b58211e9fe1365863:

  kernel-dev: don't use _append += (2019-10-15 14:17:58 +0100)

are available in the git repository at:

  git://git.yoctoproject.org/poky-contrib cpl/bitbake-vim
  http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=cpl/bitbake-vim

Chris Laplante (9):
  bitbake: contrib/vim: initial commit, with unmodified code from
    indent/python.vim
  bitbake: contrib/vim: Modify Python indentation to work with 'python
    do_task {'
  bitbake: contrib/vim: More Python indenting; move indent file to
    correct directory
  bitbake: contrib/vim: Special handling of bb.fatal
  bitbake: contrib/vim: don't redeclare indenter
  bitbake: contrib/vim: renaming & comments
  bitbake: contrib/vim: indenting for assignments; tweak Python
    indenting
  bitbake: contrib/vim: handle shell indenting
  bitbake: contrib/vim: Add copyright and license notice

 bitbake/contrib/vim/indent/bitbake.vim | 343 +++++++++++++++++++++++++++++++++
 1 file changed, 343 insertions(+)
 create mode 100644 bitbake/contrib/vim/indent/bitbake.vim

--
2.7.4



^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {' Chris Laplante
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

The intention of this commit is so that git history will clearly
show the changes made to the Python indent code.

Taken from Vim commit 7a9bd7c1e0ce1baf5a02daf36eeae3638aa315c7

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/bitbake.vim | 238 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 238 insertions(+)
 create mode 100644 bitbake/contrib/vim/bitbake.vim

diff --git a/bitbake/contrib/vim/bitbake.vim b/bitbake/contrib/vim/bitbake.vim
new file mode 100644
index 0000000..a210cf5
--- /dev/null
+++ b/bitbake/contrib/vim/bitbake.vim
@@ -0,0 +1,238 @@
+if exists("b:did_indent")
+    finish
+endif
+
+runtime! indent/sh.vim
+unlet b:did_indent
+
+setlocal indentexpr=BitbakeIndent(v:lnum)
+setlocal autoindent nolisp
+
+function s:is_python_func_def(lnum)
+    let stack = synstack(a:lnum, 1)
+    if len(stack) == 0
+        return 0
+    endif
+
+    let top = synIDattr(stack[0], "name")
+    echo top
+
+    return synIDattr(stack[0], "name") == "bbPyFuncDef"
+endfunction
+
+"""" begin modified from indent/python.vim, upstream commit 7a9bd7c1e0ce1baf5a02daf36eeae3638aa315c7
+"""" This copied code is licensed the same as Vim itself.
+setlocal indentkeys+=<:>,=elif,=except
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+let s:maxoff = 50	" maximum number of lines to look backwards for ()
+
+function GetPythonIndent(lnum)
+
+  " If this line is explicitly joined: If the previous line was also joined,
+  " line it up with that one, otherwise add two 'shiftwidth'
+  if getline(a:lnum - 1) =~ '\\$'
+    if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
+      return indent(a:lnum - 1)
+    endif
+    return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_continue) : (shiftwidth() * 2))
+  endif
+
+  " If the start of the line is in a string don't change the indent.
+  if has('syntax_items')
+	\ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
+    return -1
+  endif
+
+  " Search backwards for the previous non-empty line.
+  let plnum = prevnonblank(v:lnum - 1)
+
+  if plnum == 0
+    " This is the first non-empty line, use zero indent.
+    return 0
+  endif
+
+  call cursor(plnum, 1)
+
+  " Identing inside parentheses can be very slow, regardless of the searchpair()
+  " timeout, so let the user disable this feature if he doesn't need it
+  let disable_parentheses_indenting = get(g:, "pyindent_disable_parentheses_indenting", 0)
+
+  if disable_parentheses_indenting == 1
+    let plindent = indent(plnum)
+    let plnumstart = plnum
+  else
+    " searchpair() can be slow sometimes, limit the time to 150 msec or what is
+    " put in g:pyindent_searchpair_timeout
+    let searchpair_stopline = 0
+    let searchpair_timeout = get(g:, 'pyindent_searchpair_timeout', 150)
+
+    " If the previous line is inside parenthesis, use the indent of the starting
+    " line.
+    " Trick: use the non-existing "dummy" variable to break out of the loop when
+    " going too far back.
+    let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
+            \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
+            \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+            \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+            \ searchpair_stopline, searchpair_timeout)
+    if parlnum > 0
+      let plindent = indent(parlnum)
+      let plnumstart = parlnum
+    else
+      let plindent = indent(plnum)
+      let plnumstart = plnum
+    endif
+
+    " When inside parenthesis: If at the first line below the parenthesis add
+    " two 'shiftwidth', otherwise same as previous line.
+    " i = (a
+    "       + b
+    "       + c)
+    call cursor(a:lnum, 1)
+    let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+            \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+            \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+            \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+            \ searchpair_stopline, searchpair_timeout)
+    if p > 0
+      if p == plnum
+        " When the start is inside parenthesis, only indent one 'shiftwidth'.
+        let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+            \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+            \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+            \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+            \ searchpair_stopline, searchpair_timeout)
+        if pp > 0
+          return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
+        endif
+        return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2))
+      endif
+      if plnumstart == p
+        return indent(plnum)
+      endif
+      return plindent
+    endif
+
+  endif
+
+
+  " Get the line and remove a trailing comment.
+  " Use syntax highlighting attributes when possible.
+  let pline = getline(plnum)
+  let pline_len = strlen(pline)
+  if has('syntax_items')
+    " If the last character in the line is a comment, do a binary search for
+    " the start of the comment.  synID() is slow, a linear search would take
+    " too long on a long line.
+    if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+      let min = 1
+      let max = pline_len
+      while min < max
+	let col = (min + max) / 2
+	if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+	  let max = col
+	else
+	  let min = col + 1
+	endif
+      endwhile
+      let pline = strpart(pline, 0, min - 1)
+    endif
+  else
+    let col = 0
+    while col < pline_len
+      if pline[col] == '#'
+	let pline = strpart(pline, 0, col)
+	break
+      endif
+      let col = col + 1
+    endwhile
+  endif
+
+  " If the previous line ended with a colon, indent this line
+  if pline =~ ':\s*$'
+    return plindent + shiftwidth()
+  endif
+
+  " If the previous line was a stop-execution statement...
+  if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+    " See if the user has already dedented
+    if indent(a:lnum) > indent(plnum) - shiftwidth()
+      " If not, recommend one dedent
+      return indent(plnum) - shiftwidth()
+    endif
+    " Otherwise, trust the user
+    return -1
+  endif
+
+  " If the current line begins with a keyword that lines up with "try"
+  if getline(a:lnum) =~ '^\s*\(except\|finally\)\>'
+    let lnum = a:lnum - 1
+    while lnum >= 1
+      if getline(lnum) =~ '^\s*\(try\|except\)\>'
+	let ind = indent(lnum)
+	if ind >= indent(a:lnum)
+	  return -1	" indent is already less than this
+	endif
+	return ind	" line up with previous try or except
+      endif
+      let lnum = lnum - 1
+    endwhile
+    return -1		" no matching "try"!
+  endif
+
+  " If the current line begins with a header keyword, dedent
+  if getline(a:lnum) =~ '^\s*\(elif\|else\)\>'
+
+    " Unless the previous line was a one-liner
+    if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>'
+      return plindent
+    endif
+
+    " Or the user has already dedented
+    if indent(a:lnum) <= plindent - shiftwidth()
+      return -1
+    endif
+
+    return plindent - shiftwidth()
+  endif
+
+  " When after a () construct we probably want to go back to the start line.
+  " a = (b
+  "       + c)
+  " here
+  if parlnum > 0
+    return plindent
+  endif
+
+  return -1
+
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+""" end of stuff from indent/python.vim
+
+
+let b:did_indent = 1
+
+
+function BitbakeIndent(lnum)
+    let stack = synstack(a:lnum, col("."))
+    if len(stack) == 0
+        return -1
+    endif
+
+    let name = synIDattr(stack[0], "name")
+
+    if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
+        let ret = GetPythonIndent(a:lnum)
+        return ret
+    endif
+
+    return -1
+    "return s:pythonIndentExpr()
+endfunction
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {'
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory Chris Laplante
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/bitbake.vim | 44 +++++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/bitbake/contrib/vim/bitbake.vim b/bitbake/contrib/vim/bitbake.vim
index a210cf5..ff86c19 100644
--- a/bitbake/contrib/vim/bitbake.vim
+++ b/bitbake/contrib/vim/bitbake.vim
@@ -79,8 +79,14 @@ function GetPythonIndent(lnum)
             \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
             \ searchpair_stopline, searchpair_timeout)
     if parlnum > 0
-      let plindent = indent(parlnum)
-      let plnumstart = parlnum
+      if s:is_python_func_def(parlnum)
+        let parlnum = 0
+        let plindent = indent(plnum)
+        let plnumstart = plnum
+      else
+        let plindent = indent(parlnum)
+        let plnumstart = parlnum
+      endif
     else
       let plindent = indent(plnum)
       let plnumstart = plnum
@@ -98,22 +104,26 @@ function GetPythonIndent(lnum)
             \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
             \ searchpair_stopline, searchpair_timeout)
     if p > 0
-      if p == plnum
-        " When the start is inside parenthesis, only indent one 'shiftwidth'.
-        let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
-            \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
-            \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
-            \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
-            \ searchpair_stopline, searchpair_timeout)
-        if pp > 0
-          return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
+        if s:is_python_func_def(p)
+          let p = 0
+        else
+          if p == plnum
+            " When the start is inside parenthesis, only indent one 'shiftwidth'.
+            let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+                \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+                \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+                \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
+                \ searchpair_stopline, searchpair_timeout)
+            if pp > 0
+              return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
+            endif
+            return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2))
+          endif
+          if plnumstart == p
+            return indent(plnum)
+          endif
+          return plindent
         endif
-        return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2))
-      endif
-      if plnumstart == p
-        return indent(plnum)
-      endif
-      return plindent
     endif
 
   endif
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {' Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 4/9] bitbake: contrib/vim: Special handling of bb.fatal Chris Laplante
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/{ => indent}/bitbake.vim | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 rename bitbake/contrib/vim/{ => indent}/bitbake.vim (91%)

diff --git a/bitbake/contrib/vim/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
similarity index 91%
rename from bitbake/contrib/vim/bitbake.vim
rename to bitbake/contrib/vim/indent/bitbake.vim
index ff86c19..1c35cb3 100644
--- a/bitbake/contrib/vim/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -79,6 +79,8 @@ function GetPythonIndent(lnum)
             \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
             \ searchpair_stopline, searchpair_timeout)
     if parlnum > 0
+      " We may have found the opening brace of a BitBake Python task, e.g. 'python do_task {'
+      " If so, ignore it here - it will be handled later.
       if s:is_python_func_def(parlnum)
         let parlnum = 0
         let plindent = indent(plnum)
@@ -105,6 +107,13 @@ function GetPythonIndent(lnum)
             \ searchpair_stopline, searchpair_timeout)
     if p > 0
         if s:is_python_func_def(p)
+          " Handle the user actually trying to close a BitBake Python task
+          let line = getline(a:lnum)
+          if line =~ '^\s*}'
+              return -2
+          endif
+
+          " Otherwise ignore the brace
           let p = 0
         else
           if p == plnum
@@ -231,15 +240,27 @@ let b:did_indent = 1
 
 
 function BitbakeIndent(lnum)
+    if !has('syntax_items')
+        return -1
+    endif
+
     let stack = synstack(a:lnum, col("."))
     if len(stack) == 0
         return -1
     endif
 
     let name = synIDattr(stack[0], "name")
+    "echo name
 
     if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
         let ret = GetPythonIndent(a:lnum)
+        " Should always be indented by at least one shiftwidth; but allow
+        " return of -1 (defer to autoindent) or -2 (force indent to 0)
+        if ret == 0
+            return shiftwidth()
+        elseif ret == -2
+            return 0
+        endif
         return ret
     endif
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 4/9] bitbake: contrib/vim: Special handling of bb.fatal
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (2 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 5/9] bitbake: contrib/vim: don't redeclare indenter Chris Laplante
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index 1c35cb3..d8bffe0 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -176,7 +176,7 @@ function GetPythonIndent(lnum)
   endif
 
   " If the previous line was a stop-execution statement...
-  if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+  if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\|bb\.fatal\)\>'
     " See if the user has already dedented
     if indent(a:lnum) > indent(plnum) - shiftwidth()
       " If not, recommend one dedent
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 5/9] bitbake: contrib/vim: don't redeclare indenter
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (3 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 4/9] bitbake: contrib/vim: Special handling of bb.fatal Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 6/9] bitbake: contrib/vim: renaming & comments Chris Laplante
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index d8bffe0..fc428a2 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -2,6 +2,10 @@ if exists("b:did_indent")
     finish
 endif
 
+if exists("*BitbakeIndent")
+    finish
+endif
+
 runtime! indent/sh.vim
 unlet b:did_indent
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 6/9] bitbake: contrib/vim: renaming & comments
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (4 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 5/9] bitbake: contrib/vim: don't redeclare indenter Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting Chris Laplante
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index fc428a2..76f84e5 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -12,7 +12,7 @@ unlet b:did_indent
 setlocal indentexpr=BitbakeIndent(v:lnum)
 setlocal autoindent nolisp
 
-function s:is_python_func_def(lnum)
+function s:is_bb_python_func_def(lnum)
     let stack = synstack(a:lnum, 1)
     if len(stack) == 0
         return 0
@@ -85,7 +85,7 @@ function GetPythonIndent(lnum)
     if parlnum > 0
       " We may have found the opening brace of a BitBake Python task, e.g. 'python do_task {'
       " If so, ignore it here - it will be handled later.
-      if s:is_python_func_def(parlnum)
+      if s:is_bb_python_func_def(parlnum)
         let parlnum = 0
         let plindent = indent(plnum)
         let plnumstart = plnum
@@ -180,6 +180,7 @@ function GetPythonIndent(lnum)
   endif
 
   " If the previous line was a stop-execution statement...
+  " TODO: utilize this logic to deindent when ending a bbPyDefRegion
   if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\|bb\.fatal\)\>'
     " See if the user has already dedented
     if indent(a:lnum) > indent(plnum) - shiftwidth()
@@ -258,7 +259,7 @@ function BitbakeIndent(lnum)
 
     if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
         let ret = GetPythonIndent(a:lnum)
-        " Should always be indented by at least one shiftwidth; but allow
+        " Should normally always be indented by at least one shiftwidth; but allow
         " return of -1 (defer to autoindent) or -2 (force indent to 0)
         if ret == 0
             return shiftwidth()
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (5 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 6/9] bitbake: contrib/vim: renaming & comments Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 8/9] bitbake: contrib/vim: handle shell indenting Chris Laplante
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 56 ++++++++++++++++++++++++++++++++--
 1 file changed, 53 insertions(+), 3 deletions(-)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index 76f84e5..1d0a6e8 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -110,7 +110,12 @@ function GetPythonIndent(lnum)
             \ . " =~ '\\(Comment\\|Todo\\|String\\)$'",
             \ searchpair_stopline, searchpair_timeout)
     if p > 0
-        if s:is_python_func_def(p)
+        if s:is_bb_python_func_def(p)
+          " Handle first non-empty line inside a BB Python task
+          if p == plnum
+              return shiftwidth()
+          endif
+
           " Handle the user actually trying to close a BitBake Python task
           let line = getline(a:lnum)
           if line =~ '^\s*}'
@@ -242,6 +247,7 @@ unlet s:keepcpo
 
 
 let b:did_indent = 1
+setlocal indentkeys+=0\"
 
 
 function BitbakeIndent(lnum)
@@ -249,13 +255,57 @@ function BitbakeIndent(lnum)
         return -1
     endif
 
-    let stack = synstack(a:lnum, col("."))
+    let stack = synstack(a:lnum, 1)
     if len(stack) == 0
         return -1
     endif
 
     let name = synIDattr(stack[0], "name")
-    "echo name
+
+    " TODO: support different styles of indentation for assignments. For now,
+    " we only support like this:
+    " VAR = " \
+    "     value1 \
+    "     value2 \
+    " "
+    "
+    " i.e. each value indented by shiftwidth(), with the final quote " completely unindented.
+    if name == "bbVarValue"
+        " Quote handling is tricky. kernel.bbclass has this line for instance:
+        "     EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" " HOSTCPP="${BUILD_CPP}""
+        " Instead of trying to handle crazy cases like that, just assume that a
+        " double-quote on a line by itself (following an assignment) means the
+        " user is closing the assignment, and de-dent.
+        if getline(a:lnum) =~ '^\s*"$'
+            return 0
+        endif
+
+        let prevstack = synstack(a:lnum - 1, 1)
+        if len(prevstack) == 0
+            return -1
+        endif
+
+        let prevname = synIDattr(prevstack[0], "name")
+
+        " Only indent if there was actually a continuation character on
+        " the previous line, to avoid misleading indentation.
+        let prevlinelastchar = synIDattr(synID(a:lnum - 1, col([a:lnum - 1, "$"]) - 1, 1), "name")
+        let prev_continued = prevlinelastchar == "bbContinue"
+
+        " Did the previous line introduce an assignment?
+        if index(["bbVarDef", "bbVarFlagDef"], prevname) != -1
+            if prev_continued
+                return shiftwidth()
+            endif
+        endif
+
+        if !prev_continued
+            return 0
+        endif
+
+        " Autoindent can take it from here
+        return -1
+    endif
 
     if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
         let ret = GetPythonIndent(a:lnum)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 8/9] bitbake: contrib/vim: handle shell indenting
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (6 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-10-17 16:36 ` [PATCH v2 9/9] bitbake: contrib/vim: Add copyright and license notice Chris Laplante
  2019-11-07 14:41 ` [PATCH v2 0/9] BitBake Vim indentation plugin chris.laplante
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index 1d0a6e8..1d99395 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -319,6 +319,18 @@ function BitbakeIndent(lnum)
         return ret
     endif
 
+    " TODO: GetShIndent doesn't detect tasks prepended with 'fakeroot'
+    " Need to submit a patch upstream to Vim to provide an extension point.
+    " Unlike the Python indenter, the Sh indenter is way too large to copy and
+    " modify here.
+    if name == "bbShFuncRegion"
+        return GetShIndent()
+    endif
+
+    " TODO:
+    "   + heuristics for de-denting out of a bbPyDefRegion? e.g. when the user
+    "       types an obvious BB keyword like addhandler or addtask, or starts
+    "       writing a shell task. Maybe too hard to implement...
+
     return -1
-    "return s:pythonIndentExpr()
 endfunction
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 9/9] bitbake: contrib/vim: Add copyright and license notice
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (7 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 8/9] bitbake: contrib/vim: handle shell indenting Chris Laplante
@ 2019-10-17 16:36 ` Chris Laplante
  2019-11-07 14:41 ` [PATCH v2 0/9] BitBake Vim indentation plugin chris.laplante
  9 siblings, 0 replies; 13+ messages in thread
From: Chris Laplante @ 2019-10-17 16:36 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/indent/bitbake.vim | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/indent/bitbake.vim
index 1d99395..1381034 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -1,3 +1,10 @@
+" Vim indent file
+" Language:             BitBake
+" Copyright:            Copyright (C) 2019 Agilent Technologies, Inc.
+" Maintainer:           Chris Laplante <chris.laplante@agilent.com>
+" License:              You may redistribute this under the same terms as Vim itself
+
+
 if exists("b:did_indent")
     finish
 endif
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 0/9] BitBake Vim indentation plugin
  2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (8 preceding siblings ...)
  2019-10-17 16:36 ` [PATCH v2 9/9] bitbake: contrib/vim: Add copyright and license notice Chris Laplante
@ 2019-11-07 14:41 ` chris.laplante
  2019-11-07 19:45   ` Richard Purdie
  9 siblings, 1 reply; 13+ messages in thread
From: chris.laplante @ 2019-11-07 14:41 UTC (permalink / raw)
  To: bitbake-devel

> This patchset adds Vim indentation support for the BitBake language.
> 
> It supports indenting variable assignments, Python and shell tasks/functions.
> To accomplish Python indentation, it uses a hacked-up version of the Python indenter
> from Vim upstream. The upstream shell indenter is used directly, without
> modification, however in the future it will be necessary to modify the shell
> indenter to properly support "fakeroot" shell tasks.

Heads up, it seems only the first two commits in this patch series were committed to Poky. Could someone please commit the remaining 7?

Thanks in advance,
Chris


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 0/9] BitBake Vim indentation plugin
  2019-11-07 14:41 ` [PATCH v2 0/9] BitBake Vim indentation plugin chris.laplante
@ 2019-11-07 19:45   ` Richard Purdie
  2019-11-07 20:48     ` chris.laplante
  0 siblings, 1 reply; 13+ messages in thread
From: Richard Purdie @ 2019-11-07 19:45 UTC (permalink / raw)
  To: chris.laplante, bitbake-devel

On Thu, 2019-11-07 at 14:41 +0000, chris.laplante--- via bitbake-devel
wrote:
> > This patchset adds Vim indentation support for the BitBake
> > language.
> > 
> > It supports indenting variable assignments, Python and shell
> > tasks/functions.
> > To accomplish Python indentation, it uses a hacked-up version of
> > the Python indenter
> > from Vim upstream. The upstream shell indenter is used directly,
> > without
> > modification, however in the future it will be necessary to modify
> > the shell
> > indenter to properly support "fakeroot" shell tasks.
> 
> Heads up, it seems only the first two commits in this patch series
> were committed to Poky. Could someone please commit the remaining 7?

Fixed, the rename in patch 3 broke the tooling but I sorted it out
manually.

Cheers,

Richard



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 0/9] BitBake Vim indentation plugin
  2019-11-07 19:45   ` Richard Purdie
@ 2019-11-07 20:48     ` chris.laplante
  0 siblings, 0 replies; 13+ messages in thread
From: chris.laplante @ 2019-11-07 20:48 UTC (permalink / raw)
  To: Richard Purdie, bitbake-devel

> Fixed, the rename in patch 3 broke the tooling but I sorted it out
> manually.

Appreciate it, thanks!

Chris

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-11-07 20:48 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-17 16:36 [PATCH v2 0/9] BitBake Vim indentation plugin Chris Laplante
2019-10-17 16:36 ` [PATCH v2 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
2019-10-17 16:36 ` [PATCH v2 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {' Chris Laplante
2019-10-17 16:36 ` [PATCH v2 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory Chris Laplante
2019-10-17 16:36 ` [PATCH v2 4/9] bitbake: contrib/vim: Special handling of bb.fatal Chris Laplante
2019-10-17 16:36 ` [PATCH v2 5/9] bitbake: contrib/vim: don't redeclare indenter Chris Laplante
2019-10-17 16:36 ` [PATCH v2 6/9] bitbake: contrib/vim: renaming & comments Chris Laplante
2019-10-17 16:36 ` [PATCH v2 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting Chris Laplante
2019-10-17 16:36 ` [PATCH v2 8/9] bitbake: contrib/vim: handle shell indenting Chris Laplante
2019-10-17 16:36 ` [PATCH v2 9/9] bitbake: contrib/vim: Add copyright and license notice Chris Laplante
2019-11-07 14:41 ` [PATCH v2 0/9] BitBake Vim indentation plugin chris.laplante
2019-11-07 19:45   ` Richard Purdie
2019-11-07 20:48     ` chris.laplante

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.