diff --git a/README.md b/README.md
index 7b41e82..bd03fd2 100644
--- a/README.md
+++ b/README.md
@@ -351,363 +351,254 @@
 
 ## Knobs
 
-`ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT`
+#### `ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT`
 
-    Align closing bracket with visual indentation.
+>    Align closing bracket with visual indentation.
 
-`ALLOW_MULTILINE_LAMBDAS`
+#### `ALLOW_MULTILINE_LAMBDAS`
 
-    Allow lambdas to be formatted on more than one line.
+>    Allow lambdas to be formatted on more than one line.
 
-`ALLOW_MULTILINE_DICTIONARY_KEYS`
+#### `ALLOW_MULTILINE_DICTIONARY_KEYS`
 
-    Allow dictionary keys to exist on multiple lines. For example:
+>    Allow dictionary keys to exist on multiple lines. For example:
 
 ```python
-        x = {
-            ('this is the first element of a tuple',
-             'this is the second element of a tuple'):
-                 value,
-        }
+    x = {
+        ('this is the first element of a tuple',
+         'this is the second element of a tuple'):
+             value,
+    }
 ```
 
-`ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS`
+#### `ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS`
 
-    Allow splitting before a default / named assignment in an argument list.
+>    Allow splitting before a default / named assignment in an argument list.
 
-`ALLOW_SPLIT_BEFORE_DICT_VALUE`
+#### `ALLOW_SPLIT_BEFORE_DICT_VALUE`
 
-    Allow splits before the dictionary value.
+>    Allow splits before the dictionary value.
 
-`ARITHMETIC_PRECEDENCE_INDICATION`
+#### `ARITHMETIC_PRECEDENCE_INDICATION`
 
-    Let spacing indicate operator precedence. For example:
+>    Let spacing indicate operator precedence. For example:
 
 ```python
-        a = 1 * 2 + 3 / 4
-        b = 1 / 2 - 3 * 4
-        c = (1 + 2) * (3 - 4)
-        d = (1 - 2) / (3 + 4)
-        e = 1 * 2 - 3
-        f = 1 + 2 + 3 + 4
+    a = 1 * 2 + 3 / 4
+    b = 1 / 2 - 3 * 4
+    c = (1 + 2) * (3 - 4)
+    d = (1 - 2) / (3 + 4)
+    e = 1 * 2 - 3
+    f = 1 + 2 + 3 + 4
 ```
 
-    will be formatted as follows to indicate precedence:
+>    will be formatted as follows to indicate precedence:
 
 ```python
-        a = 1*2 + 3/4
-        b = 1/2 - 3*4
-        c = (1+2) * (3-4)
-        d = (1-2) / (3+4)
-        e = 1*2 - 3
-        f = 1 + 2 + 3 + 4
+    a = 1*2 + 3/4
+    b = 1/2 - 3*4
+    c = (1+2) * (3-4)
+    d = (1-2) / (3+4)
+    e = 1*2 - 3
+    f = 1 + 2 + 3 + 4
 ```
 
-`BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF`
+#### `BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION`
 
-    Insert a blank line before a `def` or `class` immediately nested within
-    another `def` or `class`. For example:
+>    Sets the number of desired blank lines surrounding top-level function and
+>    class definitions. For example:
 
 ```python
-        class Foo:
-                           # <------ this blank line
-            def method():
-                pass
+    class Foo:
+        pass
+                       # <------ having two blank lines here
+                       # <------ is the default setting
+    class Bar:
+        pass
 ```
 
-`BLANK_LINE_BEFORE_MODULE_DOCSTRING`
+#### `BLANK_LINE_BEFORE_CLASS_DOCSTRING`
 
-    Insert a blank line before a module docstring.
+>    Insert a blank line before a class-level docstring.
 
-`BLANK_LINE_BEFORE_CLASS_DOCSTRING`
+#### `BLANK_LINE_BEFORE_MODULE_DOCSTRING`
 
-    Insert a blank line before a class-level docstring.
+>    Insert a blank line before a module docstring.
 
-`BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION`
+#### `BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF`
 
