2011-06-16 17 views
5

Estoy involucrado en el proyecto de python donde se usan pestañas, sin embargo, no las estoy usando en ningún otro código que escribo, es vital usarlas en ese proyecto en particular. Los proyectos están ubicados en un directorio bajo directorios específicos. I.E:Cómo ejecutar el enganche dependiendo de la ubicación del archivo

\main_folder 
    \project1 
    \project2 
    \project3 
...etc 

Tengo funciones par/ganchos de abrir y guardar archivos que untabify y tabify búfer entero que trabajo.

;; My Functions 
(defun untabify-buffer() 
      "Untabify current buffer" 
     (interactive) 
     (untabify (point-min) (point-max))) 

(defun tabify-buffer() 
     "Tabify current buffer" 
     (interactive) 
     (tabify (point-min) (point-max))) 

;; HOOKS 
; untabify buffer on open 
(add-hook 'find-file-hook 'untabify-buffer) 
; tabify on save 
(add-hook 'before-save-hook 'tabify-buffer) 

si lo pongo en el fichero .emacs se ejecuta en todos los archivos .py i abrir, que no es lo que quiero. Lo que me gustaría tener es tener estos ganchos usados ​​solo en una carpeta en particular con las respectivas subcarpetas. Intentó .dir_locals pero funciona solo para propiedades que no son hooks. No puedo usar ganchos en modos específicos (es decir, modo python) ya que casi todos los proyectos están escritos en python. Para ser sincero, intenté escribir elisp conditional save pero fallé.

Respuesta

2

Una solución muy fácil es simplemente agregar una variable de configuración que se puede usar para deshabilitar los ganchos. Por ejemplo:

(defvar tweak-tabs t) 
(add-hook 'find-file-hook 
      (lambda() (when tweak-tabs (untabify (point-min) (point-max))))) 
(add-hook 'before-save-hook 
      (lambda() (when tweak-tabs (tabify (point-min) (point-max))))) 

Ahora puede agregar un archivo .dir-locals.el en los directorios pertinentes, estableciendo tweak-tabs-nil, deshabilitar esta característica allí.

(Sin embargo, otro problema es que esta es una muy mala manera de hacer frente a las pestañas. Por ejemplo, después de guardar un archivo que hace ver las fichas en ella.)

+0

Gracias.. Eso en realidad es la respuesta a mi pregunta, pero usted planteó un buen punto. Después de guardar tendré pestañas en todo el buffer. Investigué un poco porque pensé en conectar funciones para matar-buffer o kill-emacs, pero desafortunadamente se ejecutan después de que el archivo ya está guardado. Si fuera posible comprobar realmente lo que ha invocado 'guardar' en las funciones buffer y aply solo si fue kill-buffer o kill-emacs. ¿Tiene alguna otra sugerencia o experiencia en tal caso? –

+0

Probablemente empiece con 'write-file-functions', y tal vez haga que cree una copia del buffer, tabify that, save, y return' t'. Véase también [esta página] (http://www.emacswiki.org/emacs/UntabifyUponSave), aunque no lo hacen porque quieren que el almacenamiento intermedio permanezca * un * tabulado. –

0

Sólo para que conste, a responda la pregunta literal en el título (cuando llegué a esta pregunta a través de una búsqueda en la web): una forma de agregar un enlace que depende de la ubicación del archivo es hacer que sea una función que busque buffer-file-name. (Idea de this answer.)

Por ejemplo, para exactamente el mismo problema (activar pestañas solo en un directorio en particular, y dejar pestañas desactivadas en otro lugar), actualmente estoy haciendo algo así como (después de haber instalado el paquete smart-tabs-mode con M-x package-install):

(smart-tabs-insinuate 'python) ; This screws up all Python files (inserts tabs) 
(add-hook 'python-mode-hook ; So we need to un-screw most of them 
      (lambda() 
      (unless (and (stringp buffer-file-name) 
         (string-match "specialproject" buffer-file-name)) 
       (setq smart-tabs-mode nil))) 
      t)     ; Add this hook to end of the list 

(Esto es un poco invertida, como smart-tabs-insinuate sí modifica python-mode-hook y entonces estamos modificando de nuevo, pero se debe hacer como un ejemplo)

Cuestiones relacionadas