Studly Previous
Summary: Jump to the previous intra-word. Works like a finer-grained Option-Leftarrow.
Requires: BBEdit 8 (similar functionality built-into BBEdit 8.5)
Suggested Key Binding: Control-Leftarrow
Last Modified: 2019-10-02
Description
This script brings CodeWarrior’s Control-Leftarrow functionality to BBEdit. It lets you jump between the parts of words 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-Leftarrow. Instead of moving to the previous word, it moves to the previous 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: asymmetry compared to Studly Next in that it jumps over runs of spaces
on
run
tell
application
"BBEdit"
try
tell
window
1
set
oldOffset
to
characterOffset
of
selection
if
oldOffset
is
1
then
return
set
firstChar
to
character
(
oldOffset - 1)
as
string
set
inWordNow
to
my
isWordCharacter(
firstChar)
repeat
with
newOffset
from
(
oldOffset - 1)
to
1
by
-1
if
newOffset
is
2
then
select
insertion point
before
character
1
return
end
if
set
c
to
character
newOffset
as
string
-- FIXME: is there a way to run the loop so this can be clean, like in Studly Next?
if
inWordNow
and
not
my
isWordCharacter(
c)
then
select
insertion point
after
character
newOffset
return
else
if
not
inWordNow
and
my
isWordCharacter(
c)
then
select
insertion point
after
character
newOffset
return
else
if
my
stopHere(
c,
inWordNow)
or
newOffset
is
1
then
select
insertion point
before
character
newOffset
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
inWordNow
and
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