The first step is defining the goals/requirements of being a programmer. The generality of such a question makes any answer hard, and likely cause one to stray from the core. I will try to keep what follows pure as possible, and disregard specific skills required for web development vs. low-level systems vs application development, etc.

Having watched Jiro Dreams Of Sushi, his task is to provide excellence in food, in service, and overall experience. And at the root he needs to understand each component of the food and the service intimately, so that he can put them together in a way that is both pleasurable and fitting to the customer. He uses what he knows and the resources he has to create the best dishes he can.

For a programmer, the core of our trade is algorithms, and their combinations. You may not need to know them at the smallest details, or even that they are called algorithms, but to accomplish anything you will use them. Combining larger programs together in a specific way to perform something novel is an algorithm, though we may not call it that.

Next, data structures, understanding how to store information in a way that your algorithms can use and alter. This underlying knowledge is key to creating larger things from many small things.

Next, simplicity, combining logic and code together to accomplish the goals alone is not enough. While it may be simple to combine large things together, the question should exist of whether it could be done more simply. Simplicity can be hard to accomplish, but is easy to appreciate. Simplicity means avoiding cleverness, if possible, as it can make the program hard to be changed or maintained. Simplicity is elegant refinement, which leads to doing small things very well.

Those three things, in my mind, are the only pure things necessary to being a programmer. Algorithms, data structures, and simplicity.

The reasons none of the other things apply in my mind to the overly-general title of just programmer is that they are not required by every programmer.

Text Editor - Cannot pen and paper be used just as well in the task of constructing a program as a text edit?

Programming Language - Maybe I could have leniency here, you do need language to describe yourself, but not necessarily a programming language.

Databases - This is much higher-level than a regular data-structure, and as such isn't a necessity. Applies more to specific fields.

Algorithms - Yes, even if not known by name.

Math - This isn't a requirement, though it is a nicety. Some get by without knowing much more than the very basics of Arithmetic and maybe a little basic Algebra. It applies more to specific fields.

Debugging & Testing - These aren't necessary, but they help ensure quality or finding issues.

Documentation/Comments - If the code is simple enough, it should describe itself. That isn't to say documentation and comments aren't important, but they aren't necessities either. You should describe as much in comments and documentation as necessary, to provide clarity and usable instruction, and is a great skill to have.

I hope I've explained things clearly enough. Knowing one's craft is understanding the fundamentals, and that comes much further ahead of the tools one uses, within reason. In my opinion the single best thing for describing the craft of programming is the Unix Philosophy[1].

[1]: http://en.wikipedia.org/wiki/Unix_philosophy