首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在emacs中删除带引号的字符串?

如何在emacs中删除带引号的字符串?
EN

Stack Overflow用户
提问于 2012-07-04 23:13:23
回答 3查看 520关注 0票数 7

我想要删除源文件中带引号的字符串,而不必标记字符串的开头和kill-region,只需将点放在带引号的字符串内的任何位置并按下快捷键即可。

为此,我尝试用elisp编写一个函数,但我发现需要从头到尾对文件进行解析,以确定该点是否位于带引号的字符串内,并找到带引号的字符串的边界(也处理\")...

但是文件已经被font-lock解析了。所以现在我可以找出我是否在带引号的字符串中:

代码语言:javascript
复制
(defun inside-quoted-string? ()
  (interactive)
  (print (find 'font-lock-doc-face (text-properties-at (point)))))

但是我如何得到字符串的边界呢?font-lock知道它,因为它用蓝色很好地突出显示了它,但是我如何获得它呢?

编辑:感谢您的回答。我想出了这段代码,它做的正是我想要的-移动代码,而不是选择区域,甚至移动到代码的开头。

代码语言:javascript
复制
(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)

欢迎任何改善它的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-05 00:10:29

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

票数 5
EN

Stack Overflow用户

发布于 2012-07-04 23:25:41

您可以使用previous-property-changenext-property-change查找属性的边界。例如:

代码语言:javascript
复制
(defun kill-by-property (arg)
  (interactive "d")
  (kill-region
    (previous-property-change arg nil (point-min))
    (next-property-change arg nil (point-max))))
票数 3
EN

Stack Overflow用户

发布于 2012-07-05 21:52:10

基于Stefan关于使用syntax-ppss的建议,下面的内容应该可以解决这个问题

代码语言:javascript
复制
(defun kill-string ()
  (interactive)
  (let ((string-start (nth 8 (syntax-ppss))))
    (goto-char string-start)
    (kill-sexp)))

它使用(nth 8 (syntax-ppss))找到字符串的开头,跳转到那里,然后使用内置的kill-sexp在点上终止s表达式(在本例中,我们想要删除的字符串)。您完全不需要进行任何类型的区域计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11331725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档