Ich bekomme das von Dir beschriebene erste Ergebnis nur, wenn ich beim Aufruf von `texindy` Option `-r` mit angebe. Ohne die Option erhalte ich den Bereich für "Drei Seiten" korrekt als "1–3". In der `ind`-Datei sieht das so aus:
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
\lettergroup{D}
\item Drei Seiten, 1--3
\indexspace
\lettergroup{E}
\item Eine Seite, 1
\indexspace
\lettergroup{Z}
\item Zwei Seiten, 1, 2
\item Zweimalig, 1, 2
\end{theindex}
Um auch die Bereiche aus nur zwei Seiten zusammenzufassen, kann man `:man-range-length` entsprechend heruntersetzen (Voreinstellung ist 2):
\begin{filecontents*}{twopage-ranges.xdy}
(define-location-class "arabic-page-numbers"
("arabic-numbers") :min-range-length 1)
\end{filecontents*}
\documentclass{scrartcl}
\usepackage{blindtext}
\usepackage{makeidx}
\makeindex
\begin{document}
\index{Eine Seite|(}\index{Drei Seiten|(}
\blindtext
\index{Eine Seite|)}
\index{Zwei Seiten|(}\index{Zweimalig}
\Blindtext[4]
\index{Zwei Seiten|)}\index{Zweimalig}
\Blindtext[5]
\index{Drei Seiten|)}
\printindex
\end{document}
Nach dem `pdflatex`-, `xelatex`- oder `lualatex`-Lauf und dem Aufruf »`texindy -M twopage-ranges test.idx`« oder auch »`texindy -M twopage-ranges -M ranges test.idx`« erhält man dann die `ind`-Datei:
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
\lettergroup{D}
\item Drei Seiten, 1--3
\indexspace
\lettergroup{E}
\item Eine Seite, 1
\indexspace
\lettergroup{Z}
\item Zwei Seiten, 1--2
\item Zweimalig, 1--2
\end{theindex}
Wie man allerdings sieht, bleibt es dabei, dass implizite und explizite Bereiche gleich behandelt werden. Wie man das ändern kann, weiß ich im Augenblick auch nicht.
Alle Tests wurden mit
<pre>xindy release: 2.5.0
xindy script version: 1.18
xindy kernel version: 3.0
CLISP version 2.49 (2010-07-07) (built on tug [130.225.2.178])
architecture: I686</pre>
von TeX Live 2014 unter Linux durchgeführt. Andere Versionen können eventuell durchaus Bugs haben, die die explizite Angabe von `-M ranges` immer erforderlich macht.
machen.