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

通过Emacs中的shell命令过滤文本-FilteringtextthroughashellcommandinEmacs

Invi[m]thereisthe!commandwhichletsmepipetextthroughashellcommand--likesortorinde

In vi[m] there is the ! command which lets me pipe text through a shell command -- like sort or indent -- and get the filtered text back into the buffer. Is there an equivalent in emacs?

在vi [m]中有!命令,它允许我通过shell命令管道文本 - 如排序或缩进 - 并将过滤后的文本返回到缓冲区。在emacs中有相同的东西吗?

3 个解决方案

#1


107  

You can select a region and type `C-u M-| command RET', and it replaces the region with the command output in the same buffer due to the interactive prefix argument of shell-command-on-region.

您可以选择一个区域并输入“C-u M- |”命令RET',由于shell-command-on-region的交互前缀参数,它在同一缓冲区中用命令输出替换该区域。

#2


16  

I wrote this a few years back, it might help you:

几年前我写过这篇文章,它可能对你有帮助:

(defun generalized-shell-command (command arg)
  "Unifies `shell-command' and `shell-command-on-region'. If no region is
selected, run a shell command just like M-x shell-command (M-!).  If
no region is selected and an argument is a passed, run a shell command
and place its output after the mark as in C-u M-x `shell-command' (C-u
M-!).  If a region is selected pass the text of that region to the
shell and replace the text in that region with the output of the shell
command as in C-u M-x `shell-command-on-region' (C-u M-|). If a region
is selected AND an argument is passed (via C-u) send output to another
buffer instead of replacing the text in region."
  (interactive (list (read-from-minibuffer "Shell command: " nil nil nil 'shell-command-history)
                     current-prefix-arg))
  (let ((p (if mark-active (region-beginning) 0))
        (m (if mark-active (region-end) 0)))
    (if (= p m)
        ;; No active region
        (if (eq arg nil)
            (shell-command command)
          (shell-command command t))
      ;; Active region
      (if (eq arg nil)
          (shell-command-on-region p m command t t)
        (shell-command-on-region p m command)))))

I've found this function to be very helpful. If you find it useful as well, I suggest binding it to some function key for convenience, personally I use F3:

我发现这个功能非常有用。如果你发现它也有用,我建议将它绑定到某些功能键以方便使用,我个人使用F3:

(global-set-key [f3] 'generalized-shell-command)

#3


7  

Late edit: As much as I appreciate the upvotes, Jurta's answer is the way to go. And Greg's hack is neater than mine.

延迟编辑:尽管我很欣赏赞成票,但是Jurta的回答是要走的路。格雷格的黑客比我的还要整洁。

I'll leave the rest of this here because it might be worth something, but...

我会在这里留下其余部分,因为它可能是值得的,但......


M-x shell-command-on-region, which appears to be bound to M-| by default.

M-x shell-command-on-region,似乎与M- |绑定默认情况下。


I see that this does not do exactly what Rohit asked for. Using C-h f shell-command-on-region reveals that the desired behavior is available in the non-interactive version of the command (by setting the argument replace to non-nil). We should be able to write a wrapper to do this.

我发现这并不完全符合Rohit所要求的。使用C-h f shell-command-on-region显示在命令的非交互版本中可以使用所需的行为(通过将参数replace设置为non-nil)。我们应该能够编写一个包装器来执行此操作。

Try this (load it into *scratch* and run M-x eval-buffer, if it works, copy it to your .emacs file):

试试这个(将它加载到* scratch *并运行M-x eval-buffer,如果有效,将其复制到.emacs文件中):

(defun shell-command-on-region-replace (start end command)
  "Run shell-command-on-region interactivly replacing the region in place"
  (interactive (let (string) 
         (unless (mark)
           (error "The mark is not set now, so there is no region"))
         ;; Do this before calling region-beginning
         ;; and region-end, in case subprocess output
         ;; relocates them while we are in the minibuffer.
         ;; call-interactively recognizes region-beginning and
         ;; region-end specially, leaving them in the history.
         (setq string (read-from-minibuffer "Shell command on region: "
                            nil nil nil
                            'shell-command-history))
         (list (region-beginning) (region-end)
               string)))
  (shell-command-on-region start end command t t)
  )

And note as I say in the comments that this is not a very emacsy thing to do. But I think it works.

请注意,正如我在评论中所说,这不是一件非常麻烦的事情。但我认为它有效。


For any readers who don't know how to select a region:

对于任何不知道如何选择地区的读者:

  1. Move the "point" (current cursor position) to one end of the region, and use C-space to activate the "mark"
  2. 将“点”(当前光标位置)移动到区域的一端,并使用C空格激活“标记”

  3. Move the point to the other end of the region
  4. 将该点移动到该区域的另一端

  5. Your done, invoke the command
  6. 完成后,调用命令


推荐阅读
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • GDB 使用心得与技巧总结
    在使用 GDB 进行调试时,可以采用以下技巧提升效率:1. 通过设置 `set print pretty on` 来美化打印输出,使数据结构更加易读;2. 掌握常见数据结构的打印方法,如链表、树等;3. 利用 `info locals` 命令查看当前作用域内的所有局部变量;4. 在需要进行类型强制转换时,正确使用语法,例如 `p (Test::A *) pObj`。这些技巧能够显著提高调试的便捷性和准确性。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 在Windows命令行中,通过Conda工具可以高效地管理和操作虚拟环境。具体步骤包括:1. 列出现有虚拟环境:`conda env list`;2. 创建新虚拟环境:`conda create --name 环境名`;3. 删除虚拟环境:`conda env remove --name 环境名`。这些命令不仅简化了环境管理流程,还提高了开发效率。此外,Conda还支持环境文件导出和导入,方便在不同机器间迁移配置。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 本文探讨了在PowerShell中高效管理和操作大规模内存对象的技术与实践。详细介绍了如何启用PowerShell的大内存支持功能,并提供了优化性能和减少资源消耗的具体方法。此外,还讨论了常见问题及其解决方案,旨在帮助用户在处理复杂数据集时提高效率和稳定性。 ... [详细]
  • 本文深入解析了计算机科学领域中常用的几种排序算法,包括冒泡排序、插入排序、选择排序和希尔排序。通过对这些算法的性能进行详细对比分析,探讨了它们在不同数据规模和分布情况下的优劣。研究结果表明,冒泡排序虽然实现简单,但在大多数情况下效率较低;插入排序在部分有序的数据集中表现较好;选择排序的时间复杂度较为稳定,但空间复杂度较高;而希尔排序通过引入增量序列显著提高了排序效率,适用于大规模数据集。 ... [详细]
author-avatar
知足者常乐-----仙_230
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有