-    Sets the number of desired blank lines surrounding top-level function and
-    class definitions. For example:
+>    Insert a blank line before a `def` or `class` immediately nested within
+>    another `def` or `class`. For example:
 
 ```python
-        class Foo:
-            pass
-                           # <------ having two blank lines here
-                           # <------ is the default setting
-        class Bar:
+    class Foo:
+                       # <------ this blank line
+        def method():
             pass
 ```
 
-`BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES`
+#### `BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES`
 
-    Sets the number of desired blank lines between top-level imports and
-    variable definitions. Useful for compatibility with tools like isort.
+>    Sets the number of desired blank lines between top-level imports and
+>    variable definitions. Useful for compatibility with tools like isort.
 
-`COALESCE_BRACKETS`
+#### `COALESCE_BRACKETS`
 
-    Do not split consecutive brackets. Only relevant when
-    `DEDENT_CLOSING_BRACKETS` or `INDENT_CLOSING_BRACKETS` is set. For example:
+>    Do not split consecutive brackets. Only relevant when
+>    `DEDENT_CLOSING_BRACKETS` or `INDENT_CLOSING_BRACKETS` is set. For example:
 
 ```python
-        call_func_that_takes_a_dict(
-            {
-                'key1': 'value1',
-                'key2': 'value2',
-            }
-        )
-```
-
-    would reformat to:
-
-```python
-        call_func_that_takes_a_dict({
+    call_func_that_takes_a_dict(
+        {
             'key1': 'value1',
             'key2': 'value2',
-        })
-```
-
-`COLUMN_LIMIT`
-
-    The column limit (or max line-length)
-
-`CONTINUATION_ALIGN_STYLE`
-
-    The style for continuation alignment. Possible values are:
-
-    - `SPACE`: Use spaces for continuation alignment. This is default
-      behavior.
-    - `FIXED`: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
-      (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or
-      CONTINUATION_INDENT_WIDTH spaces) for continuation alignment.
-    - `VALIGN-RIGHT`: Vertically align continuation lines to multiple of
-      INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if cannot
-      vertically align continuation lines with indent characters.
-
-`CONTINUATION_INDENT_WIDTH`
-
-    Indent width used for line continuations.
-
-`DEDENT_CLOSING_BRACKETS`
-
-    Put closing brackets on a separate line, dedented, if the bracketed
-    expression can't fit in a single line. Applies to all kinds of brackets,
-    including function definitions and calls. For example:
-
-```python
-        config = {
-            'key1': 'value1',
-            'key2': 'value2',
-        }  # <--- this bracket is dedented and on a separate line
-
-        time_series = self.remote_client.query_entity_counters(
-            entity='dev3246.region1',
-            key='dns.query_latency_tcp',
-            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
-            start_ts=now()-timedelta(days=3),
-            end_ts=now(),
-        )  # <--- this bracket is dedented and on a separate line
-```
-
-`DISABLE_ENDING_COMMA_HEURISTIC`
-
-    Disable the heuristic which places each list element on a separate line if
-    the list is comma-terminated.
-
-`EACH_DICT_ENTRY_ON_SEPARATE_LINE`
-
-    Place each dictionary entry onto its own line.
-
-`FORCE_MULTILINE_DICT`
-
-    Respect `EACH_DICT_ENTRY_ON_SEPARATE_LINE` even if the line is shorter than
-    `COLUMN_LIMIT`.
-
-`I18N_COMMENT`
-
-    The regex for an internationalization comment. The presence of this comment
-    stops reformatting of that line, because the comments are required to be
-    next to the string they translate.
-
-`I18N_FUNCTION_CALL`
-
-    The internationalization function call names. The presence of this function
-    stops reformatting on that line, because the string it has cannot be moved
-    away from the i18n comment.
-
-`INDENT_DICTIONARY_VALUE`
-
-    Indent the dictionary value if it cannot fit on the same line as the
-    dictionary key. For example:
-
-```python
-        config = {
-            'key1':
-                'value1',
-            'key2': value1 +
-                    value2,
         }
+    )
 ```
 
