diff --git a/doc/whats-new.rst b/doc/whats-new.rst
index 3dad685aaf7..3845999f513 100644
--- a/doc/whats-new.rst
+++ b/doc/whats-new.rst
@@ -27,6 +27,11 @@ New Features
 Breaking changes
 ~~~~~~~~~~~~~~~~
 
+- The ``__repr__`` of a :py:class:`xarray.Dataset`'s ``coords`` and ``data_vars``
+  ignore ``xarray.set_option(display_max_rows=...)`` and show the full output
+  when called directly as, e.g., ``ds.data_vars`` or ``print(ds.data_vars)``
+  (:issue:`5545`, :pull:`5580`).
+  By `Stefan Bender <https://github.com/st-bender>`_.
 
 Deprecations
 ~~~~~~~~~~~~
diff --git a/xarray/core/formatting.py b/xarray/core/formatting.py
index 7f292605e63..70d1a61f56c 100644
--- a/xarray/core/formatting.py
+++ b/xarray/core/formatting.py
@@ -377,14 +377,12 @@ def _mapping_repr(
 ):
     if col_width is None:
         col_width = _calculate_col_width(mapping)
-    if max_rows is None:
-        max_rows = OPTIONS["display_max_rows"]
     summary = [f"{title}:"]
     if mapping:
         len_mapping = len(mapping)
         if not _get_boolean_with_default(expand_option_name, default=True):
             summary = [f"{summary[0]} ({len_mapping})"]
-        elif len_mapping > max_rows:
+        elif max_rows is not None and len_mapping > max_rows:
             summary = [f"{summary[0]} ({max_rows}/{len_mapping})"]
             first_rows = max_rows // 2 + max_rows % 2
             keys = list(mapping.keys())
@@ -418,7 +416,7 @@ def _mapping_repr(
 )
 
 
-def coords_repr(coords, col_width=None):
+def coords_repr(coords, col_width=None, max_rows=None):
     if col_width is None:
         col_width = _calculate_col_width(_get_col_items(coords))
     return _mapping_repr(
@@ -427,6 +425,7 @@ def coords_repr(coords, col_width=None):
         summarizer=summarize_coord,
         expand_option_name="display_expand_coords",
         col_width=col_width,
+        max_rows=max_rows,
     )
 
 
@@ -544,21 +543,22 @@ def dataset_repr(ds):
     summary = ["<xarray.{}>".format(type(ds).__name__)]
 
     col_width = _calculate_col_width(_get_col_items(ds.variables))
+    max_rows = OPTIONS["display_max_rows"]
 
     dims_start = pretty_print("Dimensions:", col_width)
     summary.append("{}({})".format(dims_start, dim_summary(ds)))
 
     if ds.coords:
-        summary.append(coords_repr(ds.coords, col_width=col_width))
+        summary.append(coords_repr(ds.coords, col_width=col_width, max_rows=max_rows))
 
     unindexed_dims_str = unindexed_dims_repr(ds.dims, ds.coords)
     if unindexed_dims_str:
         summary.append(unindexed_dims_str)
 
-    summary.append(data_vars_repr(ds.data_vars, col_width=col_width))
+    summary.append(data_vars_repr(ds.data_vars, col_width=col_width, max_rows=max_rows))
 
     if ds.attrs:
-        summary.append(attrs_repr(ds.attrs))
+        summary.append(attrs_repr(ds.attrs, max_rows=max_rows))
 
     return "\n".join(summary)
 
diff --git a/xarray/tests/test_formatting.py b/xarray/tests/test_formatting.py
index b9ba57f99dc..d5e7d2ee232 100644
--- a/xarray/tests/test_formatting.py
+++ b/xarray/tests/test_formatting.py
@@ -509,15 +509,16 @@ def test__mapping_repr(display_max_rows, n_vars, n_attr):
     long_name = "long_name"
     a = np.core.defchararray.add(long_name, np.arange(0, n_vars).astype(str))
     b = np.core.defchararray.add("attr_", np.arange(0, n_attr).astype(str))
+    c = np.core.defchararray.add("coord", np.arange(0, n_vars).astype(str))
     attrs = {k: 2 for k in b}
-    coords = dict(time=np.array([0, 1]))
+    coords = {_c: np.array([0, 1]) for _c in c}
     data_vars = dict()
-    for v in a:
+    for (v, _c) in zip(a, coords.items()):
         data_vars[v] = xr.DataArray(
             name=v,
             data=np.array([3, 4]),
-            dims=["time"],
-            coords=coords,
+            dims=[_c[0]],
+            coords=dict([_c]),
         )
     ds = xr.Dataset(data_vars)
     ds.attrs = attrs
@@ -525,25 +526,37 @@ def test__mapping_repr(display_max_rows, n_vars, n_attr):
     with xr.set_options(display_max_rows=display_max_rows):
 
         # Parse the data_vars print and show only data_vars rows:
-        summary = formatting.data_vars_repr(ds.data_vars).split("\n")
+        summary = formatting.dataset_repr(ds).split("\n")
         summary = [v for v in summary if long_name in v]
-
         # The length should be less than or equal to display_max_rows:
         len_summary = len(summary)
         data_vars_print_size = min(display_max_rows, len_summary)
         assert len_summary == data_vars_print_size
 
+        summary = formatting.data_vars_repr(ds.data_vars).split("\n")
+        summary = [v for v in summary if long_name in v]
+        # The length should be equal to the number of data variables
+        len_summary = len(summary)
+        assert len_summary == n_vars
+
+        summary = formatting.coords_repr(ds.coords).split("\n")
+        summary = [v for v in summary if "coord" in v]
+        # The length should be equal to the number of data variables
+        len_summary = len(summary)
+        assert len_summary == n_vars
+
     with xr.set_options(
         display_expand_coords=False,
         display_expand_data_vars=False,
         display_expand_attrs=False,
     ):
         actual = formatting.dataset_repr(ds)
+        coord_s = ", ".join([f"{c}: {len(v)}" for c, v in coords.items()])
         expected = dedent(
             f"""\
             <xarray.Dataset>
-            Dimensions:      (time: 2)
-            Coordinates: (1)
+            Dimensions:      ({coord_s})
+            Coordinates: ({n_vars})
             Data variables: ({n_vars})
             Attributes: ({n_attr})"""
         )
