Executar comando ao abrir um arquivo de um tipo de arquivo específico


14

Estou tentando obter um script lisp para executar alguns comandos para mim quando abro um arquivo de um tipo de arquivo específico. Sei que estou trabalhando no arquivo init correto, porque se eu remover o tema, o emacs não terá um tema ao iniciá-lo.

Este é o script que estou usando, que não funciona (sem erros nem nada):

(defun my-project-hook (filename)
  (when (string= (file-name-extension filename) "ts")
    ((typescript-mode)
     (tss-setup-current-buffer))
  ) 
)

(add-hook 'after-load-functions 'my-project-hook)

Nesse contexto, "carregar" significa "carregar como código lisp". Eu acho que você deseja encontrar o arquivo-gancho em vez disso (observe que eles não são chamados com um argumento! Use buffer-file-name). Você também pode usar o auto-mode-alist e definir seu próprio modo principal.
YoungFrog

3
Na verdade, parece que você quer um gancho de modo.
Dan

Você ainda não encontrou o problema porque sua função não é executada, mas quando você sabe que o exposto acima não é válido. O corpo da sua whenchamada está incorreto. As duas chamadas de função não podem estar entre parênteses como estão. Observe a diferença entre seu código e @ sds de
Jordon Biondo

Respostas:


16

Na terminologia do Emacs, estas são duas etapas diferentes:

  • Associe arquivos à .tsextensão ao modo principal typescript-mode .
  • Execute a função tss-setup-current-bufferquando o modo TypeScript for iniciado.

Para escolher qual modo principal usar para determinados nomes de arquivo, adicione uma entrada à variável auto-mode-alist. Coloque a seguinte linha no seu arquivo init:

(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))

\.ts\'é uma expressão regular que corresponde aos nomes dos arquivos com a .tsextensão

Para executar a função tss-setup-current-buffersempre que o modo Typecript iniciar (presumo que você queira executá-lo mesmo para arquivos no modo TypeScript que não possuem a .tsextensão), adicione-a ao gancho de inicialização do modo TypeScript .

(add-hook 'typescript-mode-hook 'tss-setup-current-buffer)

Dependendo de como você instalou typescript.ele tss.el, talvez também seja necessário para declarar que as funções typescript-modee tss-setup-current-buffertem que ser carregado a partir desses arquivos. Isso evita ter que carregar typescript.ele tss.elassim que o Emacs iniciar: eles serão carregados sob demanda, quando você abrir um .tsarquivo ou executar typescript-modeexplicitamente.

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)

9

O que você está procurando é find-file-hook:

(add-hook 'find-file-hook 'my-project-hook)
(defun my-project-hook ()
  (when (string= (file-name-extension buffer-file-name) "ts")
    (typescript-mode)
    (tss-setup-current-buffer)))

4
Embora isso funcione, deve-se salientar que essa não é a maneira correta de iniciar os modos principais ao localizar um arquivo ou configurar personalizações para o modo principal. A auto-mode-alistdeve ser usado para determinar quando a inicialização typescript-mode, e typescript-mode-hookdeve ser usado para executar tss-setup-current-buffer.
Jordon Biondo 14/05

Usando (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))e (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)seria a maneira normal de fazê-lo.
Jordon Biondo 14/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.