2012-07-04 8 views
7

Chciałbym zabić cytowany ciąg w pliku źródłowym bez konieczności oznaczania początku łańcucha i regionu zabicia, , ale po prostu umieszczając punkt w dowolnym miejscu wewnątrz cytowanego ciągu i naciskając skrót.Jak zabić cytowany ciąg w punkcie w emacs?

Próbowałem napisać do tego funkcję w elispie, ale doszedłem do wniosku, że plik musi zostać przeanalizowany od początku do punktu, aby określić, czy punkt znajduje się w cudzysłowiu i znaleźć granice cytowany string (obsługuje również \ ") ...

Ale plik jest już analizowana przez font-lock Więc teraz mogę się dowiedzieć, czy jestem wewnątrz cudzysłowie.

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

Ale jak mogę uzyskać granice łańcucha? font-lock wie o tym, ponieważ ładnie podkreśla to na niebiesko, ale jak mam to zdobyć?

Edytuj: Dzięki za odpowiedzi. Wpadłem na ten kod, który robi dokładnie to, co chciałem - przenieś kod bez wybierania regionu lub nawet przechodząc do początku kodu.

(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) 

Wszelkie sugestie dotyczące usprawnienia są mile widziane.

Odpowiedz

5

Zamiast polegać na blokowaniu czcionek, można użyć danych analizatora składni. Początek łańcucha wokół punktu (jeśli jest dostępny) jest dostępny jako (nth 8 (syntax-ppss)). Następnie możesz użyć (forward-sexp 1), aby przeskoczyć przez ciąg, aby znaleźć jego koniec.

3

Możesz znaleźć granice nieruchomości za pomocą previous-property-change i next-property-change. Na przykład:

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

budynku off sugestii Stefana korzystania syntax-ppss dodaje powinno wystarczyć

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

Wykorzystuje (nth 8 (syntax-ppss)) znaleźć początek napisu, skacze tam, a następnie wykorzystuje wbudowany w kill-sexp zabić s-expression w punkcie (w tym przypadku ciąg, który chcemy odejść). W ogóle nie potrzebujesz żadnego rodzaju obliczenia regionu z Twojej strony.

Powiązane problemy