Edited on July 11, 2018 after I realized that my function was not working with the latest ESS version anymore.
To change this behaviour, you can use the customize-variable
function for ess-smart-S-assign
and change the "Ess Smart S Assign Key" value to "Nothing",
or you can write in your init
file:
(setq ess-insert-assign nil)
ess-insert-assign
replaces the now obsolete ess-smart-S-assign
function, though this latter is maintained as an alias for backward compatibility. So, this works as well:
(setq ess-smart-S-assign nil)
I did not like the default behaviour either, but I use yasnippet
to autocomplete the assignment sign, which is rather uneasy to type.
To try to answer your question:
why would they force that sort of behavior?
It might be that the reason ess-mode-hook
doesn't work has to do with the way keyboard remapping works, rather than a stubborn behaviour.
ess-mode-hook
does work for other things, but this keyboard remapping seems to follow some particular rules:
In the customization option page for this variable, there is this information: "You may change this to nil at any time. However, if you change it to another string, it must be set before ESS is loaded." So it seems that this has to be changed before loading ESS. Since you were trying to change the default value to "nil", it is unclear to me why this was not working after loading ESS though. I used to be able to disable it with:
(eval-after-load 'ess-site
'(ess-toggle-underscore nil))
but this recently stopped working.