Emacs的高级编辑功能

hyn*_*nek 21 emacs

关于Emacs超级棒的功能有很多噪音.无论是组织模式,Gnus还是Cx Mc蝴蝶.我已经使用Emacs多年了,所以没必要说服我.

我个人发现,没有人谈论......实际编辑文本.你知道的

Emacs是一个不错的操作系统,但它没有一个像样的编辑器.

玩笑?直到我找到Vim,我才真正得到它.

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

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

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

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

PS请不要提出任何vi仿真,只是不要.

PPS也是出于上帝的缘故,没有Emacs与Vim对战无论战争,我求求你.

jer*_*ahd 13

既然没有人直接说过,我会的.

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

它并不意味着在默认设置下使用.真.它并不意味着你是一个软件,你在这里和那里调整和调整,以及编辑器,你可以将你的行为撕成任何你想要的东西.

所以,是的,是的,有是一个已经存在相当的$feature距离$editor,或假设没有人写过一个尚未你可以在你能实现它的安全知识.

  • 鉴于答案和我自己的经验,我必须就此达成一致.遗憾的是,你来Emacs时必须编写一个体面的编辑器.然而,没有多少默认或更集中的努力的最大原因似乎是缺乏兴趣.网上到处都是"如何让Emacs煮你的咖啡"以及如何避免rsi,但缺乏编辑方法和指南. (4认同)
  • @RaffaeleRicciardi没有明确说明,但是在`emacs-help` ML上多次提及它,而Emacs和Elisp手册都非常强调告诉你如何(安全地)改变行为.Emacs旨在为您提供理想的开发设置,因为它往往会因个人而异,尤其是那些倾向于使用和喜爱Emacs的人. (3认同)

des*_*esu 10

查找此Wiki页面.它有很多很多技巧.他们中的大多数(我突然)在阅读之前就找到了自己,但这篇文章值得一读.

尝试C-h k每一个C-<key> M-<key>.喜欢的东西,M-c, M-l, M-u证明我是有用的,M-zzap-to-char.白金答案是"学会使用i-search".C-w, C-M-y, M-r在i-search模式下非常有用.

我不知道任何包,这有助于我编辑一些我的观点.有一天,我为自己写了一篇,但事实证明它毫无用处.如果我想再写一些东西,我会做的第一件事 - 想想,我该怎么写.他们的行为怎么样?对于每种类型的括号,它都是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)
Run Code Online (Sandbox Code Playgroud)

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

默认绑定使用超密钥

(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)
Run Code Online (Sandbox Code Playgroud)

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


Tre*_*son 7

你的问题没有答案.

这是一个连续的旅程,你可以通过打字开始M-x help,并经常这样做.

每个人都有一套不同的功能.因此,除了列出所有可用的文本编辑功能之外,请尝试(重新)阅读Emacs,常见问题解答Emacs手册.查找插件信息的最活跃的地方是Emacs WikiEmacs Lisp Package Archive(将与Emacs 24一起分发).

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

当然,你也可以看看标准的SO提问/回答:什么是最有用的功能.......

  • @hynek我看到(按顺序)自动完成单词,align-regexp,键盘宏,矩形命令,yasnippet,delete-blank-lines,transpose-*,comment-region(uncomment).所有这些都与插入/删除/修改文本直接相关.它们可能不是你想要的,但这就是我的答案. (4认同)

atl*_*peg 5

  • vim 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在C中定义一个并快速创建一个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跳转到编译输出下一个错误或警告的文件位置.

  • 也许人们无法给你很好的答案,因为对于其他人来说,编辑技巧并不是使用Emacs提高工作效率的最重要方法.例如,在我的情况下,像[Anything](http://metasandwich.com/2010/07/30/what-c​​an-i-get-for-10-dolla-anything-el/)这样的包添加更多我的生产力比拥有改变parens和东西的钥匙更重要. (3认同)
  • 关于您的编辑:vim 有 incsearch,只需将 `set incsearch` 放入您的 .vimrc (或输入 `:set incsearch`)。感谢您添加您所做的事情!(Co点仍然是错误的,我将其删除以避免误导人们) (2认同)