2010-08-04 4 views
8

Muy a menudo defino un símbolo de rubí (por ejemplo, :some_value), luego quiero crear un método con el mismo nombre def some_value.Complemento de palabra de símbolo de Emacs ruby ​​

Por desgracia, la terminación automática (M + /) para la segunda aparición de la cadena some_value no funciona, siendo ligeramente diferente (:some_value vs some_value).

¿Cómo puedo configurar emacs para manejar tales eventos?

+1

¿Qué es exactamente M-/asignado para usted? Si es dabbrev-expand, ¿cuál es su valor para dabbrev-abbrev-char-regexp? –

+1

Como dice 0x4b, necesitamos más información. ¿Qué modo ruby ​​estás usando? RubyMode? MuMaMo-Mode? FWIW, dabbrev completa para mí muy bien cuando la única otra ocurrencia de la cadena es ': some_value'. –

+0

Estoy usando el modo ruby ​​básico. No he cambiado lo que M -/hace. Sin embargo, qué modo estoy usando es bastante irrelevante. No funciona en el búfer 'scratch' sin modos. – vise

Respuesta

7

Suponiendo que M-/está obligado a expandir dabbrev, puede configurar el modo dabbrev para ignorar ciertos prefijos al expandir cadenas. Para hacer una sola coma un prefijo para ser ignorado, el tipo

M-x customize-group 

y luego

dabbrev 

Esto le llevará a la página de personalización para dabbrev-mode. Vaya al punto Dabbrev Abbrev Skip Leading Regexp y haga clic en Value menu. En el menú, selecciona "Regexp".

Ahora verá un campo de texto con la etiqueta "Regexp:" junto al menú de valores en el que ingresa un solo punto y coma.

: 

A continuación, haga clic en el botón State en la siguiente línea y elegir el valor "guardar para sesiones futuras".

+0

¡Gracias, esto es exactamente lo que estaba buscando! – vise

+0

¡Un gran consejo! Lo extendí para habilitar solo esto en los modos Ruby y Clojure: https://gist.github.com/shepmaster/10877484 – Shepmaster

1

No es una respuesta directa a su pregunta, pero debe obtener la autocompletación de Ruby más inteligente usando auto complete mode emparejado con rsense.

+0

Gracias, no lo he instalado, pero rsense se ve bastante dulce. – vise

2

Primero, mis resultados! Escribí :some_crazy_symbol en mi modelo. En una nueva línea, he escrito def so, golpeó M-/ dos veces, y terminó con

def some_crazy_symbol 
end 

(Rinari suministra el end.)

Tengo que esto funcione bastante bien mediante el uso de hippie-expand. Si quieres probarlo, obligar a hippie-expandM-/ así:

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

Heres' la documentation. La expansión de Hippie funciona probando una cantidad de diferentes expansiones en el punto actual. Estas expansiones se almacenan en la variable hippie-expand-try-functions-list. En mi sistema (y ser predeterminado), esta variable se establece en:

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

La lectura minibuffer mostraron que esta expansión en particular se llevó a cabo utilizando la función try-expand-dabbrev.

1

Si dabbrev Abrev Saltar líder Regexp y hippie-expand no hace exactamente lo que quiere y usted tiene algunas habilidades elisp, se podría crear una función personalizada para hippie-expand.

Véase la sección sobre "substring expansion" en la página hippie-expand en el emacs-wiki. Hay una función que podría utilizar allí se podía adaptar a personalizar ..

Substring Expansion

Cuando haciendo Lisp dabbrev estándar de programación es menos útil, porque Emacs no tiene espacios de nombres, por lo que en un paquete de símbolos empiezan con el mismo prefijo, por lo tanto, el mismo prefijo tiene que escribirse una y otra vez si uno quiere completar los símbolos del paquete. Al igual que con IswitchBuffers, es mucho más efectivo si se puede escribir una subcadena única para llegar al símbolo deseado.

Dabbrev no ofrece nada en este sentido, así que recurrí a Hippie Expand que nunca antes había usado.

Aquí es una función basada en hippie ampliar dabbrev expansión que realiza la subcadena de expansión:

(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

que pensé que sería buena idea compartir la solution I came up with that works for hippie-expand.

En resumen:

(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 ampliará símbolos en ruby-mode cuando : se considera un personaje puntuacion, por lo que este consejo crea una tabla de sintaxis temporal donde : es un personaje puntuacion y pide hippie-expand con él.

Cuestiones relacionadas