我想在源文件中删除带引号的字符串,而不必标记字符串和kill-region的开头,只需将点放在带引号的字符串中的任意位置并按下快捷键即可.
我尝试在elisp中编写一个函数,但我发现该文件需要从头开始解析,以确定该点是否在引用的字符串内,并找到引用字符串的边界(同样处理\")...
但该文件已被font-lock解析.所以现在我可以知道我是否在引用的字符串中:
(defun inside-quoted-string? ()
(interactive)
(print (find 'font-lock-doc-face (text-properties-at (point)))))
Run Code Online (Sandbox Code Playgroud)
但是我如何获得字符串的边界?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)
Run Code Online (Sandbox Code Playgroud)
欢迎提出任何改进建议.
您可以使用底层解析器的数据,而不是依赖font-lock.点(如果有)的字符串开头可用(nth 8 (syntax-ppss))
.然后,您可以使用(forward-sexp 1)
跳过字符串来查找其结尾.