Pertanyaan Bagaimana saya bisa meniru penelusuran Vim * di GNU Emacs?


Di Vim * kunci dalam pencarian mode normal untuk kata di bawah kursor. Di GNU Emacs, padanan asli terdekat adalah:

C-s C-w

Tapi itu tidak persis sama. Ini membuka buffer mini pencarian tambahan dan salinan dari kursor di buffer saat ini ke akhir kata. Di Vim, Anda akan mencari seluruh kata, bahkan jika Anda berada di tengah-tengah kata saat menekan *.

Saya telah memasak sedikit elisp untuk melakukan hal serupa:

(defun find-word-under-cursor (arg)
  (interactive "p")
  (if (looking-at "\\<") () (re-search-backward "\\<" (point-min)))
  (isearch-forward))

Trots yang mundur ke awal kata sebelum menyalakan isearch. Saya telah mengikatnya ke C- +, yang mudah untuk mengetik di keyboard saya dan mirip dengan *, jadi ketika saya mengetik C-+ C-w itu salinan dari awal kata ke mini-buffer pencarian.

Namun, ini masih belum sempurna. Idealnya itu akan mencari pencarian kembali "\<" word "\>" untuk tidak menampilkan sebagian kecocokan (mencari kata "bar" tidak boleh cocok dengan "foobar", hanya "bar" sendiri). Saya mencoba menggunakan pencarian-maju-regexp dan concat'ing \ <> tetapi ini tidak membungkus dalam file, tidak menyoroti pertandingan dan umumnya cukup timpang. Fungsi isearch- * nampaknya merupakan pilihan terbaik, tetapi ini tidak berperilaku baik saat ditulis.

Ada ide? Adakah yang bisa menawarkan perbaikan pada sedikit elisp? Atau apakah ada cara lain yang telah saya lewatkan?


32
2018-02-26 08:49


asal


Jawaban:


Berdasarkan tanggapan Anda terhadap jawaban pertama saya, bagaimana dengan ini:

(defun my-isearch-word-at-point ()
  (interactive)
  (call-interactively 'isearch-forward-regexp))

(defun my-isearch-yank-word-hook ()
  (when (equal this-command 'my-isearch-word-at-point)
    (let ((string (concat "\\<"
                          (buffer-substring-no-properties
                           (progn (skip-syntax-backward "w_") (point))
                           (progn (skip-syntax-forward "w_") (point)))
                          "\\>")))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))

(add-hook 'isearch-mode-hook 'my-isearch-yank-word-hook)

15
2018-02-26 15:07



Itu simbol sorotan ekstensi emacs menyediakan fungsi ini. Secara khusus, merekomendasikan .emacsrc mempersiapkan:

(require 'highlight-symbol)

(global-set-key [(control f3)] 'highlight-symbol-at-point)
(global-set-key [f3] 'highlight-symbol-next)
(global-set-key [(shift f3)] 'highlight-symbol-prev)

Memungkinkan melompat ke simbol berikutnya pada titik saat ini (F3), melompat ke simbol sebelumnya (Shift + F3) atau menyoroti simbol yang cocok dengan yang ada di bawah kursor (Ctrl + F3). Perintah terus melakukan hal yang benar jika kursor Anda di tengah kata.

Tidak seperti bintang super vim, menyoroti simbol dan melompat di antara simbol terikat pada dua perintah yang berbeda. Saya pribadi tidak keberatan pemisahan, tetapi Anda bisa mengikat dua perintah di bawah keystroke yang sama jika Anda ingin mencocokkan perilaku vim.


7
2018-06-11 05:55



Ada banyak cara untuk melakukan ini:

http://www.emacswiki.org/emacs/SearchAtPoint


5
2018-02-26 12:41



Jawaban scottfrazer bekerja dengan baik untuk saya, kecuali untuk kata-kata yang berakhiran '_' (atau mungkin karakter non-kata lainnya?). Saya menemukan bahwa kode untuk mode simbol cahaya menggunakan regex yang berbeda untuk batas kata tergantung pada versi emacs, dan yang memperbaikinya untuk saya. Berikut ini kode yang dimodifikasi:

(defconst my-isearch-rx-start
  (if (< emacs-major-version 22)
      "\\<"
    "\\_<")
  "Start-of-symbol regular expression marker.")

(defconst my-isearch-rx-end
  (if (< emacs-major-version 22)
      "\\>"
    "\\_>")
  "End-of-symbol regular expression marker.")

(defun my-isearch-word-at-point ()
  (interactive)
  (call-interactively 'isearch-forward-regexp))

(defun my-isearch-yank-word-hook ()
  (when (equal this-command 'my-isearch-word-at-point)
    (let ((string (concat my-isearch-rx-start
                          (buffer-substring-no-properties
                           (progn (skip-syntax-backward "w_") (point))
                           (progn (skip-syntax-forward "w_") (point)))
                          my-isearch-rx-end)))
      (if (and isearch-case-fold-search
               (eq 'not-yanks search-upper-case))
          (setq string (downcase string)))
      (setq isearch-string string
            isearch-message
            (concat isearch-message
                    (mapconcat 'isearch-text-char-description
                               string ""))
            isearch-yank-flag t)
      (isearch-search-and-update))))

(add-hook 'isearch-mode-hook 'my-isearch-yank-word-hook)

3
2017-09-02 19:19



Bagaimana dengan built-in perintah M-b C-s C-w (mulai dari kata, pencarian, pencarian kata)


2
2018-05-11 18:49



Mickey dari Menguasai Emacs blog diperkenalkan kembali keren "Pemindaian cerdas"lib yang memberi global binding M-n dan M-p untuk menavigasi simbol di bawah kursor di buffer. Tidak memengaruhi daftar penelusuran, jadi bukan * penggantian apa adanya, tetapi alternatif yang cerdas dan dapat digunakan untuk masalah navigasi.


2
2017-11-05 09:02



Saya belum mencobanya tetapi ada beberapa kode sini disebut Grep-O-Matic.


1
2018-02-26 09:14



Dengan ini Anda harus dapat melakukan C- * saat berada dalam mode pencarian.

(define-key isearch-mode-map [? \ C- *] 'kmk-isearch-yank-thing)

(Defun kmk-isearch-yank-thing ()
  "Tarik benda berikutnya dari buffer ke string pencarian."
  (interaktif)
  (biarkan ((string (kata regexp-quote (thing-at-point '))))
    (setq isearch-string
      (Concat isearch-string "\\")
      pesan isearch
      (Concat isearch-message
          (mapconcat 'isearch-teks-char-deskripsi
                 string ""))
      ;; Jangan gerakkan kursor dalam pencarian terbalik.
      isearch-yank-flag t))
  (setq isearch-regexp t isearch-word nil isearch-success t isearch-adjusted t)
  (pencarian-dan-pembaruan isearch))

0
2018-02-26 09:30