Bagaimana cara menyorot baris tertentu di emacs?

Saya perlu menyorot fasilitas emacs untuk menandai beberapa baris dalam file saat bekerja dengannya. Seharusnya seperti M-s h l tetapi harus bekerja berdasarkan nomor baris, bukan pada regexp. Saya ingin menyorot baris saat ini, tetapi hl-line-mode tidak cocok, karena saya perlu menyorot banyak baris, setiap kali saya menekan tombol tertentu pada masing-masing baris.


person Necto    schedule 22.01.2013    source sumber
comment
Beberapa garis merupakan suatu wilayah. Lihat stackoverflow.com/questions/491257/emacs-region-highlighting Mei jadilah Anda membutuhkan highlight.el perpustakaan   -  person artscan    schedule 22.01.2013
comment
Garis-garis ini tidak berurutan. Itu hanyalah serangkaian garis yang menarik.   -  person Necto    schedule 22.01.2013
comment
Keren, aku bahkan tidak tahu aku menginginkan ini. +1   -  person harpo    schedule 22.01.2013
comment
Paket bm dari bawah adalah apa yang saya rekomendasikan untuk menciptakan kembali roda. Tapi menciptakan roda itu menyenangkan!   -  person event_jr    schedule 23.01.2013


Jawaban (3)


Saya segera menulis yang berikut ini:

(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)

(Di sini find-overlays-specifying berasal dari halaman manual)

Ini akan menyorot baris saat ini, dan ketika digunakan lagi akan menghapusnya.

Mungkin yang berikut ini bisa berguna juga: menghapus semua highlight Anda dari buffer (bisa berbahaya, Anda mungkin tidak menginginkannya jika Anda menyorot hal-hal penting)

(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
Ini tidak berfungsi jika titik di awal atau akhir beberapa baris. - person Necto; 22.01.2013
comment
Atau, mungkin itu bertentangan dengan pilihan kawat gigi saya. - person Necto; 22.01.2013
comment
tetapi unhighlight tetap tidak berfungsi pada titik di akhir baris. - person Necto; 22.01.2013
comment
Sekarang setelah Anda menyebutkannya, saya tidak dapat menghapusnya ketika titik berada di akhir baris. - person PascalVKooten; 22.01.2013
comment
Ini bagus sebagai solusi sementara. Tapi masih ada masalah dengan mode show-paren, dan dengan mode hl-line. - person Necto; 22.01.2013
comment
Saya rasa saya menggunakan mode hl-line tetapi menghentikannya karena beberapa alasan. Apa komplikasinya? - person PascalVKooten; 22.01.2013
comment
Seperti yang telah dikatakan, mode hl-line menggunakan overlay untuk menyorot baris saat ini, dan fungsi Anda mendeteksinya sebagai overlay yang ada, dan tidak menempatkannya sendiri. Jadi garis tetap digarisbawahi hanya dengan mode Hl, dan ketika saya menghapus titik darinya, garis itu menjadi tidak ditandai sama sekali - person Necto; 22.01.2013
comment
Kalau mode hl mati, highlightnya tetap apa tidak? - person PascalVKooten; 22.01.2013
comment
Dan apakah ada alasan Anda ingin menggunakan keduanya? Kalau tidak, pertahankan saja yang satu atau yang lain :) - person PascalVKooten; 22.01.2013
comment
Tentu saja keduanya berguna, karena mode hl-line membantu teks berantakan dengan garis-garis panjang, dan highlight-or-degighlight-line membantu memberi aksen visual pada beberapa baris, untuk menandainya. Jika saya mematikan mode hl, sorotan Anda tetap ada. Saya pikir Anda harus menggunakan semacam overlay bernama, untuk menghindari tabrakan dengan mode lain, tapi saya belum tahu caranya - person Necto; 22.01.2013
comment
Mungkin bisakah Anda mencoba bagian itu di edit? Setelah saya mengetahui bagian itu, saya dapat memperbaikinya untuk selamanya :) - person PascalVKooten; 22.01.2013
comment
Saya telah menambahkan properti uniq 'line-highlight-overlay-marker' pada overlay Anda sehingga tidak akan pernah bertentangan dengan mode penggunaan overlay lainnya - person Necto; 22.01.2013
comment
Dan jawaban dari pertanyaan di jawabannya: (#‹overlay dari 619 ke 661 di *gores*›) - person Necto; 22.01.2013
comment
Jangan ragu untuk memperbarui jawabannya. Saya tidak dapat memberikannya properti lain karena alasan tertentu... - person PascalVKooten; 22.01.2013

Anda dapat menggunakan bm.el. Anda dapat menginstal bm.el dari MELPA.

bm.el menyediakan bm-toggle untuk menyorot dan menghapus sorotan pada baris saat ini. bm.el juga menyediakan bm-bookmark-regexp yang hanya menyorot baris yang cocok. Dan Anda dapat melompat di antara garis yang disorot dengan bm-previous dan bm-next

Berikut adalah contoh konfigurasi 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
Terima kasih. Itu bagus, tapi menurut saya agak berat untuk tugas sederhana seperti itu. - person Necto; 22.01.2013
comment
bm sederhana, fleksibel, kuat, dan intuitif. - person EdwardGarson; 01.10.2015

Bookmark+ melakukan apa yang Anda minta. Gunakan C-x p RET (secara default) untuk menyetel bookmark pada titik tersebut. Dan Anda dapat mengonfigurasi jenis penyorotan yang Anda inginkan untuk bookmark tersebut. Ini mirip dengan apa yang bm.el tawarkan (jawaban syohex), tetapi lebih fleksibel.

person Drew    schedule 26.09.2013
comment
Harap dicatat bahwa bookmark tidak akan berfungsi di buffer EWW, hanya di direktori dan file. Saya sedang mencari solusi di Emacs yang memungkinkan saya menyorot baris tertentu dalam buffer EWW dan register serta bookmark muncul di benak saya. Meskipun register dapat digunakan untuk mengingat titik-titik tertentu dalam buffer halaman web dan kemudian melompat ke titik tersebut, bookmark tidak dapat digunakan. (Buffer EWW bukan persyaratan untuk OP, saya hanya ingin memperluas jawaban Anda.) - person hajovonta; 16.05.2019
comment
@hajovonta: Tidak, menurut saya itu tidak benar. Dengan Bookmark+, bookmark EWW akan berfungsi dengan baik, termasuk untuk buffer. Tentu saja EWW sendiri berubah sepanjang waktu, jadi beberapa perubahan mungkin menimbulkan masalah yang belum saya sadari. Jika Anda merasa menemukan masalah maka silakan laporkan kepada saya: M-x customize-group bookmark-plus, lalu ikuti (misalnya klik) tautan Send Bug Report, yang membantu Anda menyiapkan email kepada saya. Terima kasih. - person Drew; 16.05.2019
comment
Saya bukan ahlinya, tapi entah bagaimana saya merasa bahwa bookmark EWW hanya untuk url EWW saja. Saya perlu menandai posisi di buffer EWW. Apakah itu mungkin dengan Bookmark+? - person hajovonta; 16.05.2019
comment
@hajovonta: Tidak, bookmark EWW berfungsi seperti bookmark biasa. Mereka mem-bookmark bukan hanya URL tetapi juga posisi pada halaman tersebut (misalnya halaman HTML) tempat Anda mengatur bookmark. Dan Anda juga dapat mengatur penanda wilayah di lokasi tersebut. - person Drew; 21.05.2019