在Emacs或Vim中*实时*进行块编辑


9

jEdit支持块编辑,但是Emacs和Vim在同一主题上似乎存在一些严重的可用性问题。如果有人可以在这里填写未知数,则使用其中任一编辑器将更可承受:

  • 实际的矩形选择屏幕上的选择是矩形,而不是线性选择,然后将其用于计算区域,因为Emacs似乎仅限于此。
    • jEdit:按住Ctrl并选择。
    • Vim:单击Ctrl-v并选择。
    • Emacs:未知;看起来需要400多行插件
  • 实时矩形编辑:在选择块后进行编辑时,查看所有行的结果。
    • jEdit:只需开始输入,就可以看到最终结果。
    • Vim:单击Shift-i并键入。直到按Esc退出插入模式,才会在第一行显示最终结果。未知是否有某种方法可以立即在所有行上查看结果。
    • Emacs:未知;看起来唯一的方法是C-x r t在按之后设置要填充的文本Ret
  • 在文本外部位置的开始和结束选择:例如,我想删除每行的N个开头字符,但第一行和最后一行包含少于N个字符。
  • 内联粘贴块:就像粘贴多行一样粘贴复制的块,例如,将已有的文本向下推,而不是向右推。
    • jEdit:默认值。要将一个块粘贴为一个块,您需要首先选择另一个块。
    • VIM: OEscVp
    • Emacs:未知

常规Emacs块选择功能可以在cua-mode插件中找到。


显然,Emacs的列编辑模式可以执行某种实时矩形编辑:youtube.com/watch?v=k
Tom,

只是关于emacs 400+行“插件”的观察。.gedit的一个有点类似的插件,称为multi-edit,具有1000+行python代码。对我来说,pugin 非常有用(没有它,我如何生存),它的大小是学术性的……如果emacs的广告效果不错,我会很乐意使用它,但是却遇到了加载错误当我跑了“命令行规范化文件名称:参数数量超出范围:‘’1” :( ......这正是我一直在寻找的太..
Peter.O

4
对于尚未使用jEdit的用户,请解释您的术语。我不明白“实时”在这里是什么意思,“实时矩形编辑”是什么,或者“内嵌粘贴块”是什么意思。
吉尔(Gilles)“所以

Answers:


7

我可以回答Vim,但不能回答Emacs。

在文本外部位置的开始和结束选择:

:set virtualedit=block将启用您想要的行为。如果愿意,可以删除初始冒号并将其添加到.vimrc中。有关更多信息,请:help 'virtualedit'从Vim中获取。

内联粘贴块:

如果您只是p在命令模式下命中,Vim将插入该块,并在每行的右侧推入字符。如果您选择另一个块并点击p,Vim将用粘贴的块替换该块。

您可以使用命令模式键序列“逐行”粘贴一个块OEscVp。这会在当前行(O Esc)上方插入一条线,沿行()选择它V,然后将其粘贴(p)。您可以使用(例如)- yp这样的映射将其缩短为(例如):nmap yp O<Esc>Vp。使用五次击键,<Esc>而不是按Escape键。


不错的提示virtualedit; 必须尝试一下。关于内联粘贴,请参阅更新的问题以获取对预期功能的描述。
l0b0 2011年

我已经更新了答案,可以按行粘贴块。
詹德(Jander)

5

例如,我想删除每行的N个开头字符,但第一行和最后一行包含少于N个字符。

Emacs:从第一行开始选择,然后将缺少的字符数(例如空格)添加到最后一行,然后使用kill-rectangle

或者,查看artist-modepicture-mode,不管行长如何,该均可使您在窗口中自由移动。

内联粘贴块

Emacs:首先通过kill-rectangle或将其保存到寄存器保存该块,然后转到插入点,使用delete-rectangle然后插入保存的矩形。

看起来需要400多行插件

如果是Emacs,为什么会出现问题?可以编译插件,而emacs的理念是您不将所有内容都放入内核,而是使用插件来扩展编辑器。


4

“CUA模式”附带的emacsen 22.1及更高版本,或按照链接到下载早期版本的Emacs。有一个简短的视频介绍了该功能。

对于一般的矩形命令,请尝试阅读手册,该手册提供了简单的介绍。


emacs cua-mode看起来不错!+1 ..我找不到您提到的视频,请在问题下方的评论中查看Tom的链接,以获取指向(不同的?)信息视频的链接...
Peter.O,2011年

@ferd Ooops,剪切/粘贴错误,已修复。
Trey Jackson

0

在vim中,删除前n个字符的典型方法是执行:%s/.\{0,6\}//

%将处理整个文档;您可以将其替换为所选内容或您关心的实际行。该s命令用于“替换”。它将用您提供的任何内容替换正则表达式,并且除非添加特定选项,否则每行仅匹配一次。- /是分隔符-可以是任何字符,但/通常使用,除非使用其他字符有利(这样,您不必/在命令的其余部分中转义)。第一个定界符后面的参数是一个正则表达式,将用于在您的选择中查找匹配的字符串。第二个定界符后面的参数是将替换为匹配项的参数。

因此,该命令说找到0到6个任何字符的实例,然后将其替换为空。


不是我要的。
l0b0 2011年

但是您认为这对发现此问题的其他人没有用吗?我想是的,这就是为什么我把它放在这里。
肖恩·高夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.