2015-11-02 32 views
5

Ho seguito questa guida per inserire automaticamente diversi modelli di intestazioni in nuovi file di tipi diversi in base all'estensione del file:Vim - Come inserire una barra rovesciata all'inizio di una riga in un nuovo file utilizzando autocmd e un file modello

http://www.thegeekstuff.com/2008/12/vi-and-vim-autocommand-3-steps-to-add-custom-header-to-your-file/

Funziona benissimo! Ho un'intestazione personalizzata per i file di origine Python che viene inserita automaticamente quando apro un nuovo file .py.

voglio fare una cosa simile in modo che un modello di LaTeX di base è inserita quando apro un nuovo file .tex ...

Tranne non riesco a farlo funzionare ...

il mio ~/.vimrc dice questo:

autocmd bufnewfile *.tex so /home/steve/Work/tex_template.txt 

e la mia tex_template.txt dice questo:

:insert 
\documentclass[a4paper,12pt]{article} 
. 

ma quando ho O penna un nuovo file in questo modo:

vim test.tex 

(dove test.tex non esiste già)

ottengo questo:

"test.tex" [New File] 
Error detected while processing /home/steve/Work/tex_template.txt: 
line 2: 
E492: Not an editor command: :insertdocumentclass[a4paper,12pt]{article} 
Press ENTER or type command to continue 

Il problema sembra essere con il backslash all'inizio della riga perché se cancello la backslash da tex_template.txt il nuovo file si apre con documentclass [a4paper, 12pt] {article} in esso. Solo che ho bisogno del backslash perché altrimenti non è una sequenza di comandi tex.

+0

Cosa succede se si inseriscono due backslash? – 8bittree

+1

Sì, scusa, avrei dovuto dirlo. Ci ho già provato. È praticamente lo stesso, tranne che una delle barre retroverse appare nel messaggio di errore: E488: Caratteri finali:: insert \ documentclass [a4paper, 12pt] {article} –

risposta

4

Se si guarda :help :insert si dice questo:

attenzione per le linee che iniziano con un backslash, vedere di continuazione di riga.

Seguendo il collegamento in line-continuation spiega che la \ è un carattere di continuazione che può essere sovrascritta passando la bandiera C a cpoptions.

Si dovrebbe funzionare se si cambia il modello come segue:

:set cpo+=C 
:insert 
\documentclass[a4paper,12pt]{article} 
. 
:set cpo-=C 
+0

Brilliant! Funziona a meraviglia. Grazie :) Ho pensato che fosse qualcosa del genere. Ho controllato i file della guida ma non ho trovato quel bit. Bello uno Matthew Strawbridge! –

1

Si potrebbe voler considerare l'utilizzo di un motore di frammenti come vim-snipmate o (il mio preferito) ultisnips. Con quelli puoi inserire snippet di testo ovunque, non solo all'inizio di un file.

Come bonus, questi snippet possono ad es. sostituire le variabili e persino eseguire i comandi. Quello che segue è il mio snippet (per ultisnips) impostato per produrre l'intestazione per un file TeX;

snippet hdr "File header for LaTeX" b 
% file: `!v expand('%:t')` 
% vim:fileencoding=utf-8:ft=tex 
% 
% Copyright © `!v strftime("%Y")` ${1:R.F. Smith} ${2:<[email protected]>}. All rights reserved. 
% Created: `!p snip.rv = fcdate(path)` 
% Last modified: `!v strftime("%F %T %z")` 

$0 
endsnippet 

In questo modo verranno automaticamente inseriti il ​​nome del file e l'ora in cui il file è stato modificato l'ultima volta. Inserisce il mio nome e la mia e-mail con i valori predefiniti, ma mi dà l'opportunità di sostituirli. La funzione fcdate è un pezzo di codice Python che ho scritto per recuperare il tempo di nascita di un file.

Ho lo snippet hdr definito per diversi tipi di file e uno generale che viene utilizzato per tutti gli altri file. Se si digita hdrscheda all'inizio di una riga, lo snippet appropriato viene espanso.

Problemi correlati