Emacs рубиновый символ завершение слова - PullRequest
8 голосов
/ 04 августа 2010

Довольно часто я определяю символ рубина (например, :some_value), затем я хочу создать метод с тем же именем def some_value.

К сожалению, автозаполнение (M + /) для второго вхождения строки some_value не работает, немного отличается (:some_value против some_value).

Как мне настроить emacsобрабатывать такие события?

Ответы [ 5 ]

7 голосов
/ 07 декабря 2010

Предполагая, что M- / связан с dabbrev-expand, вы можете настроить dabbrev-mode так, чтобы он игнорировал определенные префиксы при расширении строк.Чтобы сделать один двоеточие префиксом, который нужно игнорировать, введите

M-x customize-group

, а затем

dabbrev

. После этого вы перейдете на страницу настройки режима dabbrev.Перейти к точке Dabbrev Abbrev Пропустить Leading Regexp и нажать Value menu.В меню выберите «Regexp».

Теперь вы видите текстовое поле с пометкой «Regexp:» рядом с меню значений, в которое вы вводите одиночное двоеточие.нажмите кнопку State в следующей строке и выберите значение «Сохранить для будущих сеансов».

2 голосов
/ 07 декабря 2010

Сначала мои результаты!Я набрал :some_crazy_symbol в моей модели.В новой строке я набрал def so, дважды нажал M-/ и в итоге набрал

def some_crazy_symbol
end

(Ринари предоставил end.)

Я получил эту работу довольнохорошо, используя hippie-expand.Если вы хотите проверить это, привяжите hippie-expand к M-/ следующим образом:

(global-set-key (kbd "M-/") 'hippie-expand)

Вот документация .Расширение хиппи работает, пробуя несколько различных расширений в текущей точке.Эти расширения хранятся в переменной hippie-expand-try-functions-list.В моей системе (и по умолчанию) эта переменная установлена ​​на:

(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)

Показания минибуфера показали, что это конкретное расширение было выполнено с использованием функции try-expand-dabbrev.

1 голос
/ 02 июля 2015

Я решил, что поделюсь разработанным мной решением, которое работает для hippie-expand.

Подведем итог:

(defun hippie-expand-ruby-symbols (orig-fun &rest args)
  (if (eq major-mode 'ruby-mode)
      (let ((table (make-syntax-table ruby-mode-syntax-table)))
        (modify-syntax-entry ?: "." table)
        (with-syntax-table table (apply orig-fun args)))
    (apply orig-fun args)))

(advice-add 'hippie-expand :around #'hippie-expand-ruby-symbols)

hippie-expand будет расширять символы в ruby-mode, когда : считается символом пунктуации, поэтому этот совет создает временную таблицу синтаксиса, где : является символом пунктуации и вызывает hippie-expand с ним.

1 голос
/ 07 декабря 2010

Если Dabbrev Abbrev Skip Leading Regexp и hippie-expand не делает именно то, что вы хотите, и у вас есть некоторые навыки elisp, вы можете создать пользовательскую функцию для hippie-expand.

См. Раздел " расширение подстроки " на странице hippie-expand в emacs-wiki.Есть функция, которую вы можете использовать там, которую вы можете настроить, чтобы настроить ..

Расширение подстроки

При выполнении программирования на lisp стандартным dabbrev являетсяменее полезный, поскольку в Emacs нет пространств имен, поэтому в пакете символы начинаются с одного и того же префикса, поэтому один и тот же префикс необходимо вводить снова и снова, если кто-то хочет завершить символы из пакета.Как и в случае с IswitchBuffers, гораздо эффективнее, если можно ввести уникальную подстроку, чтобы добраться до нужного символа.

Dabbrev ничего не предлагает в этом отношении, поэтому я обратился к Hippie Expand, который никогда раньше не использовал.

Вот функция, основанная на расширении хабпи даббрев, которое выполняет раскрытие подстроки:

(defun try-my-dabbrev-substring (old)
  (let ((old-fun (symbol-function 'he-dabbrev-search)))
    (fset 'he-dabbrev-search (symbol-function 'my-dabbrev-substring-search))
    (unwind-protect
        (try-expand-dabbrev old)
      (fset 'he-dabbrev-search old-fun))))


(defun my-dabbrev-substring-search (pattern &optional reverse limit)
  (let ((result ())
    (regpat (cond ((not hippie-expand-dabbrev-as-symbol)
               (concat (regexp-quote pattern) "\\sw+"))
              ((eq (char-syntax (aref pattern 0)) ?_)
               (concat (regexp-quote pattern) "\\(\\sw\\|\\s_\\)+"))
              (t
               (concat (regexp-quote pattern)
                   "\\(\\sw\\|\\s_\\)+")))))
    (while (and (not result)
        (if reverse
             (re-search-backward regpat limit t)
             (re-search-forward regpat limit t)))
      (setq result (buffer-substring-no-properties (save-excursion
                                                     (goto-char (match-beginning 0))
                                                     (skip-syntax-backward "w_")
                                                     (point))
                           (match-end 0)))
      (if (he-string-member result he-tried-table t)
      (setq result nil)))     ; ignore if bad prefix or already in table
    result))
1 голос
/ 07 декабря 2010

Не прямой ответ на ваш вопрос, но вы должны получить более интеллектуальное автозаполнение Ruby, используя режим автозаполнения в сочетании с rsense .

...