diff --git a/CHANGES.md b/CHANGES.md
index 98aa2cf0..2324522f 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,17 @@
 News
 ====
 
+0.7.3
+-----
+
+*Release date: TBD*
+
+* Bug fixes
+    * Fixed a bug in display a span of history items when only an end index is supplied
+* Enhancements
+    * Added the ability to exclude commands from the help menu (**eof** included by default)
+    * Redundant list command removed and features merged into history command
+
 0.7.2
 -----
 
diff --git a/cmd2.py b/cmd2.py
index 4befe019..3755ef56 100755
--- a/cmd2.py
+++ b/cmd2.py
@@ -1121,9 +1121,12 @@ class Cmd(cmd.Cmd):
         Commands may be terminated with: {}
         Command-line arguments allowed: {}
         Output redirection and pipes allowed: {}
-        Settable parameters: {}\n""".format(not self.case_insensitive, str(self.terminators),
-                                            self.allow_cli_args,
-                                            self.allow_redirection, ' '.join(self.settable)))
+        Parsing of @options commands:
+            Use POSIX-style argument parser (vs Windows): {}
+            Strip Quotes when using Windows-style argument parser: {}
+            Use a list of arguments instead of a single argument string: {}
+        \n""".format(not self.case_insensitive, str(self.terminators), self.allow_cli_args, self.allow_redirection,
+                     POSIX_SHLEX, STRIP_QUOTES_FOR_NON_POSIX, USE_ARG_LIST))
 
     def do_help(self, arg):
         """List available commands with "help" or detailed help with "help cmd"."""
@@ -1592,7 +1595,8 @@ class Cmd(cmd.Cmd):
 
         | no arg:         list all
         | arg is integer: list one history item, by index
-        | arg is string:  string search
+        | a..b, a:b, a:, ..b -> list history items by a span of indices (inclusive)
+        | arg is string:  list all commands matching string search
         | arg is /enclosed in forward-slashes/: regular expression search
         """
         # If arguments are being passed as a list instead of as a string
@@ -1602,10 +1606,20 @@ class Cmd(cmd.Cmd):
             else:
                 arg = ''
 
+        # If an argument was supplied, then retrieve partial contents of the history
         if arg:
-            history = self.history.get(arg)
+            # If a character indicating a slice is present, retrieve a slice of the history
+            if '..' in arg or ':' in arg:
+                # Get a slice of history
+                history = self.history.span(arg)
+            else:
+                # Get item(s) from history by index or string search
+                history = self.history.get(arg)
         else:
+            # If no arg given, then retrieve the entire history
             history = self.history
+
+        # Display the history items retrieved
         for hi in history:
             if opts.script:
                 self.poutput(hi)
@@ -1628,38 +1642,6 @@ class Cmd(cmd.Cmd):
         except IndexError:
             return None
 
-    def do_list(self, arg):
-        """list [arg]: lists command(s) from history in a flexible/searchable way.
-
-        :param arg: str - behavior varies as follows:
-
-        * no arg -> list most recent command
-        * arg is integer -> list one history item, by index
-        * a..b, a:b, a:, ..b -> list spans from a (or start) to b (or end)
-        * arg is string -> list all commands matching string search
-        * arg is /enclosed in forward-slashes/ -> regular expression search
-        """
-        try:
-            history = self.history.span(arg or '-1')
-        except IndexError:
-            history = self.history.search(arg)
-        for hi in history:
-            self.poutput(hi.pr())
-
-    def help_list(self):
-        """Print help for do_list()."""
-        help_str = """Lists command(s) from history in a flexible/searchable way.
-
-    Usage:  list [arg]
-
-    Where arg is:
-    no arg                               -> list most recent command
-    arg is integer                       -> list one history item, by index
-    a..b, a:b, a:, ..b                   -> list spans from a (or start) to b (or end)
-    arg is string                        -> list all commands matching string search
-    arg is /enclosed in forward-slashes/ -> regular expression search"""
-        self.stdout.write("{}\n".format(help_str))
-
     def do_edit(self, arg):
         """Edit a file or command in a text editor.
 
@@ -2170,7 +2152,7 @@ class History(list):
             raise IndexError
         if not results.group('separator'):
             return [self[self._to_index(results.group('start'))]]
-        start = self._to_index(results.group('start'))
+        start = self._to_index(results.group('start')) or 0  # Ensure start is not None
         end = self._to_index(results.group('end'))
         reverse = False
         if end is not None:
diff --git a/docs/freefeatures.rst b/docs/freefeatures.rst
index 3c740c00..5e354549 100644
--- a/docs/freefeatures.rst
+++ b/docs/freefeatures.rst
@@ -220,8 +220,6 @@ also provide `bash-like history list editing`_.
 
 .. automethod:: cmd2.Cmd.do_history
 
-.. automethod:: cmd2.Cmd.do_list
-
 .. automethod:: cmd2.Cmd.do_run
 
 Quitting the application
diff --git a/examples/exampleSession.txt b/examples/exampleSession.txt
index 893d7b59..62c130f0 100644
--- a/examples/exampleSession.txt
+++ b/examples/exampleSession.txt
@@ -3,8 +3,8 @@
 
 Documented commands (type help <topic>):
 ========================================
