有关于Emacs超级强大功能的很多噪音。无论是org-mode,Gnus还是C-x M-c butterfly。我已经使用Emacs多年了,所以没必要说服我。
我个人发现,没有人谈论......实际上是编辑文字。你知道吗
Emacs是一个不错的操作系统,但缺少一个不错的编辑器。
笑话?直到我找到Vim,我才真正得到它。
现在,我用Emacs作为我的文本编辑器写了我的论文,所以我的心脏仍然以某种方式依附于它。关于组织模式,我也非常羡慕。所以我想知道实际上是否有 功能我一直都不知道?
我将给你一些我一直使用的例子:
o
/ O
在当前上方/下方打开一个新行,无论我的光标在哪个位置,都会进入插入模式。ci'
删除当前/后面'-string的内容,并将我置于插入模式。dat
删除当前的HTML标记。 cit
将删除内容并将我置于插入模式。 cstt
会让我编辑代码(例如,将<span>
变为<div>
)cs([
将周围的“(”和“)”更改为“[”和“]”。dai
会删除当前缩进的块,\\ai
会将其注释掉(\\是扩展名)。是否有一些超级秘密的快捷方式,但在Emacs中可以轻松访问此类内容的快捷方式? Sublime Text 2有一些“扩展选择”功能,虽然不是那么精确,但却采用了相似的方式 - 但它仍然非常有用。
P.S。请不要提出任何vi仿真,只是不要。
P.P.S。也是为了上帝的缘故,没有Emacs与Vim对战无论战争,我求求你。
答案 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 Emacs,FAQ和Emacs manual。查找插件信息最活跃的地方是Emacs Wiki和Emacs Lisp Package Archive(将与Emacs 24一起分发)。
您不知道的99%的功能将在上述链接中找到。
当然,您也可以查看标准的SO问题/答案:what is the single most useful feature...。
答案 3 :(得分:5)
o/O
命令是emacs中的两个关键命令。对于o
,C-e <return>
(行尾,返回创建新行)。对于O
,C-a C-o
(行首,开放行)。ffap-copy-string-as-kill
(默认情况下未绑定到某个键,但很容易修复)与您的ci'
类似。在emacs中,没有“插入模式”的概念。我不会将“(”“)”更改为“[”“]”足以学习它的关键序列。如果我必须这样做,我会先转向query-replace-regexp
(C-M-%
)。
我不会编辑python或HTML,但我确信在适当的模式中有巧妙的技巧可以满足您的需求。
为回应评论而编辑。
我经常使用的更高级的编辑功能:
enum
并快速创建一个switch语句。有关详细信息,请参阅http://www.emacswiki.org/emacs/KeyboardMacros和http://www.emacswiki.org/emacs/KeyboardMacrosTricks。string-insert-rectangle
和rectangle-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)