如何杀死在emacs的点带引号的字符串?(How to kill a quoted string a

2019-09-19 03:00发布

我想杀死一个源文件中引用的字符串,而无需标记字符串的开头和杀死区域,但只是通过将点的任何位置引号字符串中,按下一个快捷方式。

我试着写在elisp的这个功能,但我想通了,该文件将需要从一开始就被解析为指向,以确定该点是否里面引用的字符串,并找到了引号的字符串的范围(也处理\“)...

但该文件已被字体锁解析。 所以,现在我可以找出我引号字符串中:

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

但我怎么得到字符串的界限? 字体锁知道它,因为它很好地突出了它的蓝色,但我怎么得到它?

编辑:谢谢你的答案。 我想出了这个代码,它正是我想要的 - 移动代码周围没有选择区域,甚至转移到代码的起始。

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

任何建议,以改善它的欢迎。

Answer 1:

而不是依赖于字体锁,你可以使用底层的解析器的数据。 各地点的字符串(如果有的话)的开始可作为(nth 8 (syntax-ppss)) 然后,您可以使用(forward-sexp 1)跃过字符串找到它的尽头。



Answer 2:

你可以找到一个性的范围previous-property-changenext-property-change 。 例如:

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


Answer 3:

构建关使用的Stefan的建议的syntax-ppss ,下面应该做的伎俩

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

它使用(nth 8 (syntax-ppss))找到字符串的开头,跳到那里,然后使用内置的kill-sexp杀点的s表达式(在这种情况下,我们希望走的字符串) 。 没有必要在所有的你的一部分任何区域计算的。



文章来源: How to kill a quoted string at point in emacs?
标签: emacs elisp