我想要删除源文件中带引号的字符串,而不必标记字符串的开头和kill-region,只需将点放在带引号的字符串内的任何位置并按下快捷键即可。
为此,我尝试用elisp编写一个函数,但我发现需要从头到尾对文件进行解析,以确定该点是否位于带引号的字符串内,并找到带引号的字符串的边界(也处理\")...
但是文件已经被font-lock解析了。所以现在我可以找出我是否在带引号的字符串中:
(defun inside-quoted-string? ()
(interactive)
(print (find 'font-lock-doc-face (text-properties-at (point)))))但是我如何得到字符串的边界呢?font-lock知道它,因为它用蓝色很好地突出显示了它,但是我如何获得它呢?
编辑:感谢您的回答。我想出了这段代码,它做的正是我想要的-移动代码,而不是选择区域,甚至移动到代码的开头。
(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)欢迎任何改善它的建议。
发布于 2012-07-05 00:10:29
您可以使用底层解析器的数据,而不是依赖于font-lock。point周围的字符串的开头(如果有)是(nth 8 (syntax-ppss))。然后,您可以使用(forward-sexp 1)跳过字符串以找到它的末尾。
发布于 2012-07-04 23:25:41
您可以使用previous-property-change和next-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))))发布于 2012-07-05 21:52:10
基于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表达式(在本例中,我们想要删除的字符串)。您完全不需要进行任何类型的区域计算。
https://stackoverflow.com/questions/11331725
复制相似问题