I think it's possible to do this with the Move Pad (you can enable it in interface options under Accessibility).
If you enable it, you can make a macro that toggles strafe, like this:
/click MovePadStrafeLeft
You could then create an AddOn, which remaps your movement keys to proxy buttons, which run macros that toggle movement through the Move Pad. If you just make the button run that simple macro on key press and key release, then it's practically the same as normal movement keys, but you can create more complex functionality by changing the macro mid-click.
I don't have time to do it right now, and likely not in near future, but it would work kinda similarly to this:
http://www.mmo-champion.com/threads/...rgeted-Casting
Basically your custom auto-walk button would work like the CancelButton in AoEonRelease. If you press the CancelButton when you're holding down an action button with an AoE ability, the cancel button will alter the state of that action button in such a way that it won't cast the spell when that key is released. Similarly your auto-walk button would change the state of your movement keys in such a way that when you release the movement key, it won't toggle off the movement.
There could be some unexpected issues with this, but it should work at some level. The issue with AoEonRelease was that there is no way to figure out whether the ability is castable when the key is pressed down, so you in some situations it casts the spell when the button is released without seeing the ground AoE targeting circle. Even though the idea was cool otherwise, that kind of inconsistency is annoying. Maybe there would be issues with this kind of auto-walk AddOn, maybe there wouldn't. It's hard to consider all possibilities without testing it in practice.
- - - Updated - - -
Here's a very simple AddOn that adds toggleable auto-walk to all directions using the Move Pad.
Code:
UIParentLoadAddOn("Blizzard_MovePad")
MovePadFrame:Hide()
local Directions = {
["Forward"] = "SHIFT-W",
["StrafeLeft"] = "SHIFT-A",
["Backward"] = "SHIFT-S",
["StrafeRight"] = "SHIFT-D",
}
for direction, key in pairs(Directions) do
local buttonName = "MovementProxyButton" .. direction
local b = CreateFrame("Button", buttonName, UIParent, "SecureActionButtonTemplate")
b:SetAttribute("type", "macro")
b:SetAttribute("macrotext", "/click MovePad" .. direction)
b:RegisterForClicks("AnyDown")
SetOverrideBindingClick(b, true, key, buttonName)
end
This lacks some basic logic needed to make it usable in practice, but it does allow you to strafe auto-walk. It requires different binding for each direction, and sometimes you need to press the button twice (if you break the auto-walk by using your normal movement keys, then it still thinks that the auto-walk button is pressed down). As mentioned earlier, I don't have the time right now to develop this any further, but it seems completely possible to make it worth with one global auto-walk key that works in all directions.