我想在源文件中删除带引号的字符串 无需标记字符串和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)
欢迎提出任何改进建议。
答案 0 :(得分:5)
您可以使用底层解析器的数据,而不是依赖font-lock。点(如果有)的字符串开头可以(nth 8 (syntax-ppss))
。然后,您可以使用(forward-sexp 1)
跳过字符串以查找其结尾。
答案 1 :(得分:3)
您可以使用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))))
答案 2 :(得分:1)
基于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-expression(在这种情况下,我们想要的字符串消失了)。您无需进行任何类型的区域计算。