Scite Delete Blank Lines

lua-users home
wiki

Delete all blank lines in a document

The following script uses Scintilla line and position functions to get all empty lines removed. Since the caret moves during processing, the display position will shift at the end of processing. The empty line test includes lines with whitespace.

function del_empty_lines()
  editor:BeginUndoAction()
  -- remember last caret line position
  local pre_l = editor:LineFromPosition(editor.CurrentPos)
  local ln = 0
  while ln < editor.LineCount do
    local text = editor:GetLine(ln)
    if not text then break end -- empty last line without EOL
    if string.match(text, "^%s*\r?\n$") then
      local p = editor:PositionFromLine(ln)
      editor:GotoPos(p)
      editor:LineDelete()
      -- adjust caret position if necessary
      if ln < pre_l then pre_l = pre_l - 1 end
    else
      -- move on if no more empty lines at this line number
      ln = ln + 1
    end
  end
  -- restore last caret line position
  local pre_p = editor:PositionFromLine(pre_l)
  editor:GotoPos(pre_p)
  editor:EndUndoAction()
end

If explicitly blank lines with no whitespace are to be deleted only, the line test can be replaced with:

    if text == "\r\n" or text == "\n" then

A shorter version that processes the entire document text as a single Lua string is as follows:

function del_empty_lines()
  local txt = editor:GetText()
  if #txt == 0 then return end
  local chg, n = false
  while true do
    txt, n = string.gsub(txt, "(\r?\n)%s*\r?\n", "%1")
    if n == 0 then break end
    chg = true
  end
  if chg then
    editor:SetText(txt)
    editor:GotoPos(0)
  end
end

The caret is set to the top left of the document after processing, for simplicity.


RecentChanges · preferences
edit · history
Last edited March 26, 2008 2:11 am GMT (diff)