-_relative_load  edit  help     list  orate  py    run   say  shell      show
-cmdenvironment  eof   history  load  pause  quit  save  set  shortcuts  speak
+_relative_load  edit  history  orate  py    run   say  shell      show
+cmdenvironment  help  load     pause  quit  save  set  shortcuts  speak
 
 (Cmd) help say
 Repeats what you tell me to.

history and list commands are largely redundant
The **history** and **list** commands largely have the same basic functionality of displaying commands from the history. 

There is a partial overlap in the functionality where they both support some of the same features.  But each also has at least one feature that the other doesn't have.

It would probably be more convenient for end users to combine all of the functionality into one common **history** command and remove the **list** command.
diff --git a/tests/conftest.py b/tests/conftest.py
index 3977de5f..41bd007a 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -15,8 +15,8 @@ import cmd2
 # Help text for base cmd2.Cmd application
 BASE_HELP = """Documented commands (type help <topic>):
 ========================================
-_relative_load  edit  history  load   py    run   set    shortcuts
-cmdenvironment  help  list     pause  quit  save  shell  show
+_relative_load  edit  history  pause  quit  save  shell      show
+cmdenvironment  help  load     py     run   set   shortcuts
 """
 
 # Help text for the history command
@@ -24,7 +24,8 @@ HELP_HISTORY = """history [arg]: lists past commands issued
 
         | no arg:         list all
         | arg is integer: list one history item, by index
-        | arg is string:  string search
+        | a..b, a:b, a:, ..b -> list history items by a span of indices (inclusive)
+        | arg is string:  list all commands matching string search
         | arg is /enclosed in forward-slashes/: regular expression search
 
 Usage: history [options] (limit on which commands to include)
diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index ce47ef47..5783d944 100644
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -142,48 +142,62 @@ shortcuts
 """)
     assert out == expected
 
-
-def test_base_list(base_app):
+def test_history_with_string_argument(base_app):
     run_cmd(base_app, 'help')
     run_cmd(base_app, 'shortcuts')
-    out = run_cmd(base_app, 'list')
+    run_cmd(base_app, 'help history')
+    out = run_cmd(base_app, 'history help')
     expected = normalize("""
--------------------------[2]
-shortcuts
+-------------------------[1]
+help
+-------------------------[3]
+help history
 """)
     assert out == expected
 
 
-def test_list_with_string_argument(base_app):
+def test_history_with_integer_argument(base_app):
     run_cmd(base_app, 'help')
     run_cmd(base_app, 'shortcuts')
-    run_cmd(base_app, 'help list')
-    out = run_cmd(base_app, 'list help')
+    out = run_cmd(base_app, 'history 1')
     expected = normalize("""
 -------------------------[1]
 help
--------------------------[3]
-help list
 """)
     assert out == expected
 
 
-def test_list_with_integer_argument(base_app):
+def test_history_with_integer_span(base_app):
     run_cmd(base_app, 'help')
     run_cmd(base_app, 'shortcuts')
-    out = run_cmd(base_app, 'list 1')
+    run_cmd(base_app, 'help history')
+    out = run_cmd(base_app, 'history 1..2')
     expected = normalize("""
 -------------------------[1]
 help
+-------------------------[2]
+shortcuts
 """)
     assert out == expected
 
+def test_history_with_span_start(base_app):
+    run_cmd(base_app, 'help')
+    run_cmd(base_app, 'shortcuts')
+    run_cmd(base_app, 'help history')
+    out = run_cmd(base_app, 'history 2:')
+    expected = normalize("""
+-------------------------[2]
+shortcuts
+-------------------------[3]
+help history
+""")
+    assert out == expected
 
-def test_list_with_integer_span(base_app):
+def test_history_with_span_end(base_app):
     run_cmd(base_app, 'help')
     run_cmd(base_app, 'shortcuts')
-    run_cmd(base_app, 'help list')
-    out = run_cmd(base_app, 'list 1..2')
+    run_cmd(base_app, 'help history')
+    out = run_cmd(base_app, 'history :2')
     expected = normalize("""
 -------------------------[1]
 help
@@ -201,17 +215,13 @@ def test_base_cmdenvironment(base_app):
         Commands may be terminated with: [';']
         Command-line arguments allowed: True
         Output redirection and pipes allowed: True
+        Parsing of @options commands:
+            Use POSIX-style argument parser (vs Windows): False
+            Strip Quotes when using Windows-style argument parser: True
+            Use a list of arguments instead of a single argument string: False
+            
 """)
-    assert out[:4] == expected[:4]
-    assert out[4].strip().startswith('Settable parameters: ')
-
-    # Settable parameters can be listed in any order, so need to validate carefully using unordered sets
-    settable_params = {'continuation_prompt', 'default_file_name', 'prompt', 'abbrev', 'quiet', 'case_insensitive',
-                       'colors', 'echo', 'timing', 'editor', 'feedback_to_output', 'debug', 'autorun_on_edit',
-                       'locals_in_py'}
-    out_params = set(out[4].split("Settable parameters: ")[1].split())
-    assert settable_params == out_params
-
+    assert out == expected
 
 def test_base_load(base_app, request):
     test_dir = os.path.dirname(request.module.__file__)
