4 Tidy
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0, 5},
Row[{Control@{{r,2}, 2, Dynamic@q}}],
{{q,10}, 5, 20},
Initialization:> (t[i_]:=5*i)
]


There are several approachestwo approaches that seem to work partially, but not altogether.:

DynamicModule[{y,t},
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2}, 2, Dynamic@q}}],
{{q,10}, 5, 20},
Initialization:> (t[i_]:=5*i)
]]

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0, 5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
{y, None},
Initialization:> (t[i_]:=5*i)
]


localizes y. But similar attempts to localize a function such as t fail.

Control@ controls

Additionally, controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What
What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization)?

Additionally, controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
Initialization:> (t[i_]:=5*i)
]


There are several approaches that seem to work partially, but not altogether.

DynamicModule[{y,t},
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
Initialization:> (t[i_]:=5*i)
]]

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
{y, None},
Initialization:> (t[i_]:=5*i)
]


localizes y. But similar attempts to localize a function such as t fail.

Control@ controls

Additionally, controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization)?

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0, 5},
Row[{Control@{{r,2}, 2, Dynamic@q}}],
{{q,10}, 5, 20},
Initialization:> (t[i_]:=5*i)
]


There are two approaches that seem to work partially, but not altogether:

DynamicModule[{y,t},
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2}, 2, Dynamic@q}}],
{{q,10}, 5, 20},
Initialization:> (t[i_]:=5*i)
]]

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0, 5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
{y, None},
Initialization:> (t[i_]:=5*i)
]


localizes y. But similar attempts to localize a function such as t fail.

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization)?

Additionally, controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

3 Move syntax coloring to its own question (not addressed in answers here anyway).

ControlsAdditionally, controls defined with Control@ don't highlight the associated symbols to indicate localizationdon't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization? What's going on with Control@ controls: why are their symbols colored differently (thus needing a redundant localization)?

Controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization? What's going on with Control@ controls: why are their symbols colored differently (thus needing a redundant localization)?

Additionally, controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization)?

2 Expand details
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,t20},
Initialization:> (t[i_]:=5*i)
]


Wrapping the whole Manipulate in a Model[{y,t}, ... seems to work, but marks y and t in the Manipulate in red (on macOS) which leaves me wondering if it's the right thing to do.

There are several approaches that seem to work partially, but not altogether.

DynamicModule

Wrapping in DynamicModule works to localize any symbols not localized by Manipulate

DynamicModule[{y,t},
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
Initialization:> (t[i_]:=5*i)
]]


but this places y and t in an outer scope, which seems the wrong way to proceed.

ControlType -> None

For some symbols, the form {sym, None} works to localize sym, but only it seems for limited cases. For example

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
{y, None},
Initialization:> (t[i_]:=5*i)
]


localizes y. But similar attempts to localize a function such as t fail.

Control@ controls

Controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization? What's going on with Control@ controls: why are their symbols colored differently (thus needing a redundant localization)?

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,t},
Initialization:> (t[i_]:=5*i)
]


Wrapping the whole Manipulate in a Model[{y,t}, ... seems to work, but marks y and t in the Manipulate in red (on macOS) which leaves me wondering if it's the right thing to do.

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
Initialization:> (t[i_]:=5*i)
]


Wrapping the whole Manipulate in a Model[{y,t}, ... seems to work, but marks y and t in the Manipulate in red (on macOS) which leaves me wondering if it's the right thing to do.

There are several approaches that seem to work partially, but not altogether.

DynamicModule

Wrapping in DynamicModule works to localize any symbols not localized by Manipulate

DynamicModule[{y,t},
Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
Initialization:> (t[i_]:=5*i)
]]


but this places y and t in an outer scope, which seems the wrong way to proceed.

ControlType -> None

For some symbols, the form {sym, None} works to localize sym, but only it seems for limited cases. For example

Manipulate[
y = 4*x;
Plot[y*x^z+t[q], {x, 0, r}],
{z, 0,5},
Row[{Control@{{r,2},2,Dynamic@q}}],
{{q,10}, 5,20},
{y, None},
Initialization:> (t[i_]:=5*i)
]


localizes y. But similar attempts to localize a function such as t fail.

Control@ controls

Controls defined with Control@ don't highlight the associated symbols to indicate localization, which makes it very hard to read through code and understand how things are scoped. DynamicModule can be used to fix this (and even leaves the symbol in the inner Manipulate scope).

What is the correct approach to localizing symbols inside Manipulate? Is there are reason to prefer DynamicModule over ControlType -> None in general, or vice versa? How should local functions be localized (esp. if the natural thing to be ding is specifying them in Initialization? What's going on with Control@ controls: why are their symbols colored differently (thus needing a redundant localization)?

1