-`INDENT_WIDTH`
-
-    The number of columns to use for indentation.
-
-`INDENT_BLANK_LINES`
-
-    Set to `True` to prefer indented blank lines rather than empty
-
-`INDENT_CLOSING_BRACKETS`
-
-    Put closing brackets on a separate line, indented, if the bracketed
-    expression can't fit in a single line. Applies to all kinds of brackets,
-    including function definitions and calls. For example:
+>    would reformat to:
 
 ```python
-        config = {
-            'key1': 'value1',
-            'key2': 'value2',
-            }  # <--- this bracket is indented and on a separate line
-
-        time_series = self.remote_client.query_entity_counters(
-            entity='dev3246.region1',
-            key='dns.query_latency_tcp',
-            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
-            start_ts=now()-timedelta(days=3),
-            end_ts=now(),
-            )  # <--- this bracket is indented and on a separate line
+    call_func_that_takes_a_dict({
+        'key1': 'value1',
+        'key2': 'value2',
+    })
 ```
 
-`JOIN_MULTIPLE_LINES`
+#### `COLUMN_LIMIT`
 
-    Join short lines into one line. E.g., single line `if` statements.
+>    The column limit (or max line-length)
 
-`NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS`
+#### `CONTINUATION_ALIGN_STYLE`
 
-    Do not include spaces around selected binary operators. For example:
+>    The style for continuation alignment. Possible values are:
+
+>    - `SPACE`: Use spaces for continuation alignment. This is default
+>      behavior.
+>    - `FIXED`: Use fixed number (`CONTINUATION_INDENT_WIDTH`) of columns
+>      (i.e. `CONTINUATION_INDENT_WIDTH`/`INDENT_WIDTH` tabs or
+>      `CONTINUATION_INDENT_WIDTH` spaces) for continuation alignment.
+>    - `VALIGN-RIGHT`: Vertically align continuation lines to multiple of
+>      `INDENT_WIDTH` columns. Slightly right (one tab or a few spaces) if cannot
+>      vertically align continuation lines with indent characters.
+
+#### `CONTINUATION_INDENT_WIDTH`
+
+>    Indent width used for line continuations.
+
+#### `DEDENT_CLOSING_BRACKETS`
+
+>    Put closing brackets on a separate line, dedented, if the bracketed
+>    expression can't fit in a single line. Applies to all kinds of brackets,
+>    including function definitions and calls. For example:
 
 ```python
-        1 + 2 * 3 - 4 / 5
+    config = {
+        'key1': 'value1',
+        'key2': 'value2',
+    }  # <--- this bracket is dedented and on a separate line
+
+    time_series = self.remote_client.query_entity_counters(
+        entity='dev3246.region1',
+        key='dns.query_latency_tcp',
+        transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
+        start_ts=now()-timedelta(days=3),
+        end_ts=now(),
+    )  # <--- this bracket is dedented and on a separate line
 ```
 
-    will be formatted as follows when configured with `*`, `/`:
+#### `DISABLE_ENDING_COMMA_HEURISTIC`
+
+>    Disable the heuristic which places each list element on a separate line if
+>    the list is comma-terminated.
+
+#### `EACH_DICT_ENTRY_ON_SEPARATE_LINE`
+
+>    Place each dictionary entry onto its own line.
+
+#### `FORCE_MULTILINE_DICT`
+
+>    Respect `EACH_DICT_ENTRY_ON_SEPARATE_LINE` even if the line is shorter than
+>    `COLUMN_LIMIT`.
+
+#### `I18N_COMMENT`
+
+>    The regex for an internationalization comment. The presence of this comment
+>    stops reformatting of that line, because the comments are required to be
+>    next to the string they translate.
+
+#### `I18N_FUNCTION_CALL`
+
+>    The internationalization function call names. The presence of this function
+>    stops reformatting on that line, because the string it has cannot be moved
+>    away from the i18n comment.
+
+#### `INDENT_BLANK_LINES`
+
+>    Set to `True` to prefer indented blank lines rather than empty
+
+#### `INDENT_CLOSING_BRACKETS`
+
+>    Put closing brackets on a separate line, indented, if the bracketed
+>    expression can't fit in a single line. Applies to all kinds of brackets,
+>    including function definitions and calls. For example:
 
 ```python
-        1 + 2*3 - 4/5
+    config = {
+        'key1': 'value1',
+        'key2': 'value2',
+        }  # <--- this bracket is indented and on a separate line
+
+    time_series = self.remote_client.query_entity_counters(
+        entity='dev3246.region1',
+        key='dns.query_latency_tcp',
+        transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
+        start_ts=now()-timedelta(days=3),
+        end_ts=now(),
+        )  # <--- this bracket is indented and on a separate line
 ```
 
