In ledger-mode, if TAB is pressed in an entry, call out to "entry".

This commit is contained in:
John Wiegley 2009-02-11 20:16:45 -04:00
parent 78418ad92b
commit 20bf2547d1
2 changed files with 53 additions and 26 deletions

View file

@ -201,38 +201,36 @@ Return the difference in the format of a time value."
(if (ledger-time-less-p moment date)
(throw 'found t)))))))
(defun ledger-add-entry (entry-text)
(defun ledger-add-entry (entry-text &optional insert-at-point)
(interactive
(list
(read-string "Entry: " (concat ledger-year "/" ledger-month "/"))))
(let* ((args (with-temp-buffer
(insert entry-text)
(eshell-parse-arguments (point-min) (point-max))))
(date (car args))
(insert-year t)
(ledger-buf (current-buffer))
exit-code)
(if (string-match "\\([0-9]+\\)/\\([0-9]+\\)/\\([0-9]+\\)" date)
(setq date
(encode-time 0 0 0 (string-to-number (match-string 3 date))
(string-to-number (match-string 2 date))
(string-to-number (match-string 1 date)))))
(ledger-find-slot date)
(save-excursion
(if (re-search-backward "^Y " nil t)
(setq insert-year nil)))
(unless insert-at-point
(let ((date (car args)))
(if (string-match "\\([0-9]+\\)/\\([0-9]+\\)/\\([0-9]+\\)" date)
(setq date
(encode-time 0 0 0 (string-to-number (match-string 3 date))
(string-to-number (match-string 2 date))
(string-to-number (match-string 1 date)))))
(ledger-find-slot date)))
(save-excursion
(insert
(with-temp-buffer
(setq exit-code
(apply #'ledger-run-ledger ledger-buf "entry"
(mapcar 'eval args)))
(if (= 0 exit-code)
(if insert-year
(buffer-substring 2 (point-max))
(buffer-substring 7 (point-max)))
(concat (if insert-year entry-text
(substring entry-text 6)) "\n"))) "\n"))))
(goto-char (point-min))
(if (looking-at "Error: ")
(progn
(message (buffer-string))
(error))
(buffer-string)))
"\n"))))
(defun ledger-current-entry-bounds ()
(save-excursion
@ -1172,7 +1170,17 @@ the default."
(while (pcomplete-here
(if (eq (save-excursion
(ledger-thing-at-point)) 'entry)
(ledger-entries)
(progn
(let ((text (buffer-substring (line-beginning-position)
(line-end-position))))
(delete-region (line-beginning-position)
(line-end-position))
(condition-case err
(ledger-add-entry text t)
((error)
(insert text))))
(goto-char (line-end-position))
(throw 'pcompleted t))
(ledger-accounts)))))
(defun ledger-fully-complete-entry ()

View file

@ -167,6 +167,9 @@ namespace {
else if (arg == "note") {
tmpl.note = (*++begin).to_string();
}
else if (arg == "rest") {
; // just ignore this argument
}
else {
// Without a preposition, it is either:
//
@ -281,6 +284,14 @@ namespace {
"No accounts, and no past entry matching '" << tmpl.payee_mask <<"'");
}
} else {
bool any_xact_has_amount = false;
foreach (entry_template_t::xact_template_t& xact, tmpl.xacts) {
if (xact.amount) {
any_xact_has_amount = true;
break;
}
}
foreach (entry_template_t::xact_template_t& xact, tmpl.xacts) {
std::auto_ptr<xact_t> new_xact;
@ -300,11 +311,6 @@ namespace {
else
new_xact.reset(new xact_t(*matching->xacts.front()));
}
if (new_xact.get()) {
found_commodity = &new_xact->amount.commodity();
// Ignore the past amount from these transactions
new_xact->amount = amount_t();
}
}
if (! new_xact.get())
@ -317,7 +323,6 @@ namespace {
acct = journal.find_account_re(xact.account_mask->expr.str());
if (! acct)
acct = journal.find_account(xact.account_mask->expr.str());
new_xact->account = acct;
// Find out the default commodity to use by looking at the last
// commodity used in that account
@ -328,12 +333,17 @@ namespace {
j++) {
foreach (xact_t * x, (*j)->xacts) {
if (x->account == acct && ! x->amount.is_null()) {
found_commodity = &x->amount.commodity();
new_xact.reset(new xact_t(*x));
break;
}
}
}
if (! new_xact.get())
new_xact.reset(new xact_t);
new_xact->account = acct;
} else {
if (xact.from)
new_xact->account = journal.find_account("Liabilities:Unknown");
else
@ -341,6 +351,15 @@ namespace {
}
}
if (new_xact.get() && ! new_xact->amount.is_null()) {
found_commodity = &new_xact->amount.commodity();
if (any_xact_has_amount)
new_xact->amount = amount_t();
else
any_xact_has_amount = true;
}
if (xact.amount) {
new_xact->amount = *xact.amount;
if (xact.from)