diff --git a/tests/test_transcript.py b/tests/test_transcript.py
index c31b519d..03fec92a 100644
--- a/tests/test_transcript.py
+++ b/tests/test_transcript.py
@@ -106,9 +106,8 @@ def test_base_with_transcript(_cmdline_app):
 
 Documented commands (type help <topic>):
 ========================================
-_relative_load  help     load   py    save  shell      speak
-cmdenvironment  history  orate  quit  say   shortcuts
-edit            list     pause  run   set   show
+_relative_load  edit  history  orate  py    run   say  shell      show
+cmdenvironment  help  load     pause  quit  save  set  shortcuts  speak
 
 (Cmd) help say
 Repeats what you tell me to.
diff --git a/tests/transcript.txt b/tests/transcript.txt
index 013e2d0f..d0fd86a6 100644
--- a/tests/transcript.txt
+++ b/tests/transcript.txt
@@ -2,9 +2,8 @@
 
 Documented commands (type help <topic>):
 ========================================
-_relative_load  help     load   py    save  shell      speak
-cmdenvironment  history  orate  quit  say   shortcuts
-edit            list     pause  run   set   show
+_relative_load  edit  history  orate  py    run   say  shell      show
+cmdenvironment  help  load     pause  quit  save  set  shortcuts  speak
 
 (Cmd) help say
 Repeats what you tell me to.

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest mock
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/python-cmd2/cmd2.git@a0d829e4105cd431198feb43534adaf953b090ba#egg=cmd2
exceptiongroup==1.2.2
iniconfig==2.1.0
mock==5.2.0
packaging==24.2
pluggy==1.5.0
pyparsing==3.2.3
pytest==8.3.5
six==1.17.0
tomli==2.2.1

name: cmd2
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - mock==5.2.0
      - packaging==24.2
      - pluggy==1.5.0
      - pyparsing==3.2.3
      - pytest==8.3.5
      - six==1.17.0
      - tomli==2.2.1
prefix: /opt/conda/envs/cmd2

tests/test_cmd2.py::test_base_help tests/test_cmd2.py::test_base_help_history tests/test_cmd2.py::test_history_with_integer_span tests/test_cmd2.py::test_history_with_span_start tests/test_cmd2.py::test_history_with_span_end tests/test_cmd2.py::test_base_cmdenvironment tests/test_cmd2.py::test_allow_redirection tests/test_cmd2.py::test_input_redirection tests/test_transcript.py::test_base_with_transcript tests/test_transcript.py::test_transcript_from_cmdloop
tests/test_cmd2.py::test_output_redirection
tests/test_cmd2.py::test_ver tests/test_cmd2.py::test_base_shortcuts tests/test_cmd2.py::test_base_show tests/test_cmd2.py::test_base_show_long tests/test_cmd2.py::test_base_set tests/test_cmd2.py::test_base_set_not_supported tests/test_cmd2.py::test_base_shell tests/test_cmd2.py::test_base_py tests/test_cmd2.py::test_base_run_python_script tests/test_cmd2.py::test_base_error tests/test_cmd2.py::test_base_history tests/test_cmd2.py::test_history_with_string_argument tests/test_cmd2.py::test_history_with_integer_argument tests/test_cmd2.py::test_base_load tests/test_cmd2.py::test_base_load_default_file tests/test_cmd2.py::test_base_relative_load tests/test_cmd2.py::test_base_save tests/test_cmd2.py::test_pipe_to_shell tests/test_cmd2.py::test_send_to_paste_buffer tests/test_cmd2.py::test_base_timing tests/test_cmd2.py::test_base_debug tests/test_cmd2.py::test_base_colorize tests/test_cmd2.py::test_edit_no_editor tests/test_cmd2.py::test_edit_file tests/test_cmd2.py::test_edit_number tests/test_cmd2.py::test_edit_blank tests/test_cmd2.py::test_base_py_interactive tests/test_cmd2.py::test_base_cmdloop_with_queue tests/test_cmd2.py::test_base_cmdloop_without_queue tests/test_cmd2.py::test_cmdloop_without_rawinput tests/test_transcript.py::Cmd2TestCase::runTest tests/test_transcript.py::TestMyAppCase::runTest tests/test_transcript.py::test_optparser tests/test_transcript.py::test_optparser_nosuchoption tests/test_transcript.py::test_comment_stripping tests/test_transcript.py::test_optarser_correct_args_with_quotes_and_midline_options tests/test_transcript.py::test_optarser_options_with_spaces_in_quotes tests/test_transcript.py::test_commands_at_invocation tests/test_transcript.py::test_select_options tests/test_transcript.py::test_multiline_command_transcript_with_comments_at_beginning tests/test_transcript.py::test_invalid_syntax tests/test_transcript.py::test_regex_transcript
cmd2.py examples/exampleSession.txt docs/freefeatures.rst CHANGES.md
cmd2.py examples/exampleSession.txt docs/freefeatures.rst CHANGES.md