2014-05-20 6 views
6

Sto scrivendo uno script Python in Emacs e ho attivato la modalità secondaria Auto-Fill con M-x auto-fill-mode. Un problema che mi sembra sempre di incontrare è che questa modalità di riempimento tende a spezzare le stringhe tra virgolette su più righe senza apportare alcuna compensazione, risultando in un errore durante l'esecuzione dello script.Emacs fill mode per Python che non interrompe stringhe tra virgolette che causano errori

Ad esempio:

print 'the quick brown fox jumped over the lazy dog and 
then did something else' 

che si traduce in SyntaxError: EOL while scanning string literal quando eseguito.

Esiste una modalità di riempimento in Emacs che è Python "string literal aware" e fa automaticamente ad esempio una continuazione della linea/regolazioni correlate discusse in Python style - line continuation with strings?, invece di dividere in modo ingenuo la stringa inducendo un errore?

+1

forse considerare una richiesta di funzionalità a https://bugs.launchpad.net/python-mode. –

+2

IMHO stai descrivendo un bug sulla funzione 'python-fill-string' di python.el (assumendo che tu usi un Emacs moderno). Osservando il codice sorgente posso vedere che non fa alcun tentativo di prevenire errori di sintassi. Potrebbe o potrebbe non essere stato risolto dai manutentori; il mio consiglio è di segnalarlo tramite 'report-emacs-bug' e tornare qui con la loro risposta se utile. Sono certo che i manutentori apprezzeranno un puntatore alla risposta accettata del link che fornisci. – juanleon

+1

Ho segnalato questo come un bug su https://bugs.launchpad.net/python-mode/+bug/1321266. Ti riporto se c'è una soluzione. –

risposta

0

AFAIU il modo pietoso sarebbe quello di utilizzare stringhe a tre punte e di stampare tramite stampa.

Questa soluzione Consigli il fill-funzione utilizzata per auto-fill-mode:

(defun my-make-continuation-line-by-fill() 
    (when (eq major-mode 'python-mode) 
    (save-excursion 
     (forward-line -1) 
     (end-of-line) 
     (unless (member (char-before) (list 92 32)) 
     (insert-and-inherit " ") 
     (unless (eq (char-after) ?\\) 
      (insert-and-inherit "\\")))))) 

In questo caso limitato al python-mode, ma dovrebbe funzionare con gli altri anche.

Quale funzione di consulenza dipende dalle personalizzazioni del sistema. Qui è do-auto-fill

Assicurarsi funzione di cui sopra viene caricato e mettere questo in Emacs init-file:

(defadvice do-auto-fill (after my-make-continuation-line-by-fill activate)(my-make-continuation-line-by-fill)) 

(ad-activate 'do-auto-fill) 
+0

Non ho ancora testato questa risposta, ma penso che le stringhe con quotatura tripla possano essere problematiche poiché AFAIK non può mantenere il rientro con esse senza influenzare la stringa di output. Immagina una dichiarazione di stampa rientrata da 4 spazi che si estendono su più righe usando virgolette triple. La seconda riga della stringa letterale dovrebbe essere completamente distanziata a sinistra affinché funzioni, cosa che appare disordinata (mantenendo il rientro si inseriscono ulteriori tab/spazi indesiderati nella stringa di output). Che ne dici di usare il carattere di continuazione della linea \ con virgolette singole attorno a ciascuna linea? –

+0

... quindi qualcosa di simile: 'print "The quick brown fox jumps over the lazy dog ​​e poi" \ "ha fatto qualcosa di diverso"' (a capo dispiace non funzionano nel SO commenti, ma spero che si ottiene l'idea). –

+0

@BryceThomas Ho paura di essere in qualche modo perso WRT i requisiti :-) –

1

Sto battendo la testa contro lo stesso problema per un po 'di tempo, e finalmente trovato questo soluzione.

Questo sembra funzionare per me. Sfortunatamente penso che questo si spenga compilando ogni stringa quotata in tutte le modalità, non solo in Python. Sono sicuro che qualcuno con un elisp-fu più forte di me può inventare una modifica che lo limita alla modalità python, ma questa è una soluzione migliore quella proposta sopra, IMO.

Questa soluzione presa da questa risposta correlata - vai a dare un po 'di amore this answer se ti piace.

(defun odd-number-of-single-quotes-this-paragraph-so-far() 
    (oddp (how-many "'" (save-excursion (backward-paragraph) (point)) (point)))) 
(defun odd-number-of-double-quotes-this-paragraph-so-far() 
    (oddp (how-many "\"" (save-excursion (backward-paragraph) (point)) (point)))) 

(add-to-list 'fill-nobreak-predicate 
    'odd-number-of-single-quotes-this-paragraph-so-far) 
(add-to-list 'fill-nobreak-predicate 
    'odd-number-of-double-quotes-this-paragraph-so-far) 

'''

+0

(n ° 3 (sintassi-pps)) dovrebbe essere più veloce di questo numero dispari -... –

Problemi correlati