Emacs的高级编辑功能

时间:2011-10-20 07:13:17

标签: emacs

有关于Emacs超级强大功能的很多噪音。无论是org-modeGnus还是C-x M-c butterfly。我已经使用Emacs多年了,所以没必要说服我。

我个人发现,没有人谈论......实际上是编辑文字。你知道吗

  

Emacs是一个不错的操作系统,但缺少一个不错的编辑器。

笑话?直到我找到Vim,我才真正得到它。

现在,我用Emacs作为我的文本编辑器写了我的论文,所以我的心脏仍然以某种方式依附于它。关于组织模式,我也非常羡慕。所以我想知道实际上是否有 功能我一直都不知道?

我将给你一些我一直使用的例子:

  • o / O在当前上方/下方打开一个新行,无论我的光标在哪个位置,都会进入插入模式。
  • ci'删除当前/后面'-string的内容,并将我置于插入模式。
  • dat删除当前的HTML标记。 cit将删除内容并将我置于插入模式。 cstt会让我编辑代码(例如,将<span>变为<div>
  • cs([将周围的“(”和“)”更改为“[”和“]”。
  • 扩展允许我解决Python缩进:dai会删除当前缩进的块,\\ai会将其注释掉(\\是扩展名)。

是否有一些超级秘密的快捷方式,但在Emacs中可以轻松访问此类内容的快捷方式? Sublime Text 2有一些“扩展选择”功能,虽然不是那么精确,但却采用了相似的方式 - 但它仍然非常有用。

P.S。请不要提出任何vi仿真,只是不要。

P.P.S。也是为了上帝的缘故,没有Emacs与Vim对战无论战争,我求求你。

8 个答案:

答案 0 :(得分:13)

由于没有人直接说过,我会。

emacs缺少“体面的编辑器”的原因是因为emacs的的很大一部分是为了让你自己制作理想的编辑器。这不是一项微不足道的工作,其他人已经编写了很多东西,并且有足够的人发现它们可以被包含在它的标准发行版中。

实际上并不打算在默认设置下使用。真。它并不意味着你可以在这里和那里调整和调整一些软件,而不仅仅是一个编辑器,你可以将你的行为分解成任何你想要它的行为。

所以,是的,是的,从$feature开始存在等效的$editor,或假设没有人写过,你可以安全地知道你可以实现它。

答案 1 :(得分:10)

Look for this wiki page.它有很多很多技巧。其中大部分是我在阅读之前(突然)发现的,但这篇文章值得一读。

C-h k尝试一次C-<key> M-<key>M-c, M-l, M-u之类的内容证明对我有用,M-z代表zap-to-char。白金答案是“学会使用i-search”。在i-search模式下,C-w, C-M-y, M-r非常有用。

我不知道任何包,这有助于我编辑围绕我的观点的东西。有一天,我为自己写了一篇,但事实证明它毫无用处。如果我想再写一些东西,我会做的第一件事 - 想想,我该怎么写。他们的行为怎么样?对于每种类型的括号,它都是N个单独的命令,或者一个,但是聪明吗?它应该如何工作?杀死钥匙圈? (欢迎讨论)。

对于~lisp,我使用sexp编辑命令。

我为自己写的东西。

(defun cm-fast-step-upward ()
  "Step 3 lines up, recenteres the screen."
  (interactive)
  (forward-line -3)
  (recenter))

(defun cm-fast-step-downward ()
  "Step 3 lines down, recenteres the screen."
  (interactive)
  (forward-line 3)
  (recenter))

(defun cm-find-any-bracket-forward()
  "Search for \"_}_]_'_>_)_end forward"
  (interactive)
  (re-search-forward "[\"}'>)]\\|\\(end\\)\\|\\]"))

(defun cm-find-any-bracket-backward()
  "Search for \"_{_[_'_<_(_begin forward"
  (interactive)
  (re-search-backward "[\"{'<(]\\|\\(begin\\)\\|\\["))

(defun cm-find-nonspace-backward()
  "Search for non tab, space, newline symbol backward."
  (interactive)
  (if (and
        (search-backward-regexp "[ 
  ]" (point-min) t)
        (search-backward-regexp "[^ 
  ]" (point-min) t))
    (forward-char)
    (goto-char (point-min))))

(defun cm-find-nonspace-forward()
  "Search for non tab, space, newline symbol backward."
  (interactive)
  (if (and
        (search-forward-regexp "[ 
  ]" (point-max) t)
        (search-forward-regexp "[^ 
  ]" (point-max) t))
  (backward-char)
  (goto-char (point-max))))

(defun cm-backward-delete-word(&optional arg)
  "DELETE word before cursor. Warning, this word cannot be yanked."
  (interactive "p")
  (let ((beg (point)))
    (backward-word arg)
    (delete-region beg (point))) )

(defun cm-delete-word(&optional arg)
  "DELETE word after cursor. Warning, this word cannot be yanked."
  (interactive "p")
  (let ((beg (point)))
    (forward-word arg)
    (delete-region beg (point))) )

(defun cm-delete-line(&optional arg)
  "DELETE line after cursor. Warning, this line cannot be yanked."
  (interactive "P")
  (if (equal arg '-) (setq arg -1))
  (let ((beg (point)))
    (if arg (forward-line arg)
    (goto-char (point-at-eol)))
    (if (= beg (point))
      (delete-char 1 nil)
      (delete-region beg (point)))))

(defun cm-reverse-region (&optional arg)
  "Reverse current region, like this: \"a(bc) d\" -> \"d )cb(a\"."
  (interactive "P")
  (let ((reversed (apply 'string (reverse (string-to-list (buffer-substring-no-properties (region-beginning) (region-end)))))))
    (delete-region (region-beginning) (region-end))
    (insert reversed)))

(provide 'cmmove)

我之前从未分享(我应该吗?)这件事,欢迎您发表评论。

默认绑定使用超密钥

(global-set-key [?\H-f] 'cm-find-nonspace-forward)
(global-set-key [?\H-b] 'cm-find-nonspace-backward)
(global-set-key [?\H-\]] 'cm-find-any-bracket-forward)
(global-set-key [?\H-\[] 'cm-find-any-bracket-backward)
(global-set-key [?\H-p] 'cm-fast-step-upward)
(global-set-key [?\H-n] 'cm-fast-step-downward)
(global-set-key (kbd "H-t") 'cm-reverse-region)

我还想知道,你喜欢这个命令的行为。如果他们找不到什么,他们应该发消息还是抛出错误?

答案 2 :(得分:7)

你的问题没有答案。

这是一个连续的旅程,您可以通过键入 M-x help 开始,并经常这样做。

每个人都有一套不同的功能。因此,除了列出所有可用的文字编辑功能外,请尝试(重新)阅读tour of EmacsFAQEmacs manual。查找插件信息最活跃的地方是Emacs WikiEmacs Lisp Package Archive(将与Emacs 24一起分发)。

您不知道的99%的功能将在上述链接中找到。

当然,您也可以查看标准的SO问题/答案:what is the single most useful feature...

答案 3 :(得分:5)

  • vim o/O命令是emacs中的两个关键命令。对于oC-e <return>(行尾,返回创建新行)。对于OC-a C-o(行首,开放行)。
  • ffap-copy-string-as-kill(默认情况下未绑定到某个键,但很容易修复)与您的ci'类似。在emacs中,没有“插入模式”的概念。

我不会将“(”“)”更改为“[”“]”足以学习它的关键序列。如果我必须这样做,我会先转向query-replace-regexpC-M-%)。

我不会编辑python或HTML,但我确信在适当的模式中有巧妙的技巧可以满足您的需求。

为回应评论而编辑。

我经常使用的更高级的编辑功能:

  • 键盘宏。这是一个广泛的技巧类别,但如果我需要在缓冲区中进行许多类似的编辑,我会录制一个宏并重复它。如果宏非常有用,可以将其保存以供将来的会话使用。当搜索是宏的一部分时,这可能非常强大。一个使用示例是在C中定义enum并快速创建一个switch语句。有关详细信息,请参阅http://www.emacswiki.org/emacs/KeyboardMacroshttp://www.emacswiki.org/emacs/KeyboardMacrosTricks
  • 每当我使用vim时,我总是错过增量搜索。虽然不高级,但我发现使用它比在vim中搜索更容易,特别是当我不确定我想要找到的拼写时。
  • 标记。每次开始增量搜索时,当前位置都会被推送到标记堆栈,以便快速返回到先前的位置。您可以随时按下标记并弹出标记堆栈以返回缓冲区中的有趣点。见http://www.emacswiki.org/emacs/MarkCommands
  • 用于编辑远程计算机上文件的TRAMP模式。见http://www.emacswiki.org/emacs/TrampMode
  • 矩形编辑。 string-insert-rectanglerectangle-delete是我的好朋友。

很难知道你会发现什么有用。每个用户都会有不同的喜爱功能。让我开始使用emacs的功能是M-x compile。使用M-g n跳转到编译输出中下一个错误或警告的文件位置。

答案 4 :(得分:4)

我不是Emacs专家,但https://sites.google.com/site/steveyegge2/effective-emacs似乎涵盖了一些有用的例子。特别是第6项(缓冲控制)和第7项(失去用户界面)似乎值得记住。此外,评论部分还涵盖了一些读者的提示。

答案 5 :(得分:2)

您可以查看

thing-at-point-utils.el

它提供了类似的东西:

  • ar-brace-or-copy-atpt

    “如果区域突出显示,请在支撑处提供THING, 否则复制大括号(ed)。 使用NO-DELIMITERS,复制支架(ed)没有分隔符。 使用负参数kill brace(ed)。 “

  • ar-bracket-or-copy-atpt

    “如果区域突出显示,请在括号中提供THING, 否则复制括号(ed)。 使用NO-DELIMITERS,复制括号(ed)没有分隔符。 使用负参数kill括号(ed)。 “

  • ar-lesser-angle-or-copy-atpt

    “如果区域突出显示,请在较小角度处提供THING, 否则在点处复制较小角度(ed)。 使用NO-DELIMITERS,复制较小角度(ed)而不分隔符。 使用负参数kill较小角度(ed)。 “

此处使用的密钥:

(global-set-key [(control c)(<)] 'ar-lesser-angle-or-copy-atpt)
(global-set-key [(control c)(>)] 'ar-greater-angle-or-copy-atpt)
(global-set-key [(control c)(\")] 'ar-doublequote-or-copy-atpt)
(global-set-key [(control c)(\')] 'ar-singlequote-or-copy-atpt)
(global-set-key [(control c)(\))] 'ar-parentize-or-copy-atpt)
(global-set-key [(control c)(\\)] 'ar-backslash-or-copy-atpt)
(global-set-key [(control c)(\])] 'ar-bracket-or-copy-atpt)
(global-set-key [(control c)(\})] 'ar-brace-or-copy-atpt)
(global-set-key [(control c)(_)] 'ar-underscore-or-copy-atpt)
(global-set-key [(control c)(super \})] 'ar-brace-or-copy-atpt)
(global-set-key [(control c)(\/)] 'ar-slash-or-copy-atpt)

来源:

https://launchpad.net/s-x-emacs-werkstatt

答案 6 :(得分:1)

我知道你说没有提到任何vi仿真模式,但如果你没有,你应该真的给Evil看看,因为它确实给你基本上完全的功能,在Emacs内部的文本操作。两个世界中最好的 - Emacs在vi强大的文本操作方面具有出色的可扩展性。

答案 7 :(得分:1)

好吧,这可能不是超级秘密,但我经常使用它。

它的发生命令
&lt;显示当前缓冲区中包含REGular EXPression&gt;

匹配项的所有行

例如,它对于显示使用特定变量的所有行非常有用。

发生M-x&lt; Enter&gt; &lt;在搜索目标中输入&gt;然后&lt;输入&gt;
这将打开一个显示匹配线的新缓冲区。 您可以使用以下命令将光标移动到每个匹配项: 下一误差

对我来说,除非你重新定义运行命令的键,否则它们根本不方便。 因此,我将control-o映射到occurrence命令,并将control-n映射到next-error命令。

要做到这一点(或你自己的钥匙)
把它放在.emacs文件中:
(global-set-key“\ C-o”'出现)
(global-set-key“\ C-n”'next-error)

相关问题