18 мая 2007 г.

Tip #1

Преамбула

Иногда, находясъ в какой-нибудь функции, требуется быстро перейти на предыдущую или последующую объявленную функцию в коде. Использовать для этого способ, описанный в Tip #0, мне показалось, немного накладно: для этого нужно вызвать команду my-show-functions-list, перейти в буфер *Occur* и выбрать нужную функцию. Гораздо удобнее было бы "скакать" по объявлениям функций, используя определённые клавишные комбинации, оставаясь при этом в текущем буфере.

Задача

Удобное и быстрое перемещение между функциями в текущем буфере, без использования буфера *Occur*.

Решение

Для решения задачи нам потребуются стандартные команды Emacs search-forward-regexp и search-backward-regexp. Как можно догадаться из названий, эти две команды позволяют осуществлять поиск по регулярному выражению в текущем буфере. В качестве аргумента для поиска, мы будем использовать регулярное выражение из Tip #0. Нам также потребуется создать две новые функции с названием my-jump-to-function-forward и my-jump-to-function-backward.

Функции my-jump-to-function-forward и my-jump-to-function-backward

Взяв за основу функцию my-show-functions-list из Tip #0, получаем следуюший Emacs lisp код:


(defun my-jump-to-function-forward()
  (interactive)
  (search-forward-regexp
   "^\t+\\(function\\|public function\\|protected function\\|private function\\|public static\\|protected static\\|private static\\|def\\)"
   ))

(defun my-jump-to-function-backward()
  (interactive)
  (search-backward-regexp
   "^\t+\\(function\\|public function\\|protected function\\|private function\\|public static\\|protected static\\|private static\\|def\\)"
   ))

Теперь осталось назначить клавишные комбинации. Для себя я выбрал ^N и ^P.


(global-set-key [(control n)] 'my-jump-to-function-forward)
(global-set-key [(control p)] 'my-jump-to-function-backward)

Всё. Можно наслаждаться быстрыми "прыжками" между функциями, оставаясь при этом в текущем буфере.

2 комментария:

Alex Ott комментирует...

Большая часть режимов для языков программирования обеспечивает реализации функций beginning-of-defun (`C-M-a') и end-of-defun (`C-M-e'), которые не имеют зависимости от конктретного языка. Это будет удобней, чем пользоваться своим кодом. Ну а клавиши переопределить - дело нехитрое :-)

Alex Ott комментирует...

что-то у меня blogspot не дает вставить заголовок поста при редактировании. посмотри - может это что-то в настройках или стилях?