-`SPACES_AROUND_POWER_OPERATOR`
+#### `INDENT_DICTIONARY_VALUE`
 
-    Set to `True` to prefer using spaces around `**`.
-
-`SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN`
-
-    Set to `True` to prefer spaces around the assignment operator for default
-    or keyword arguments.
-
-`SPACES_AROUND_DICT_DELIMITERS`
-
-    Adds a space after the opening '{' and before the ending '}' dict delimiters.
+>    Indent the dictionary value if it cannot fit on the same line as the
+>    dictionary key. For example:
 
 ```python
-        {1: 2}
+    config = {
+        'key1':
+            'value1',
+        'key2': value1 +
+                value2,
+    }
 ```
 
-    will be formatted as:
+#### `INDENT_WIDTH`
+
+>    The number of columns to use for indentation.
+
+#### `JOIN_MULTIPLE_LINES`
+
+>    Join short lines into one line. E.g., single line `if` statements.
+
+#### `NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS`
+
+>    Do not include spaces around selected binary operators. For example:
 
 ```python
-        { 1: 2 }
+    1 + 2 * 3 - 4 / 5
 ```
 
-`SPACES_AROUND_LIST_DELIMITERS`
-
-    Adds a space after the opening '[' and before the ending ']' list delimiters.
+>    will be formatted as follows when configured with `*`, `/`:
 
 ```python
-        [1, 2]
+    1 + 2*3 - 4/5
 ```
 
-    will be formatted as:
+#### `SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET`
 
-```python
-        [ 1, 2 ]
-```
+>    Insert a space between the ending comma and closing bracket of a list, etc.
 
-`SPACES_AROUND_SUBSCRIPT_COLON`
-
-    Use spaces around the subscript / slice operator.  For example:
-
-```python
-        my_list[1 : 10 : 2]
-```
-
-`SPACES_AROUND_TUPLE_DELIMITERS`
-
-    Adds a space after the opening '(' and before the ending ')' tuple delimiters.
-
-```python
-        (1, 2, 3)
-```
-
-    will be formatted as:
-
-```python
-        ( 1, 2, 3 )
-```
-
-`SPACES_BEFORE_COMMENT`
-
-    The number of spaces required before a trailing comment.
-    This can be a single value (representing the number of spaces
-    before each trailing comment) or list of values (representing
-    alignment column values; trailing comments within a block will
-    be aligned to the first column value that is greater than the maximum
-    line length within the block).
-
-    > **Note:** Lists of values may need to be quoted in some contexts
-    > (eg. shells or editor config files).
-
-    For example, with `spaces_before_comment=5`:
-
-```python
-        1 + 1 # Adding values
-```
-
-    will be formatted as:
-
-```python
-        1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment
-```
-
-    with `spaces_before_comment="15, 20"`:
-
-```python
-        1 + 1 # Adding values
-        two + two # More adding
-
-        longer_statement # This is a longer statement
-        short # This is a shorter statement
-
-        a_very_long_statement_that_extends_beyond_the_final_column # Comment
-        short # This is a shorter statement
-```
-
-    will be formatted as:
-
-```python
-        1 + 1          # Adding values <-- end of line comments in block aligned to col 15
-        two + two      # More adding
-
-        longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
-        short               # This is a shorter statement
-
-        a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
-        short                                                       # This is a shorter statement
-```
-
-`SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET`
-
-    Insert a space between the ending comma and closing bracket of a list, etc.
-
-`SPACE_INSIDE_BRACKETS`
+#### `SPACE_INSIDE_BRACKETS`
 
     Use spaces inside brackets, braces, and parentheses.  For example:
 
