我希望能够在不需要标记字符串开头和使用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)
欢迎提出任何改进IT技术相关内容的建议。