如何在emacs中杀死一个带引号的字符串?

时间:2012-07-04 15:13:23

标签: emacs elisp

我想在源文件中删除带引号的字符串 无需标记字符串和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)

欢迎提出任何改进建议。

3 个答案:

答案 0 :(得分:5)

您可以使用底层解析器的数据,而不是依赖font-lock。点(如果有)的字符串开头可以(nth 8 (syntax-ppss))。然后,您可以使用(forward-sexp 1)跳过字符串以查找其结尾。

答案 1 :(得分:3)

您可以使用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))))

答案 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(在这种情况下,我们想要的字符串消失了)。您无需进行任何类型的区域计算。