@@ -717,177 +608,286 @@
         my_set = { 1, 2, 3 }
 ```
 
-`SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED`
+#### `SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN`
 
-    Split before arguments if the argument list is terminated by a comma.
+>    Set to `True` to prefer spaces around the assignment operator for default
+>    or keyword arguments.
 
-`SPLIT_ALL_COMMA_SEPARATED_VALUES`
+#### `SPACES_AROUND_DICT_DELIMITERS`
 
-    If a comma separated list (`dict`, `list`, `tuple`, or function `def`) is
-    on a line that is too long, split such that each element is on a separate
-    line.
-
-`SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES`
-
-    Variation on `SPLIT_ALL_COMMA_SEPARATED_VALUES` in which, if a
-    subexpression with a comma fits in its starting line, then the
-    subexpression is not split. This avoids splits like the one for
-    `b` in this code:
+>    Adds a space after the opening '{' and before the ending '}' dict delimiters.
 
 ```python
-        abcdef(
-            aReallyLongThing: int,
-            b: [Int,
-                Int])
+        {1: 2}
 ```
 
-    with the new knob this is split as:
+>    will be formatted as:
 
 ```python
-        abcdef(
-            aReallyLongThing: int,
-            b: [Int, Int])
+        { 1: 2 }
 ```
 
-`SPLIT_BEFORE_BITWISE_OPERATOR`
+#### `SPACES_AROUND_LIST_DELIMITERS`
 
-    Set to `True` to prefer splitting before `&`, `|` or `^` rather than after.
-
-`SPLIT_BEFORE_ARITHMETIC_OPERATOR`
-
-    Set to `True` to prefer splitting before `+`, `-`, `*`, `/`, `//`, or `@`
-    rather than after.
-
-`SPLIT_BEFORE_CLOSING_BRACKET`
-
-    Split before the closing bracket if a `list` or `dict` literal doesn't fit
-    on a single line.
-
-`SPLIT_BEFORE_DICT_SET_GENERATOR`
-
-    Split before a dictionary or set generator (`comp_for`). For example, note
-    the split before the `for`:
+>    Adds a space after the opening '[' and before the ending ']' list delimiters.
 
 ```python
-        foo = {
-            variable: 'Hello world, have a nice day!'
-            for variable in bar if variable != 42
-        }
+    [1, 2]
 ```
 
-`SPLIT_BEFORE_DOT`
-
-    Split before the `.` if we need to split a longer expression:
+>    will be formatted as:
 
 ```python
-        foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))
+    [ 1, 2 ]
 ```
 
-    would reformat to something like:
+#### `SPACES_AROUND_POWER_OPERATOR`
+
+>    Set to `True` to prefer using spaces around `**`.
+
+#### `SPACES_AROUND_SUBSCRIPT_COLON`
+
+>    Use spaces around the subscript / slice operator.  For example:
 
 ```python
-        foo = ('This is a really long string: {}, {}, {}, {}'
-               .format(a, b, c, d))
+    my_list[1 : 10 : 2]
 ```
 
-`SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN`
+##### `SPACES_AROUND_TUPLE_DELIMITERS`
 
-    Split after the opening paren which surrounds an expression if it doesn't
-    fit on a single line.
-
-`SPLIT_BEFORE_FIRST_ARGUMENT`
-
-    If an argument / parameter list is going to be split, then split before the
-    first argument.
-
-`SPLIT_BEFORE_LOGICAL_OPERATOR`
-
-    Set to `True` to prefer splitting before `and` or `or` rather than after.
-
-`SPLIT_BEFORE_NAMED_ASSIGNS`
-
-    Split named assignments onto individual lines.
-
-`SPLIT_COMPLEX_COMPREHENSION`
-
-    For list comprehensions and generator expressions with multiple clauses
-    (e.g multiple `for` calls, `if` filter expressions) and which need to be
-    reflowed, split each clause onto its own line. For example:
+>    Adds a space after the opening '(' and before the ending ')' tuple delimiters.
 
 ```python
-        result = [
-            a_var + b_var for a_var in xrange(1000) for b_var in xrange(1000)
-            if a_var % b_var]
+    (1, 2, 3)
 ```
 
-    would reformat to something like:
+>    will be formatted as:
 
 ```python
-        result = [
-            a_var + b_var
-            for a_var in xrange(1000)
-            for b_var in xrange(1000)
-            if a_var % b_var]
+    ( 1, 2, 3 )
 ```
 
