Emacs Поиск точного слова

Я работаю в Verilog большую часть времени, и мой любимый редактор - Emacs.

В vi (vim) есть функция, которая мне нравится, но я не знаю, как это сделать в emacs

Я хотел бы сделать точный поиск слова, например - скажем, у меня есть этот текст:

1. wire                   axi_bvalid = bvalid;
2. wire                   axi_bready; // assigned later
3. assign                 axi_cross_fifo_pop = axi_bvalid & axi_bready 
4. wire                   axi = 1'b1;

при поиске axi Я хотел бы получить совпадение только в строке 4. Сегодня Ctrl-S поиск будет соответствовать каждому экземпляру axi,

В vim способ сделать это - нажать * на слове или /\.

Есть ли что-то похожее в Emacs?

Большое спасибо, Джони

3 ответа

Решение

Например, необходим поиск по регулярному выражению

Mx isearch-forward-regexp RET \_<axi\_> RET

См. Info-файл Emacs Lisp, узел 34.3.1.3: Конструкции с обратной косой чертой в регулярных выражениях

Запуск в качестве команды:

(defun my-re-search-forward (&optional word)
  "Searches for the last copied solitary WORD, unless WORD is given. "
  (interactive)
  (let ((word (or word (car kill-ring))))
    (re-search-forward (concat "\\_<" word "\\_>") nil t 1)
    (set-mark (point))
    (goto-char (match-beginning 0))
    (exchange-point-and-mark)))

Привязать его к Cc: например:

(global-set-key [(control c) (\:)] 'my-re-search-forward)

Я думаю, что вы ищете функцию поиска слова, активированную с помощью M-s w,

Вы можете использовать его двумя способами: просто выдать M-s wзатем введите слово для поиска. Или получить что-то похожее на * в vim вы можете начать поиск с isearch, с C-s C-w (это ищет слово под курсором), затем M-s w переключить поиск в режим целого слова.

Я не нашел встроенной функции в Emacs, которая эквивалентна vim *, но мне удалось написать эти две команды, которые могут вам подойти:

(defun my-isearch-forward-word-at-point ()
  "Search for word at point."
  (interactive)
  (let ((word (thing-at-point 'word t))
        (bounds (bounds-of-thing-at-point 'word)))
    (if word
        (progn
          (isearch-mode t nil nil nil t)
          (when (< (car bounds) (point))
            (goto-char (car bounds)))
          (isearch-yank-string word))
      (user-error "No word at point"))))

(defun my-isearch-forward-symbol-at-point ()
  "Search for symbol at point."
  (interactive)
  (let ((symbol (thing-at-point 'symbol t))
        (bounds (bounds-of-thing-at-point 'symbol)))
    (if symbol
        (progn
          (isearch-mode t nil nil nil 'isearch-symbol-regexp)
          (when (< (car bounds) (point))
            (goto-char (car bounds)))
          (isearch-yank-string symbol))
      (user-error "No symbol at point"))))

(global-set-key (kbd "M-s ,") 'my-isearch-forward-word-at-point)
(global-set-key (kbd "M-s .") 'my-isearch-forward-symbol-at-point)

Как видите, я связал эти команды с Ms и Ms., В зависимости от вашей версии Emacs, вы можете использовать встроенную команду isearch-forward-symbol-at-point (связано с Ms. по умолчанию).

Другие вопросы по тегам