如何将给定文本环绕区域


11

我经常遇到需要在区域周围应用文本的情况。对于HTML和简单案例,已经有用于此的库。但是一般情况呢?我想问我要在该区域的开始和结束处插入什么。


您是否要使用它一次或多次插入任意内容?在后一种情况下,诸如smartparens之类的库可能被证明是有用的,并且可以使用自定义对对其进行扩展。例如,您可以添加一对<?php... ?>,然后在选择区域并键入<?php(或键绑定)时,将其包装在该对中。但是,如果您有很多一次性镜头,afaik没有简单的方法来使用这些库。
T. Verron 2014年

@ T.Verron:我知道那些存在。但是对于那些需要通过代码标记内容的特殊时刻,最适合单个,通用,可重用的功能
nperson325681 2014年

Answers:


6

我四处搜寻,发现了约翰·库克(John D. Cook)的这篇文章。他演示了如何构建一个简单的交互功能来轻松获取区域周围的HTML / XML标签。从那以后,我修改了功能以询问两次。

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

更重要的是,此功能还可以用作辅助工具,例如,当您想绑定键以映射某些特定的文本位时。

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

顺便说一句,这种处理某些边界情况的方法不是最佳的。搜索开始有时可能会失败,并将两个标签都留在结尾。这可能是evil因为我在这里使用了干扰。也许类型函数可以interactive "r" 更强大地起作用?
nperson325681 2014年

4

我建议使用另一种方法。当存在一个区域时,根据定义,该区域point必须位于该区域的开头(或结尾),并且mark必须位于结尾(或开头)。这意味着您可以输入所需的文本,然后使用exchange-point-and-mark,即C-x C-x跳到该区域的另一端。输入包装器的后半部分,您就完成了。

您不会明确要求您提示插入文本,但是我无法想象会有一种方法可以花费更少的精力完成相同的事情。


如果开始和结束文本相同,我想知道是否multiple-cursors可以对类似内容进行调整以在活动区域​​的开始和结束处同时插入文本。
glucas 2014年

这听起来像是较小的编辑者的用户被迫做的手动方式。无论如何,我不得不说从您的答案中将宏用作子文本。我喜欢你的风格
nperson325681 2014年

1
@progo-谢谢:) 听起来像是一种更手动的方法,但实际上比其他方法使用击键次数更少。通过这种方法,除了自动换行的文本外,您仅需要C-x C-x。有了答案,您需要调用函数(C-c something),并且还需要return在每次输入后单击。因此,无论您做什么,都需要再击两次键。就是说,如果您想从elisp打电话给您,那没有帮助。
泰勒

3

只是为了多样化:

使用任意开始和结束文本执行此操作的另一种方法是replace-regexp在区域上使用:match .+和replace with before \& after,或您想用于before和的任何文本after

您可以为此编写命令,但是我想到了在给定文件中要在多个位置应用相同的开始/结束文本的情况。您可以记录宏,也可以只使用小型缓冲区历史记录在另一个区域上重复。

当然,如果要包装的文本可以表示为正则表达式,则您甚至不需要选择区域即可query-replace-regexp在缓冲区上执行操作,但是想包装的文本可能不一致。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.