def all_preceding_lines(mode, row=None): # In normal mode, generates (ROW, LEVEL) backwards for all non-empty lines # before ROW; a first line of the file is never considered empty for this # purpose, as it is then the root topic. In visual mode, generates (ROW, # LEVEL) for all non-empty selected lines from last to first. buffer = vim.current.buffer if 'n' in mode: if row is None: row, col = vim.current.window.cursor row = int(vim.eval('prevnonblank(%d)' % (row - 1))) first = 1 elif 'v' in mode: assert row is None, row row, col = buffer.mark('>') if not buffer[row-1]: row = int(vim.eval('prevnonblank(%d)' % (row - 1))) first, col = buffer.mark('<') if 's' in mode: while first <= row: skip = int(vim.eval('foldclosed(%d)' % row)) if skip < 0: yield row_and_level(row) else: row = skip row = int(vim.eval('prevnonblank(%d)' % (row - 1))) else: while first <= row: yield row_and_level(row) row = int(vim.eval('prevnonblank(%d)' % (row - 1))) if 'n' in mode and len(buffer) > 0 and not buffer[0]: if not ('s' in mode and is_invisible(1)): yield 1, 0
def all_following_lines(mode, row=None): # In normal mode, generates (ROW, LEVEL) forward for all non-empty lines # after ROW. In visual mode, generates (ROW, LEVEL) for all non-empty # selected lines from first to last. buffer = vim.current.buffer if 'n' in mode: if row is None: row, col = vim.current.window.cursor row = int(vim.eval('nextnonblank(%d)' % (row + 1))) last = len(buffer) elif 'v' in mode: assert row is None, row row, col = buffer.mark('<') if not buffer[row-1]: row = int(vim.eval('nextnonblank(%d)' % (row + 1))) last, col = buffer.mark('>') if 's' in mode: while 0 < row <= last: skip = int(vim.eval('foldclosedend(%d)' % row)) if skip < 0: yield row_and_level(row) else: row = skip row = int(vim.eval('nextnonblank(%d)' % (row + 1))) else: while 0 < row <= last: yield row_and_level(row) row = int(vim.eval('nextnonblank(%d)' % (row + 1)))
def is_invisible(row=None): # Tells if the line at ROW is within a currently closed fold. if row is None: row, col = vim.current.window.cursor return int(vim.eval('foldclosed(%d)' % row)) >= 0