This was making me absolutely insane, so I found a hackish, but effective solution to the issue.
Chrome stores it's search engines in a simple sqlite3 database. I found that you can create a trigger when chrome goes to add the search engine that causes the database insert statement to be ignored.
Note that the search engines are still kept in memory, so they will still show up in the list until the browser is restarted. However you wont have to clear them out all the time, and so if you want to add your own search engines, you won't have to worry about accidentally deleting them (yes, manually adding search engines will still work).
First you must locate the
Web data file.
Mac OS X:
~/Library/Application Support/Google/Chrome/Default/Web Data
C:\Documents and Settings\<username>\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data
C:\Users\<username>\AppData\Local\Google\Chrome\User Data\Default\Web Data
~/.config/google-chrome/Default/Web Data or
Then open it with an sqlite3 editor.
Chrome must be shut down at this point.
The official sqlite web site has a download page with a pre-compiled command line utility for the various operating systems. Though any editor capable of working with sqlite3 databases will work.
For the command line utility, use a command such as the following (don't forget to escape or quote the space in the file name):
sqlite3 /path/to/Web\ Data
Add the trigger.
CREATE TRIGGER no_auto_keywords BEFORE INSERT ON keywords WHEN (NEW.originating_url IS NOT NULL AND NEW.originating_url != '') BEGIN SELECT RAISE(IGNORE); END;
You're done. Close the editor and start chrome back up.
The way it works is that when chrome goes to add auto-add a search engine to the
keywords table, chrome sets the
originating_url field to the web site it came from. The trigger basically looks for any inserts with a non-empty
originating_url field, and issues a
RAISE(IGNORE) which causes the statement to be silently skipped.
Manually added search engines don't have an
originating_url, and so the trigger allows them to be added.