+emacs+让beancount插件支持中文账户名
beancoun使用时,只需要确保首项固定大类和次项以英文/数字开头即可,后续账户可用纯中文。
使用package
安装beancount.el
,然后在use-package
中如下配置(包含了指定本地账户文件):
(use-package beancount :demand t :mode ("\\.bean\\(?:count\\)?\\'" . beancount-mode) :bind (:map beancount-mode-map ("C-c C-d" . beancount-insert-chosen-date) ("C-c C-w" . beancount-refile-to-eof)) ;; ("\C-c TAB" . beancount-insert-account) :config ;;为账户名匹配添加中文支持 (setq beancount-account-chars "[:alnum:]-_\\cC:") ;; 同上 (setq beancount-account-regexp (concat (regexp-opt beancount-account-categories) "\\(?::[[:alnum:]-_\\cC]+\\)+")) ;; 现在可以匹配加减乘和括号,但是不支持千分位逗号 (setq beancount-number-regexp "[-]?(?\\(?:[-+*]?[0-9]+\\.?[0-9]*\\)+)?") ;; 以下是一次性定义好的变量,需要重新载入 (setq beancount-posting-regexp (concat "^\\s-+" "\\(" beancount-account-regexp "\\)" "\\(?:\\s-+\\(\\(" beancount-number-regexp "\\)" "\\s-+\\(" beancount-currency-regexp "\\)\\)\\)?")) (setq beancount-balance-regexp (concat "^" beancount-date-regexp "\\s-+balance\\s-+" "\\(" beancount-account-regexp "\\)\\s-+" "\\(\\(" beancount-number-regexp "\\)\\s-+\\(" beancount-currency-regexp "\\)\\)")) (setq beancount-font-lock-keywords `((,beancount-transaction-regexp (1 'beancount-date) (2 (beancount-face-by-state (match-string 2)) t) (3 (beancount-face-by-state (match-string 2)) t)) (,beancount-posting-regexp (1 'beancount-account) (2 'beancount-amount nil :lax)) (,beancount-metadata-regexp (1 'beancount-metadata) (2 'beancount-metadata t)) (,beancount-directive-regexp (1 'beancount-directive)) (,beancount-timestamped-directive-regexp (1 'beancount-date) (2 'beancount-directive)) ;; Fontify section headers when composed with outline-minor-mode. (,(concat "^\\(" beancount-outline-regexp "\\).*") (0 (beancount-outline-face))) ;; Tags and links. (,(concat "\\#[" beancount-tag-chars "]*") . 'beancount-tag) (,(concat "\\^[" beancount-tag-chars "]*") . 'beancount-link) ;; Accounts not covered by previous rules. (,beancount-account-regexp . 'beancount-account) ;; Number followed by currency not covered by previous rules. (,(concat beancount-number-regexp "\\s-+" beancount-currency-regexp) . 'beancount-amount) )) (defvar beancount-account-files nil "List of account files") (defun beancount-collect-pos-alist (regexp n) "Return a list of conses mapping matches of REGEXP group N in the current buffer to a position of the match beginning." (let ((result)) ;; collect accounts from files (save-excursion (dolist (f beancount-account-files) (with-current-buffer (find-file-noselect f) (goto-char (point-min)) (while (re-search-forward regexp nil t) (push (cons (match-string-no-properties n) (match-beginning 0)) result)))) (nreverse result)))) ;; 指定账户补全文件路径 (setq beancount-account-files '("~/.emacs.d/org/bill/accounts.bean")) )
账户补全原理及解说参考这个链接。