Как выделить определенную строку в emacs?

Мне нужно выделить средство для emacs, чтобы пометить некоторые строки в файле при работе с ним. Это должно быть что-то вроде M-s h l, но должно работать на основе номера строки, а не регулярного выражения. Я хочу выделить текущую строку, но hl-line-mode не подходит, так как мне нужно выделить много строк, каждый раз, когда я нажимаю определенную клавишу на каждой из них.


person Necto    schedule 22.01.2013    source источник
comment
Некоторые строки - это регион. См. stackoverflow.com/questions/491257/emacs-region-highlighting. вам нужна highlight.el библиотека   -  person artscan    schedule 22.01.2013
comment
Эти строки не являются последовательными. Это просто набор интересных строк.   -  person Necto    schedule 22.01.2013
comment
Круто, я даже не знала, что хочу этого. +1   -  person harpo    schedule 22.01.2013
comment
Пакет bm ниже — это то, что я рекомендую, а не изобретать велосипед. Но изобретать колесо — это весело!   -  person event_jr    schedule 23.01.2013


Ответы (3)


Я просто быстро написал следующее:

(defun find-overlays-specifying (prop pos)
  (let ((overlays (overlays-at pos))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))

(defun highlight-or-dehighlight-line ()
  (interactive)
  (if (find-overlays-specifying
       'line-highlight-overlay-marker
       (line-beginning-position))
      (remove-overlays (line-beginning-position) (+ 1 (line-end-position)))
    (let ((overlay-highlight (make-overlay
                              (line-beginning-position)
                              (+ 1 (line-end-position)))))
        (overlay-put overlay-highlight 'face '(:background "lightgreen"))
        (overlay-put overlay-highlight 'line-highlight-overlay-marker t))))


(global-set-key [f8] 'highlight-or-dehighlight-line)

(Здесь find-overlays-specifying взят из страницы руководства)

Он выделит текущую строку, а при повторном использовании удалит ее.

Возможно, следующее также может быть полезным: удаление всего вашего выделения из буфера (может быть опасно, вам может не понадобиться, если вы выделяете важные вещи)

(defun remove-all-highlight ()
  (interactive)
  (remove-overlays (point-min) (point-max))
  )

(global-set-key [f9] 'remove-all-highlight)
person PascalVKooten    schedule 22.01.2013
comment
Это не работает, если точка находится в начале или в конце некоторых строк. - person Necto; 22.01.2013
comment
Или, может быть, это конфликтует с моим выделением брекетов. - person Necto; 22.01.2013
comment
но выделение точки в самом конце строки по-прежнему не работает. - person Necto; 22.01.2013
comment
Теперь, когда вы упомянули об этом, я не могу удалить его, когда точка находится в конце строки. - person PascalVKooten; 22.01.2013
comment
Это хорошо как временное решение. Но у него все еще есть проблема с show-paren-mode и с hl-line-mode. - person Necto; 22.01.2013
comment
Я думаю, что использовал hl-line-mode, но по какой-то причине отказался от него. В чем сложность? - person PascalVKooten; 22.01.2013
comment
Как уже было сказано, hl-line-mode использует оверлеи для выделения текущей строки, а ваша функция определяет ее как существующую оверлей и не ставит свою собственную. Таким образом, линия остается подсвеченной только в режиме Hl, а когда я убираю с нее точку, она вообще становится не выделенной. - person Necto; 22.01.2013
comment
Если выключить режим hl, подсветка остается или нет? - person PascalVKooten; 22.01.2013
comment
И есть ли причина, по которой вы хотите использовать оба из них? В противном случае просто придерживайтесь того или другого :) - person PascalVKooten; 22.01.2013
comment
Конечно, они оба полезны, потому что режим hl-line-mode помогает с путаницей текста с длинными строками, а Highlight-or-degighlight-line помогает визуально акцентировать некоторые строки, выделять их. Если я выключаю режим hl, то основные моменты остаются. Я думаю, вам следует использовать какой-то именованный оверлей, чтобы избежать коллизий с другими режимами, но я пока не знаю, как - person Necto; 22.01.2013
comment
Может быть, вы могли бы попробовать эту часть в редактировании? Как только я выясню эту часть, я смогу исправить это раз и навсегда :) - person PascalVKooten; 22.01.2013
comment
Я добавил вашему оверлею уникальное свойство 'line-highlight-overlay-marker, чтобы оно никогда не конфликтовало с другим режимом использования оверлея. - person Necto; 22.01.2013
comment
И ответ на вопрос в ответе: (#‹наложение с 619 на 661 в *скретч*›) - person Necto; 22.01.2013
comment
Тогда не стесняйтесь обновлять ответ. Я не мог передать это другое свойство по какой-то причине... - person PascalVKooten; 22.01.2013

Вы можете использовать bm.el. Вы можете установить bm.el из MELPA.

bm.el предоставляет bm-toggle для выделения и снятия выделения текущей строки. bm.el также предоставляет bm-bookmark-regexp, который выделяет только совпавшие строки. И вы можете переключаться между выделенными строками с помощью bm-previous и bm-next.

Ниже приведен пример конфигурации bm.el.

(require 'bm)
(global-set-key (kbd "<f5>") 'bm-toggle)
(global-set-key (kbd "<f6>") 'bm-previous)
(global-set-key (kbd "<f7>") 'bm-next)
(global-set-key (kbd "<f8>") 'bm-bookmark-regexp)
person syohex    schedule 22.01.2013
comment
Спасибо. Это хорошо, но я думаю, что это немного тяжело для такой простой задачи. - person Necto; 22.01.2013
comment
bm прост, гибок, мощен и интуитивно понятен. - person EdwardGarson; 01.10.2015

Bookmark+ делает то, что вы просите. Используйте C-x p RET (по умолчанию), чтобы установить закладку в точке. Кроме того, вы можете настроить вид выделения для таких закладок. Это похоже на то, что предлагает bm.el (ответ syohex), но более гибкое.

person Drew    schedule 26.09.2013
comment
Обратите внимание, что закладки не будут работать в буферах EWW, только в каталогах и файлах. Я искал решение в Emacs, которое позволило бы мне выделять определенные строки в буфере EWW, и мне на ум пришли регистры и закладки. Хотя регистры можно использовать для запоминания определенных точек в буфере веб-страницы и последующего перехода к ним, закладки использовать нельзя. (Буферы EWW не требовались для OP, я просто хотел расширить ваш ответ.) - person hajovonta; 16.05.2019
comment
@hajovonta: Нет, я не думаю, что это правда. С Bookmark+ закладки EWW должны работать нормально, в том числе и для буферов. Конечно, сам EWW все время меняется, поэтому некоторые изменения могли вызвать проблему, о которой я еще не знаю. Если вы считаете, что обнаружили проблему, сообщите мне о ней: M-x customize-group bookmark-plus, затем перейдите (например, щелкните) по ссылке Send Bug Report, которая поможет вам подготовить электронное письмо для меня. Спасибо. - person Drew; 16.05.2019
comment
Я не эксперт, но у меня почему-то сложилось впечатление, что закладки EWW предназначены только для URL-адресов EWW. Мне нужно было добавить в закладки позицию в буфере EWW. Возможно ли это с Bookmark+? - person hajovonta; 16.05.2019
comment
@hajovonta: Нет, закладки EWW работают как обычные закладки. Они добавляют в закладки не только URL-адрес, но и позицию на этой странице (например, HTML-странице), где вы установили закладку. И вы также можете установить закладку региона в таком месте. - person Drew; 21.05.2019