====== Escaping and Formatting Newlines ======
Using the "Send Selection to Command" feature of Geany and a simple Python script, you can re-format escaped newlines in your code so that the trailing back-slash always is aligned.
To demonstrate, here is a before and after the operation:
/* Some un-aligned, misplaced and missing escaped newlines */
#define FOO_BAR(a, b)
do
{
if (a < b) \
call_c(b, a);
else \
call_c(a, b);
}
while (0)\
/* After selecting the whole chunk of code and sending it through the Python script */
#define FOO_BAR(a, b) \
do \
{ \
if (a < b) \
call_c(b, a); \
else \
call_c(a, b); \
} \
while (0)
This is a simple Python script to do this:
#!/usr/bin/env python
from sys import stdin, stdout
# computes the width of a line, taking tabs into account
def line_width(line, tab_width=8):
length = 0
for c in line:
if c == '\t':
length += tab_width - (length % tab_width)
else:
length += 1
return length
# pads @string with @char to become @width wide
# at least one @char will be added
def ljust(string, width, char=' ', tab_width=8):
while True:
string += char
if line_width(string, tab_width) > width:
break
return string
# read all lines from stdin, stripping trailing slashes and whitespace
lines = [l.rstrip(' \t\r\n\v\\') for l in stdin]
# determine the maximum line length
line_max = max([line_width(l) for l in lines])
# write out the formatted lines to stdout
num_lines = len(lines)
for i, line in enumerate(lines):
if i != num_lines - 1:
stdout.write('%s\\\n' % ljust(line, line_max))
else:
stdout.write('%s\n' % line)
Save it to a file, make it executable and then use Edit->Format->Send Selection to->Set Custom Commands to add it to the commands. See [[http://www.geany.org/manual/current/index.html#sending-text-through-custom-commands|the user manual]] for more information about sending text through custom commands.
{{tag>howto escaped newlines custom commands}}