You can shorten your scenarios - and even get rid of a few - by phrasing them in declarative, rather than imperative, language.
For instance:
Given the cart has two products in
When I empty the cart
Then I should see it has nothing in it.
This could be just as true of an actual shopping cart as a UI. It has no implementation details in it. You can see that some of the steps correspond to more than one of yours; this is a good thing as it keeps the complexity in the code where it's more maintainable.
If we phrase your other scenario this way, we get:
Given my cart is empty
Then I should not be able to empty it again.
There's no "when" here because the "then" is simply true for that state.
Do you really need this scenario, though? Would it kill you or your company to release with the ability to empty an already-empty cart? This is essentially aesthetic. It's been added to make the UI easier to use, and the only way to tell if a UI is usable is to actually use it. If you ever find these kind of scenarios, I recommend taking them out. You can always unit-test the logic that leads to the button being enabled or disabled.
If you change to this style of language, then remove any scenarios that are only testing aesthetics and usability, you'll find your feature files become much, much smaller.
I also recommend putting the most interesting or surprising scenarios at the top. For instance, this would be a more interesting scenario (and yes, it has two "whens" in it, because it describes the behavior associated with an interaction between two different users):
Given a user put a copy of "Moby Dick" in his cart
When the last copy of "Moby Dick" is sold
And the user comes back to look at his cart
Then it should tell him, "Sorry, this item is currently out of stock."
This would be even more interesting:
Given a user put a new copy of "Moby Dick" in his cart
And there are second-hand copies of "Moby Dick" available
When the last new copy of "Moby Dick" is sold
And the user comes back to look at his cart
Then it should tell him, "Sorry, this item is currently out of stock."
And it should also show the way to the second-hand copies with,
"2nd hand copies are available."
That would be a differentiating scenario; something that your shop did differently to other shops, and therefore of great interest to the business.
By putting the most interesting ones at the top, it won't matter that the feature file is long. We all know how a cart works for buying and selling items, and we're not reading the scenarios at the bottom by that stage anyway.
Andy Waite is right when he says there are no hard rules, so play it by ear; if it doesn't work, do something differently. Hopefully these hints will help too.