-`SPLIT_PENALTY_AFTER_OPENING_BRACKET`
+#### `SPACES_BEFORE_COMMENT`
 
-    The penalty for splitting right after the opening bracket.
+>    The number of spaces required before a trailing comment.
+>    This can be a single value (representing the number of spaces
+>    before each trailing comment) or list of values (representing
+>    alignment column values; trailing comments within a block will
+>    be aligned to the first column value that is greater than the maximum
+>    line length within the block).
 
-`SPLIT_PENALTY_AFTER_UNARY_OPERATOR`
+> **Note:** Lists of values may need to be quoted in some contexts
+> (eg. shells or editor config files).
 
-    The penalty for splitting the line after a unary operator.
-
-`SPLIT_PENALTY_ARITHMETIC_OPERATOR`
-
-    The penalty of splitting the line around the `+`, `-`, `*`, `/`, `//`, `%`,
-    and `@` operators.
-
-`SPLIT_PENALTY_BEFORE_IF_EXPR`
-
-    The penalty for splitting right before an `if` expression.
-
-`SPLIT_PENALTY_BITWISE_OPERATOR`
-
-    The penalty of splitting the line around the `&`, `|`, and `^` operators.
-
-`SPLIT_PENALTY_COMPREHENSION`
-
-    The penalty for splitting a list comprehension or generator expression.
-
-`SPLIT_PENALTY_EXCESS_CHARACTER`
-
-    The penalty for characters over the column limit.
-
-`SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT`
-
-    The penalty incurred by adding a line split to the logical line. The more
-    line splits added the higher the penalty.
-
-`SPLIT_PENALTY_IMPORT_NAMES`
-
-    The penalty of splitting a list of `import as` names. For example:
+>    For example, with `spaces_before_comment=5`:
 
 ```python
-        from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
-                                                                  long_argument_2,
-                                                                  long_argument_3)
+    1 + 1 # Adding values
 ```
 
-    would reformat to something like:
+>    will be formatted as:
 
 ```python
-        from a_very_long_or_indented_module_name_yada_yad import (
-            long_argument_1, long_argument_2, long_argument_3)
+    1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment
 ```
 
-`SPLIT_PENALTY_LOGICAL_OPERATOR`
+>    with `spaces_before_comment="15, 20"`:
 
