(defun delphi-jump-to-declaration () (interactive) (let ( (pt (ignore-errors (save-excursion (end-of-line) (re-search-backward "^\\(procedure\\|function\\|constructor\\|destructor\\)[ \t]+\\([_a-zA-Z][_a-zA-Z0-9]*\\>\\)?\\.?\\([_a-zA-Z][_a-zA-Z0-9]*\\)") (let ( (method-type (match-string-no-properties 1)) (class-name (if (match-string 3) (match-string-no-properties 2) "" )) (func-name (or (match-string-no-properties 3) (match-string-no-properties 2))) ) (beginning-of-buffer) (if (> (length class-name) 0) (re-search-forward (format "%s[ \t]+=" class-name))) (when (re-search-forward (format "%s[ \t]+%s\\>" method-type func-name)) (backward-word) (point)))))) ) (when pt (goto-char pt)))) (defun delphi-jump-to-implementaion() (interactive) (let ( (pt (ignore-errors (beginning-of-line) (when (re-search-forward "\\(procedure\\|function\\|constructor\\|destructor\\)[ \\t]+\\([_a-zA-Z][_a-zA-Z0-9]*\\)") (let ( (method-type (match-string-no-properties 1)) ;;procedure/function/constructor (func-name (match-string-no-properties 2)) type-name type-type) (when (re-search-backward "\\<\\([_a-zA-Z][_a-zA-Z0-9]*\\)[ \\t]*=[ \\t]*\\(class\\|interface\\)") (setq type-name (match-string-no-properties 1)) (setq type-type (match-string-no-properties 2))) (if (string= type-type "interface") (error "interface has no implementation part: %s" type-name) (progn (re-search-forward "^implementation\\>" nil t) ;;(message "%s|%s|%s" method-type type-name func-name) (if type-name (re-search-forward (format "%s[ \\t]+%s\\.[ \\t]?%s\\>" method-type type-name func-name)) (re-search-forward (format "%s[ \\t]+%s\\>" method-type func-name))))))))) ) (when pt (progn (goto-char pt) (beginning-of-line))))) (define-key delphi-mode-map (kbd "<C-S-up>") 'delphi-jump-to-declaration)(define-key delphi-mode-map (kbd "<C-S-down>") 'delphi-jump-to-implementaion)
联系客服