2012-07-04 34 views
7

Tôi muốn giết một chuỗi được trích dẫn trong tệp nguồn mà không cần phải đánh dấu đầu chuỗi và khu vực giết, nhưng chỉ bằng cách đặt điểm bất kỳ vào bên trong chuỗi được trích dẫn và nhấn phím tắt.Làm thế nào để giết một chuỗi được trích dẫn tại điểm trong các emacs?

Tôi đã cố gắng viết một hàm trong elisp cho điều này, nhưng tôi đã tìm ra rằng tệp cần phải được phân tích cú pháp từ đầu đến điểm để xác định xem điểm có nằm trong chuỗi được trích dẫn hay không và để tìm các giới hạn chuỗi trích dẫn (còn xử lý các \ ") ...

Nhưng những tập tin đã được phân tích bằng font-lock Vì vậy, bây giờ tôi có thể tìm ra nếu tôi bên trong trích dẫn chuỗi:.

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

Nhưng làm thế nào để có được giới hạn của chuỗi? font-lock biết điều đó, vì nó nổi bật độc đáo nó màu xanh, nhưng làm thế nào để có được nó?

Chỉnh sửa: Cảm ơn câu trả lời. Tôi đã đưa ra mã này làm chính xác những gì tôi muốn - di chuyển mã xung quanh mà không chọn khu vực hoặc thậm chí chuyển sang đầu mã.

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

Bất kỳ đề xuất nào để cải thiện được hoan nghênh.

Trả lời

5

Thay vì dựa vào khóa phông chữ, bạn có thể sử dụng dữ liệu của trình phân tích cú pháp cơ bản. Sự bắt đầu của chuỗi xung quanh điểm (nếu có) có sẵn là (nth 8 (syntax-ppss)). Sau đó, bạn có thể sử dụng (forward-sexp 1) để nhảy qua chuỗi để tìm kết thúc.

3

Bạn có thể tìm thấy giới hạn của một thuộc tính với previous-property-changenext-property-change. Ví dụ:

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

Building tắt của đề nghị sử dụng syntax-ppss Stefan, sau đây nên làm các trick

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

Nó sử dụng (nth 8 (syntax-ppss)) để tìm đầu của chuỗi, nhảy ở đó, sau đó sử dụng được xây dựng trong kill-sexp giết s-biểu hiện tại điểm (trong trường hợp này, chuỗi chúng ta muốn biến mất). Không cần gì cả cho bất kỳ loại tính toán khu vực nào về phía bạn.

Các vấn đề liên quan