-    The penalty of splitting the line around the `and` and `or` operators.
+```python
+    1 + 1 # Adding values
+    two + two # More adding
 
-`USE_TABS`
+    longer_statement # This is a longer statement
+    short # This is a shorter statement
 
-    Use the Tab character for indentation.
+    a_very_long_statement_that_extends_beyond_the_final_column # Comment
+    short # This is a shorter statement
+```
+
+>    will be formatted as:
+
+```python
+    1 + 1          # Adding values <-- end of line comments in block aligned to col 15
+    two + two      # More adding
+
+    longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
+    short               # This is a shorter statement
+
+    a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
+    short                                                       # This is a shorter statement
+```
+
+#### `SPLIT_ALL_COMMA_SEPARATED_VALUES`
+
+>    If a comma separated list (`dict`, `list`, `tuple`, or function `def`) is
+>    on a line that is too long, split such that each element is on a separate
+>    line.
+
+#### `SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES`
+
+>    Variation on `SPLIT_ALL_COMMA_SEPARATED_VALUES` in which, if a
+>    subexpression with a comma fits in its starting line, then the
+>    subexpression is not split. This avoids splits like the one for
+>    `b` in this code:
+
+```python
+    abcdef(
+        aReallyLongThing: int,
+        b: [Int,
+            Int])
+```
+
+>    with the new knob this is split as:
+
+```python
+    abcdef(
+        aReallyLongThing: int,
+        b: [Int, Int])
+```
+
+#### `SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED`
+
+>    Split before arguments if the argument list is terminated by a comma.
+
+#### `SPLIT_BEFORE_ARITHMETIC_OPERATOR`
+
+>    Set to `True` to prefer splitting before `+`, `-`, `*`, `/`, `//`, or `@`
+>    rather than after.
+
+#### `SPLIT_BEFORE_BITWISE_OPERATOR`
+
+>    Set to `True` to prefer splitting before `&`, `|` or `^` rather than after.
+
+#### `SPLIT_BEFORE_CLOSING_BRACKET`
+
+>    Split before the closing bracket if a `list` or `dict` literal doesn't fit
+>    on a single line.
+
+#### `SPLIT_BEFORE_DICT_SET_GENERATOR`
+
+>    Split before a dictionary or set generator (`comp_for`). For example, note
+>    the split before the `for`:
+
+```python
+    foo = {
+        variable: 'Hello world, have a nice day!'
+        for variable in bar if variable != 42
+    }
+```
+
+#### `SPLIT_BEFORE_DOT`
+
+>    Split before the `.` if we need to split a longer expression:
+
+```python
+    foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))
+```
+
+>    would reformat to something like:
+
+```python
+    foo = ('This is a really long string: {}, {}, {}, {}'
+           .format(a, b, c, d))
+```
+
+#### `SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN`
+
+>    Split after the opening paren which surrounds an expression if it doesn't
+>    fit on a single line.
+
+#### `SPLIT_BEFORE_FIRST_ARGUMENT`
+
+>    If an argument / parameter list is going to be split, then split before the
+>    first argument.
+
+#### `SPLIT_BEFORE_LOGICAL_OPERATOR`
+
+>    Set to `True` to prefer splitting before `and` or `or` rather than after.
+
+#### `SPLIT_BEFORE_NAMED_ASSIGNS`
+
+>    Split named assignments onto individual lines.
+
+#### `SPLIT_COMPLEX_COMPREHENSION`
+
+>    For list comprehensions and generator expressions with multiple clauses
+>    (e.g multiple `for` calls, `if` filter expressions) and which need to be
+>    reflowed, split each clause onto its own line. For example:
+
+```python
+    result = [
+        a_var + b_var for a_var in xrange(1000) for b_var in xrange(1000)
+        if a_var % b_var]
+```
+
+>    would reformat to something like:
+
+```python
+    result = [
+        a_var + b_var
+        for a_var in xrange(1000)
+        for b_var in xrange(1000)
+        if a_var % b_var]
+```
+
+#### `SPLIT_PENALTY_AFTER_OPENING_BRACKET`
+
+>    The penalty for splitting right after the opening bracket.
+
+#### `SPLIT_PENALTY_AFTER_UNARY_OPERATOR`
+
+>    The penalty for splitting the line after a unary operator.
+
+#### `SPLIT_PENALTY_ARITHMETIC_OPERATOR`
+
+>    The penalty of splitting the line around the `+`, `-`, `*`, `/`, `//`, `%`,
+>    and `@` operators.
+
+#### `SPLIT_PENALTY_BEFORE_IF_EXPR`
+
+>    The penalty for splitting right before an `if` expression.
+
+#### `SPLIT_PENALTY_BITWISE_OPERATOR`
+
+>    The penalty of splitting the line around the `&`, `|`, and `^` operators.
+
+#### `SPLIT_PENALTY_COMPREHENSION`
+
+>    The penalty for splitting a list comprehension or generator expression.
+
+#### `SPLIT_PENALTY_EXCESS_CHARACTER`
+
+>    The penalty for characters over the column limit.
+
+#### `SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT`
+
+>    The penalty incurred by adding a line split to the logical line. The more
+>    line splits added the higher the penalty.
+
+#### `SPLIT_PENALTY_IMPORT_NAMES`
+
+>    The penalty of splitting a list of `import as` names. For example:
+
+```python
+    from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
+                                                              long_argument_2,
+                                                              long_argument_3)
+```
+
+>    would reformat to something like:
+
+```python
+    from a_very_long_or_indented_module_name_yada_yad import (
+        long_argument_1, long_argument_2, long_argument_3)
+```
+
+#### `SPLIT_PENALTY_LOGICAL_OPERATOR`
+
+>    The penalty of splitting the line around the `and` and `or` operators.
+
+#### `USE_TABS`
+
+>    Use the Tab character for indentation.
 
 
 ## (Potentially) Frequently Asked Questions
