2012-07-04 9 views
7

Vorrei eliminare una stringa tra virgolette in un file di origine senza dover contrassegnare l'inizio della stringa e kill-region, ma semplicemente posizionando il punto in qualsiasi punto all'interno della stringa tra virgolette e premendo un collegamento.Come uccidere una stringa quotata al punto in emacs?

Ho cercato di scrivere una funzione in elisp per questo, ma ho capito che il file avrebbe bisogno di essere analizzato fin dall'inizio fino al punto di determinare se il punto è all'interno stringa tra virgolette, e di trovare i limiti della la stringa tra virgolette (gestire anche il \ ") ...

Ma il file è già analizzato da font-lock Così ora posso sapere se sto dentro citato stringa:.

(defun inside-quoted-string?() 
    (interactive) 
    (print (find 'font-lock-doc-face (text-properties-at (point))))) 

Ma come faccio a ottenere i limiti della stringa? font-lock lo sa, dal momento che mette in evidenza bene è in blu, ma come ottenerlo?

Modifica: Grazie per le risposte. Mi sono inventato questo codice che fa esattamente quello che volevo, - sposta il codice in giro senza selezionare la regione o anche lo spostandosi all'inizio del codice.

(defun kill-at-point() 
    "Kill the quoted string or the list that includes the point" 
    (interactive) 
    (let ((p (nth 8 (syntax-ppss)))) 
    (if (eq (char-after p) ?\") 
    (progn 
     (goto-char p) 
     (kill-sexp)) 
     (progn 
    (up-list) 
    (let ((beg (point))) 
     (backward-list) 
     (kill-region beg (point))))))) 
(global-set-key (kbd "C-,") 'kill-at-point) 

Eventuali suggerimenti per migliorarlo sono i benvenuti.

risposta

5

Piuttosto che fare affidamento su font-lock, è possibile utilizzare i dati del parser sottostante. L'inizio della stringa attorno al punto (se presente) è disponibile come (nth 8 (syntax-ppss)). È quindi possibile utilizzare (forward-sexp 1) per saltare la stringa per trovarne la fine.

3

È possibile trovare i limiti di una proprietà con previous-property-change e next-property-change. Per esempio:

(defun kill-by-property (arg) 
    (interactive "d") 
    (kill-region 
    (previous-property-change arg nil (point-min)) 
    (next-property-change arg nil (point-max)))) 
1

costruzione fuori del suggerimento di Stefan di utilizzare syntax-ppss, il seguente dovrebbe fare il trucco

(defun kill-string() 
    (interactive) 
    (let ((string-start (nth 8 (syntax-ppss)))) 
    (goto-char string-start) 
    (kill-sexp))) 

Esso utilizza (nth 8 (syntax-ppss)) per trovare l'inizio della stringa, salti lì, poi utilizza il built-in kill-sexp per uccidere il s-expression at point (in questo caso, la stringa che vogliamo eliminare). Non c'è bisogno di alcun tipo di calcolo della regione da parte tua.

Problemi correlati