热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何让Emacs解包一段代码?-HowtogetEmacstounwrapablockofcode?

SayIhavealineinanemacsbufferthatlookslikethis:假设我在emacs缓冲区中有一行如下所示:foo-option1value

Say I have a line in an emacs buffer that looks like this:

假设我在emacs缓冲区中有一行如下所示:

foo -option1 value1 -option2 value2 -option3 value3 \
    -option4 value4 ...

I want it to look like this:

我希望它看起来像这样:

foo -option1 value1 \
    -option2 value2 \
    -option3 value3 \
    -option4 value4 \
    ...

I want each option/value pair on a separate line. I also want those subsequent lines indented appropriately according to mode rather than to add a fixed amount of whitespace. I would prefer that the code work on the current block, stopping at the first non-blank line or line that does not contain an option/value pair though I could settle for it working on a selected region.

我希望每个选项/值对在一个单独的行上。我还希望那些后续行根据模式适当缩进,而不是添加固定数量的空格。我希望代码在当前块上工作,在第一个非空白行或不包含选项/值对的行停止,但我可以解决它在选定区域上工作。

Anybody know of an elisp function to do this?

有人知道elisp功能吗?

4 个解决方案

#1


2  

Nobody had what I was looking for so I decided to dust off my elisp manual and do it myself. This seems to work well enough, though the output isn't precisely what I asked for. In this version the first option goes on a line by itself instead of staying on the first line like in my original question.

没有人有我想要的东西,所以我决定把我的elisp手册除掉,然后自己做。这似乎运作得很好,虽然输出并不是我要求的。在这个版本中,第一个选项单独出现,而不是像我原来的问题一样停留在第一行。

(defun tcl-multiline-options ()
  "spread option/value pairs across multiple lines with continuation characters"
  (interactive)
  (save-excursion
    (tcl-join-continuations)
    (beginning-of-line)
    (while (re-search-forward " -[^ ]+ +"  (line-end-position) t)
      (goto-char (match-beginning 0))
      (insert " \\\n")
      (goto-char (+(match-end 0) 3))
      (indent-according-to-mode)
      (forward-sexp))))

(defun tcl-join-continuations ()
  "join multiple continuation lines into a single physical line"
  (interactive)
  (while (progn (end-of-line) (char-equal (char-before) ?\\))
    (forward-line 1))
  (while (save-excursion (end-of-line 0) (char-equal (char-before) ?\\))
    (end-of-line 0)
    (delete-char -1)
    (delete-char 1)
    (fixup-whitespace)))

#2


1  

In this case I would use a macro. You can start recording a macro with C-x (, and stop recording it with C-x ). When you want to replay the macro type C-x e.

在这种情况下,我会使用宏。您可以使用C-x开始录制宏(并使用C-x停止录制)。当您想重播宏类型C-x e时。

In this case, I would type, C-a C-x ( C-s v a l u e C-f C-f \ RET SPC SPC SPC SPC C-x )

在这种情况下,我会键入,C-a C-x(C-s v a l u e C-f C-f \ RET SPC SPC SPC SPC C-x)

That would record a macro that searches for "value", moves forward 2, inserts a slash and newline, and finally spaces the new line over to line up. Then you could repeat this macro a few times.

这将记录一个宏,搜索“值”,向前移动2,插入斜线和换行符,最后将新行空格连接到排队。然后你可以重复这个宏几次。

EDIT: I just realized, your literal text may not be as easy to search as "value1". You could also search for spaces and cycle through the hits. For example, hitting, C-s a few times after the first match to skip over some of the matches.

编辑:我刚刚意识到,你的文字文本可能不像“value1”那样容易搜索。您还可以搜索空格并循环浏览。例如,在第一场比赛后几次击中C-s以跳过一些比赛。

Note: Since your example is "ad-hoc" this solution will be too. Often you use macros when you need an ad-hoc solution. One way to make the macro apply more consistently is to put the original statement all on one line (can also be done by a macro or manually).

注意:由于您的示例是“ad-hoc”,因此该解决方案也是如此。通常在需要临时解决方案时使用宏。使宏应用更一致的一种方法是将原始语句全部放在一行上(也可以通过宏或手动完成)。

EDIT: Thanks for the comment about ( versus C-(, you were right my mistake!

编辑:感谢你的评论(与C-相对(你错了!)

#3


0  

Personally, I do stuff like this all the time.

就个人而言,我总是这样做。

But I don't write a function to do it unless I'll be doing it every day for a year.

但我不会写一个函数去做,除非我每天都会这样做一年。

You can easily do it with query-replace, like this:

您可以使用query-replace轻松完成此操作,如下所示:

m-x (query-replace " -option" "^Q^J -option")

m-x(query-replace“-option”“^ Q ^ J -option”)

I say ^Q^J as that is what you'll type to quote a newline and put it in the string.

我说^ Q ^ J因为这是你输入引用换行符并将其放在字符串中的内容。

Then just press 'y' for the strings to replace, and 'n' to skip the wierd corner cases you'd find.

然后按“y”键替换字符串,然后按“n”跳过你找到的奇怪的角落情况。

Another workhorse function is query-replace-regexp that can do replacements of regular expressions.

另一个主力函数是query-replace-regexp,可以替换正则表达式。

and also grep-query-replace, which will perform query-replace by parsing the output of a grep command. This is useful because you can search for "foo" in 100 files, then do the query-replace on each occurrence skipping from file to file.

还有grep-query-replace,它将通过解析grep命令的输出来执行查询替换。这很有用,因为您可以在100个文件中搜索“foo”,然后在每个从文件到文件的跳过中执行查询替换。

#4


0  

Your mode may support this already. In C mode and Makefile mode, at least, M-q (fill-paragraph) will insert line continuations in the fill-column and wrap your lines.

您的模式可能已经支持此功能。在C模式和Makefile模式下,至少,M-q(fill-paragraph)将在填充列中插入行连续并包裹您的行。

What mode are you editing this in?

你在哪个模式编辑?


推荐阅读
  • PHP中元素的计量单位是什么? ... [详细]
  • Understanding the Distinction Between decodeURIComponent and Its Encoding Counterpart
    本文探讨了 JavaScript 中 `decodeURIComponent` 和其编码对应函数之间的区别。通过详细分析这两个函数的功能和应用场景,帮助开发者更好地理解和使用它们,避免常见的编码和解码错误。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 在Java中,匿名函数作为一种无名的函数结构,无法独立调用;而在JavaScript中,不仅有类似的匿名函数,还有立即执行函数(IIFE)和闭包等高级特性。立即执行函数同样基于匿名函数实现,但会在定义时立即执行,而闭包则通过嵌套函数来捕获外部变量,实现数据封装和持久化。这些不同的函数形式在实际开发中各有应用场景,理解其特点有助于更好地利用语言特性进行编程。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 期末Web开发综合实践项目:运用前端技术打造趣味小游戏体验
    期末Web开发综合实践项目中,学生通过运用HTML、CSS和JavaScript等前端技术,设计并实现了一款趣味性十足的小游戏。该项目不仅检验了学生对前端基础知识的掌握情况,还提升了他们的实际操作能力和创意设计水平。视频链接展示了项目的最终成果,直观呈现了游戏的互动性和视觉效果。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • MySQL 错误:检测到死锁,在尝试获取锁时;建议重启事务(Node.js 环境)
    在 Node.js 环境中,MySQL 数据库操作时遇到了“检测到死锁,在尝试获取锁时;建议重启事务”的错误。本文将探讨该错误的原因,并提供有效的解决策略,包括事务管理优化和锁机制的理解。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
author-avatar
丶Le丨囧囧_832
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有