Studly Next

Summary: Jump to the next intra-word. Works like a finer-grained Option-Rightarrow.
Requires: BBEdit 8 (similar functionality built-into BBEdit 8.5)
Suggested Key Binding: Control-Rightarrow
Last Modified: 2019-10-02

Description

This script brings CodeWarrior’s Control-Rightarrow functionality to BBEdit. It lets you jump between the parts of words with with inner caps (a.k.a. studly caps or camel case). This is very useful for programmers who follow the Apple or Java naming conventions.

This script works like a finer-grained Option-Rightarrow. Instead of moving to the next word, it moves to the next capitalized part of a word. For instance, the underscored positions in: _set_Script_Error_Number_.

Installation Instructions · Download in Compiled Format · Download in Text Format

Script

property wordCharacters : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"

-- FIXME: doesn't advance past word at end of document

on run
    
tell application "BBEdit"
        
try
            
tell window 1
                
set oldOffset to characterOffset of selection
                
set firstChar to character oldOffset as string
                
set inWordNow to my isWordCharacter(firstChar)
                
repeat with newOffset from oldOffset + 1 to count characters
                    
set c to character newOffset as string
                    
if my stopHere(c, inWordNow) then
                        
select insertion point after character (newOffset - 1)
                        
return
                    
end if
                
end repeat
            
end tell
        
end try
    
end tell
end run

on stopHere(c, inWordNow)
    
if isCapitalLetter(c) then
        
return true
    
else if not isWordCharacter(c) then
        
return true
    
else if not inWordNow and isWordCharacter(c) then
        
return true
    
else
        
return false
    
end if
end stopHere

on isCapitalLetter(c)
    
if (ASCII number of c) is greater than or equal to 65 ¬
        
and (ASCII number of c) is less than 97 then
        
return true
    
else
        
return false
    
end if
end isCapitalLetter

on isWordCharacter(c)
    
return wordCharacters contains c
end isWordCharacter