All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/9] BitBake Vim indentation plugin
@ 2019-10-11 16:22 Chris Laplante
  2019-10-11 16:23 ` [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
                   ` (9 more replies)
  0 siblings, 10 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:22 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.


The following changes since commit 94f6b31befda5c496f65e863a6f8152b42d7ebf0:

  build-appliance-image: Update to master head revision (2019-10-09 22:28:50 +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 | 342 +++++++++++++++++++++++++++++++++
 1 file changed, 342 insertions(+)
 create mode 100644 bitbake/contrib/vim/indent/bitbake.vim

--
2.7.4



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

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

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

Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
---
 bitbake/contrib/vim/bitbake.vim | 237 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 237 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..f02b21b
--- /dev/null
+++ b/bitbake/contrib/vim/bitbake.vim
@@ -0,0 +1,237 @@
+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
+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] 14+ messages in thread

* [PATCH 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {'
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
  2019-10-11 16:23 ` [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory Chris Laplante
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 f02b21b..f81f6d6 100644
--- a/bitbake/contrib/vim/bitbake.vim
+++ b/bitbake/contrib/vim/bitbake.vim
@@ -78,8 +78,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
@@ -97,22 +103,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] 14+ messages in thread

* [PATCH 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
  2019-10-11 16:23 ` [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
  2019-10-11 16:23 ` [PATCH 2/9] bitbake: contrib/vim: Modify Python indentation to work with 'python do_task {' Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 4/9] bitbake: contrib/vim: Special handling of bb.fatal Chris Laplante
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 f81f6d6..76968dd 100644
--- a/bitbake/contrib/vim/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -78,6 +78,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)
@@ -104,6 +106,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
@@ -230,15 +239,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] 14+ messages in thread

* [PATCH 4/9] bitbake: contrib/vim: Special handling of bb.fatal
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (2 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 3/9] bitbake: contrib/vim: More Python indenting; move indent file to correct directory Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 5/9] bitbake: contrib/vim: don't redeclare indenter Chris Laplante
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 76968dd..6bd7b1e 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -175,7 +175,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] 14+ messages in thread

* [PATCH 5/9] bitbake: contrib/vim: don't redeclare indenter
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (3 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 4/9] bitbake: contrib/vim: Special handling of bb.fatal Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 6/9] bitbake: contrib/vim: renaming & comments Chris Laplante
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 6bd7b1e..3a0ca86 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] 14+ messages in thread

* [PATCH 6/9] bitbake: contrib/vim: renaming & comments
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (4 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 5/9] bitbake: contrib/vim: don't redeclare indenter Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting Chris Laplante
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 3a0ca86..782137f 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
@@ -84,7 +84,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
@@ -179,6 +179,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()
@@ -257,7 +258,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] 14+ messages in thread

* [PATCH 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (5 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 6/9] bitbake: contrib/vim: renaming & comments Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 8/9] bitbake: contrib/vim: handle shell indenting Chris Laplante
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 782137f..ed2bd32 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -109,7 +109,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*}'
@@ -241,6 +246,7 @@ unlet s:keepcpo
 
 
 let b:did_indent = 1
+setlocal indentkeys+=0\"
 
 
 function BitbakeIndent(lnum)
@@ -248,13 +254,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] 14+ messages in thread

* [PATCH 8/9] bitbake: contrib/vim: handle shell indenting
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (6 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 7/9] bitbake: contrib/vim: indenting for assignments; tweak Python indenting Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 16:23 ` [PATCH 9/9] bitbake: contrib/vim: Add copyright and license notice Chris Laplante
  2019-10-11 17:43 ` [PATCH 0/9] BitBake Vim indentation plugin Martin Jansa
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 ed2bd32..0cc516c 100644
--- a/bitbake/contrib/vim/indent/bitbake.vim
+++ b/bitbake/contrib/vim/indent/bitbake.vim
@@ -318,6 +318,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] 14+ messages in thread

* [PATCH 9/9] bitbake: contrib/vim: Add copyright and license notice
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (7 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 8/9] bitbake: contrib/vim: handle shell indenting Chris Laplante
@ 2019-10-11 16:23 ` Chris Laplante
  2019-10-11 17:43 ` [PATCH 0/9] BitBake Vim indentation plugin Martin Jansa
  9 siblings, 0 replies; 14+ messages in thread
From: Chris Laplante @ 2019-10-11 16:23 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 0cc516c..44e3cd0 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] 14+ messages in thread

* Re: [PATCH 0/9] BitBake Vim indentation plugin
  2019-10-11 16:22 [PATCH 0/9] BitBake Vim indentation plugin Chris Laplante
                   ` (8 preceding siblings ...)
  2019-10-11 16:23 ` [PATCH 9/9] bitbake: contrib/vim: Add copyright and license notice Chris Laplante
@ 2019-10-11 17:43 ` Martin Jansa
  2019-10-11 17:52   ` chris.laplante
  9 siblings, 1 reply; 14+ messages in thread
From: Martin Jansa @ 2019-10-11 17:43 UTC (permalink / raw)
  To: Chris Laplante; +Cc: bitbake-devel

[-- Attachment #1: Type: text/plain, Size: 2386 bytes --]

On Fri, Oct 11, 2019 at 12:22:58PM -0400, 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.

Thank you. As vim user I'll test this soon.

Does the above mean that it will use 4 spaces for python and tabs for
shell tasks like oe-core is using?

Would it be possible to simply modify it locally to use 4 spaces for
indentation everywhere like other OE layers are using?

https://www.openembedded.org/wiki/Styleguide#Format_Guidelines

Cheers,

> The following changes since commit 94f6b31befda5c496f65e863a6f8152b42d7ebf0:
> 
>   build-appliance-image: Update to master head revision (2019-10-09 22:28:50 +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 | 342 +++++++++++++++++++++++++++++++++
>  1 file changed, 342 insertions(+)
>  create mode 100644 bitbake/contrib/vim/indent/bitbake.vim
> 
> --
> 2.7.4
> 
> -- 
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/bitbake-devel

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa@gmail.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 201 bytes --]

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

* Re: [PATCH 0/9] BitBake Vim indentation plugin
  2019-10-11 17:43 ` [PATCH 0/9] BitBake Vim indentation plugin Martin Jansa
@ 2019-10-11 17:52   ` chris.laplante
  0 siblings, 0 replies; 14+ messages in thread
From: chris.laplante @ 2019-10-11 17:52 UTC (permalink / raw)
  To: Martin Jansa; +Cc: bitbake-devel

Hi Martin,

> > 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.
> 
> Thank you. As vim user I'll test this soon.
> 
> Does the above mean that it will use 4 spaces for python and tabs for
> shell tasks like oe-core is using?

It currently doesn't specifically enforce either of those. The plugin is based on autoindent, so the expandtab, tabstop, and shiftwidth are respected. My editor is currently configured for 4 spaces everywhere, and that is used even for shell tasks. Unfortunately I don't know enough about Vim plugins to quickly answer how simple (or possible) it would be to change tab/spaces mode on a per-region basis. I'll add it to my TODO list though.

Thanks,
Chris


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

* Re: [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim
  2019-10-11 16:23 ` [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim Chris Laplante
@ 2019-10-11 20:16   ` Paul Barker
  2019-10-11 20:27     ` chris.laplante
  0 siblings, 1 reply; 14+ messages in thread
From: Paul Barker @ 2019-10-11 20:16 UTC (permalink / raw)
  To: Chris Laplante, bitbake-devel

On Fri, 11 Oct 2019, at 17:23, Chris Laplante via bitbake-devel wrote:
> The intention of this commit is so that git history will clearly
> show the changes I made to the Python indent code.

It would be good to record the license for the imported code along with the location of the original python.vim (I'm guessing it's in the vim source tree but I may be wrong).

-- 
Paul Barker


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

* Re: [PATCH 1/9] bitbake: contrib/vim: initial commit, with unmodified code from indent/python.vim
  2019-10-11 20:16   ` Paul Barker
@ 2019-10-11 20:27     ` chris.laplante
  0 siblings, 0 replies; 14+ messages in thread
From: chris.laplante @ 2019-10-11 20:27 UTC (permalink / raw)
  To: Paul Barker, bitbake-devel

> It would be good to record the license for the imported code along with the location of the original python.vim (I'm guessing it's in the
> vim source tree but I may be wrong).
> 
> --
> Paul Barker

Good point. The revision info is called out in the source file, but I should also add it to the commit message. And I'll be sure to explicitly state the license as well.

Thanks,
Chris


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

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

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