How to show Scala String and StringOps methods in the REPL

Just a quick note here today on how to show methods from the String class in the Scala REPL, as well as methods from the StringOps class, which aren't seen as easily.

First, if you've used tab completion in the REPL, you may already know that you can show many Scala String class methods in the REPL. If you hit the [Tab] key once you'll see a short list of String methods:

scala> "foo".[Tab]
+                     asInstanceOf          charAt                codePointAt           codePointBefore       
codePointCount        compareTo             compareToIgnoreCase   concat                contains              
contentEquals         endsWith              equalsIgnoreCase      getBytes              getChars              
indexOf               intern                isEmpty               isInstanceOf          lastIndexOf           
length                matches               offsetByCodePoints    regionMatches         replace               
replaceAll            replaceFirst          split                 startsWith            subSequence           
substring             toCharArray           toLowerCase           toString              toUpperCase           
trim                  

And then if you hit the [Tab] key a second time you'll see even more String class methods:

scala> "foo".[Tab][Tab]
!=                    ##                    $asInstanceOf         $isInstanceOf         +                     
==                    asInstanceOf          charAt                codePointAt           codePointBefore       
codePointCount        compareTo             compareToIgnoreCase   concat                contains              
contentEquals         endsWith              eq                    equals                equalsIgnoreCase      
getBytes              getChars              getClass              hashCode              indexOf               
intern                isEmpty               isInstanceOf          lastIndexOf           length                
matches               ne                    notify                notifyAll             offsetByCodePoints    
regionMatches         replace               replaceAll            replaceFirst          split                 
startsWith            subSequence           substring             synchronized          this                  
toCharArray           toLowerCase           toString              toUpperCase           trim                  
wait                  

How to show StringOps methods in the REPL

You may be aware that the Scala String class appears to have many more methods, and these methods are made available to you through some implicit conversion magic. Those methods are actually in the StringOps class, and at the moment the only way I know to show those methods is like this:

scala> val s = new scala.collection.immutable.StringOps("s")
s: scala.collection.immutable.StringOps = s

scala> s.[Tab]
*                     ++                    ++:                   +:                    /:                    
/:\                   :+                    :\                    >                     >=                    
addString             aggregate             apply                 asInstanceOf          canEqual              
capitalize            collect               collectFirst          combinations          compare               
compareTo             contains              containsSlice         copyToArray           copyToBuffer          
corresponds           count                 diff                  distinct              drop                  
dropRight             dropWhile             elements              endsWith              equalsWith            
exists                filter                filterNot             find                  findIndexOf           
findLastIndexOf       first                 firstOption           flatMap               fold                  
foldLeft              foldRight             forall                foreach               format                
formatLocal           groupBy               grouped               hasDefiniteSize       head                  
headOption            indexOf               indexOfSlice          indexWhere            indices               
init                  inits                 intersect             isDefinedAt           isEmpty               
isInstanceOf          isTraversableAgain    iterator              last                  lastIndexOf           
lastIndexOfSlice      lastIndexWhere        lastOption            length                lengthCompare         
lines                 linesIterator         linesWithSeparators   map                   max                   
maxBy                 min                   minBy                 mkString              nonEmpty              
padTo                 par                   partition             patch                 permutations          
prefixLength          product               projection            r                     reduce                
reduceLeft            reduceLeftOption      reduceOption          reduceRight           reduceRightOption     
replaceAllLiterally   repr                  reverse               reverseIterator       reverseMap            
reversedElements      sameElements          scan                  scanLeft              scanRight             
segmentLength         seq                   size                  slice                 sliding               
sortBy                sortWith              sorted                span                  split                 
splitAt               startsWith            stringPrefix          stripLineEnd          stripMargin           
stripPrefix           stripSuffix           sum                   tail                  tails                 
take                  takeRight             takeWhile             toArray               toBoolean             
toBuffer              toByte                toDouble              toFloat               toIndexedSeq          
toInt                 toIterable            toIterator            toList                toLong                
toMap                 toSeq                 toSet                 toShort               toStream              
toString              toTraversable         union                 updated               view                  
withFilter            zip                   zipAll                zipWithIndex  

There are several drawbacks here, including the part where you have to remember what package the StringOps class is in so you can import it or invoke it as shown.

If you know of a better way to list these StringOps methods, I'd be very glad to hear about it. Just leave a note in the Comments section below.