2013-12-05 2 views
2

Я начинаю изучать Emacs Lisp, и в качестве первого проекта я хотел бы улучшить режим fortran в Emacs. Я хотел бы отметить имя подпрограммы в буфере, а затем нажать комбинацию клавиш. Поднять буфер со всеми строками в указанном источнике, где указано имя подпрограммы.Выделите имя во всем буфере Emacs

я обнаружил, что я могу получить выделенный текст с помощью:

(defun get-selected-text (beg end) 
    (interactive 
    (if (use-region-p) 
     (list (region-beginning) (region-end)) 
    (list nil nil))) 
    (message "%s" (if (and beg end) 
        (buffer-substring-no-properties beg end) ""))) 

и может хранить номера строк из подпрограмм с помощью:

(defun get-line-numbers (str) 
    (interactive "sEnter string: ") 
    (save-excursion 
    (goto-char 0) 
    (let ((sok 1) (list nil) pp) 
     (while sok 
     (setq pp (search-forward str nil t)) 
     (if pp (push (line-number-at-pos pp) list) 
      (setq sok nil))) 
     (message "%s" list)))) 

Теперь я хотел бы, чтобы открыть новый буфер подобный когда я использую Ctrl-x Ctrl-b, чтобы выполнить list-buffers, а затем отобразить каждый номер строки вместе с текстом на линии, и пользователь может выбрать данную строку и нажать . Введите, чтобы перейти к данной строке в исходном буфере.

+4

Итак, вы переустанавливаете 'происшествие'? –

+0

Спасибо, что сообщили мне. Я проверю информацию о режиме Emacs 'execute'. Он выглядит очень многообещающим, может быть, я откажусь от своего проекта, если я получу режим выполнения. –

+0

Emacs - это старый интерпретатор lisp, который используется многими программистами как редактор. Таким образом, очень сложно найти общую полезную функцию, которая еще не реализована. Имея это в виду, мой ответ ниже следует понимать как упражнение по программированию - и только как таковое. Тем не менее, стать лизром имеет свои большие преимущества, если вам нужны ваши особые функции, которых нет в emacs и, конечно же, ни в одном другом редакторе. – Tobias

ответ

2

Для отображения списка-буфера вы используете get-buffer-create и очистите его erase-buffer (возможно, оно уже вышло).

Для вывода строк, которые вы ищете в текущем буфере, сохраните строку в строке и поместите ее в буфер списка через with-current-buffer и insert.

Чтобы сделать возврат специальным текстом или сделать его кликабельным, поместите текстовое свойство с локальной раскладкой на нем.

С помощью этого руководства вы сможете найти все, что вам нужно в руководстве elisp.

Что касается вашего кода, вы получите начало и конец текущей области с помощью (interactive "r"). При этом вы также получаете сообщение об ошибке, если нет активной области.

+0

Спасибо! Я попробую это .. –

4

Просто хотел показать вам мою версию occur-dwim. Помню, что я провел некоторое время, чтобы узнать о переменной regexp-history. Первая функция похожа на вашу get-selected-text.

(defun region-str-or-symbol() 
    "Return the contents of region or current symbol." 
    (if (region-active-p) 
     (buffer-substring-no-properties 
     (region-beginning) 
     (region-end)) 
    (thing-at-point 'symbol))) 

(defun occur-dwim() 
    "Call `occur' with a sane default." 
    (interactive) 
    (push (region-str-or-symbol) regexp-history) 
    (call-interactively 'occur)) 
+0

Спасибо! Я посмотрю на это, но сначала: Как мне установить режим 'incoming'? Я googled для 'происходить.el', но я ничего не мог найти? –

+0

В комплекте с Emacs. У вас уже есть это. Просто попробуйте M-x 'meet' –

+0

Да, у меня есть! Но что-то случилось с режимом fortran после загрузки 'происходит'. Теперь больше нет подсветки синтаксиса .. –

Смежные вопросы