   "If t, prompt for effective date when clearing transactions during reconciliation."
   :type 'boolean
   :group 'ledger-reconcile)
+
+;; s-functions below are copied from Magnars' s.el
+;; prefix ledger-reconcile- is added to not conflict with s.el
+(defun ledger-reconcile-s-pad-left (len padding s)
+  "If S is shorter than LEN, pad it with PADDING on the left."
+  (let ((extra (max 0 (- len (length s)))))
+    (concat (make-string extra (string-to-char padding))
+	    s)))
+(defun ledger-reconcile-s-pad-right (len padding s)
+  "If S is shorter than LEN, pad it with PADDING on the right."
+  (let ((extra (max 0 (- len (length s)))))
+    (concat s
+	    (make-string extra (string-to-char padding)))))
+(defun ledger-reconcile-s-left (len s)
+  "Return up to the LEN first chars of S."
+  (if (> (length s) len)
+      (substring s 0 len)
+    s))
+(defun ledger-reconcile-s-right (len s)
+  "Return up to the LEN last chars of S."
+  (let ((l (length s)))
+    (if (> l len)
+	(substring s (- l len) l)
+      s)))
+
+(defun ledger-reconcile-truncate-right (str len)
+  "Truncate STR right side with max LEN characters, and pad with '…' if truncated."
+  (if (and (>= len 0) (> (length str) len))
+      (ledger-reconcile-s-pad-right len "…" (ledger-reconcile-s-left (- len 1) str))
+    str))
+
+(defun ledger-reconcile-truncate-left (str len)
+  "Truncate STR left side with max LEN characters, and pad with '…' if truncated."
+  (if (and (>= len 0) (> (length str) len))
+      (ledger-reconcile-s-pad-left len "…" (ledger-reconcile-s-right (- len 1) str))
+    str))
 
 (defun ledger-reconcile-get-cleared-or-pending-balance (buffer account)
   "Use BUFFER to Calculate the cleared or pending balance of the ACCOUNT."

  :group 'ledger)

(defcustom ledger-recon-buffer-name "*Reconcile*"
  "Name to use for reconciliation window."
  :group 'ledger-reconcile)

(defcustom ledger-narrow-on-reconcile t

	"Default header string for the reconcile buffer.

If non-nil, the name of the account being reconciled will be substituted
        into the '%s'.  If nil, no header will be displayed."
  :type 'string
  :group 'ledger-reconcile)

(defcustom ledger-reconcile-buffer-line-format "%(date)s %-4(code)s %-50(payee)s %-30(account)s %15(amount)s\n"
	"Format string for the ledger reconcile posting format.
Available fields are date, status, code, payee, account,
amount.  The format for each field is %WIDTH(FIELD), WIDTH can be
preced by a minus sign which mean to left justify and pad the
field.  WIDTH is the minimum number of characters to display;
if string is longer, it is not truncated unless
ledger-reconcile-buffer-payee-max-chars or
ledger-reconcile-buffer-account-max-chars is defined."
  :type 'string
  :group 'ledger-reconcile)

(defcustom ledger-reconcile-buffer-payee-max-chars -1
  "If positive, truncate payee name right side to max number of characters."
  :type 'integer
  :group 'ledger-reconcile)

(defcustom ledger-reconcile-buffer-account-max-chars -1
  "If positive, truncate account name left side to max number of characters."
  :type 'integer
  :group 'ledger-reconcile)

(defcustom ledger-reconcile-sort-key "(0)"
  "Key for sorting reconcile buffer.

Possible values are '(date)', '(amount)', '(payee)' or '(0)' for no sorting, i.e. using ledger file order."
  :type 'string
  :group 'ledger-reconcile)

