Ledger sort of has that built in, actually, but it only works if you have a similar transaction in the past. For example, I can say this on the command line:
$ ledger xact 11/5 mcd dinner 10.55
and ledger spits out 2015/11/05 McDonald's
Expenses:Food:Dinner $10.55
Liabilities:Credit Card
This falls down when you're traveling to new places, because in the command `mcd` is just a regex that matches on the payee.