你认为在vim和emacs中写作或编程时有不同的感觉/风格吗?

9
在我写的许多脚本中,我经常以“函数式风格”构建程序。也就是说,我基本上在开头定义了许多函数,然后稍后应用这些函数。这导致了一系列嵌套的函数调用,其中我会输入:
  1. 函数名称
  2. 其参数
  3. 下一个函数名称
  4. 其参数
等等。
对于那些“管道”在一起的函数,一个函数的输出通常是下一个函数的参数(通常是第一个,但不总是),输出又成为下一个函数的参数,以此类推。在前缀表示法中,如果您从左到右键入此序列,则关键操作可能非常跳跃。例如,您将如何键入以下[Python]示例的第二行(~mul~是乘法,~truediv~是除法)?
from operator import add, mul, truediv
print(truediv(mul(add(1,1),2),4))

如果我必须按照线性方式编写相同的操作(从左到右,而不是跳来跳去),我更有可能使用函数组合符号。在我的前一个Python示例的基础上,我可能会这样写:

from functional import foldr, compose, partial, flip
print(foldr(compose,add,(partial(mul,2),partial(flip(truediv),4)))(1,1))

我认为这是因为我将每个函数与其自己的参数相关联,并且更喜欢连续输入它们,而不是在填写第一个函数的参数列表之前,将参数填充到另一个函数中(如从左到右键入第一个示例所需的那样)。
我注意到这一点是因为我长期以来一直是emacs用户,最近才尝试了viper / vimpuse和vim。在emacs中,我可能会做类似以下的事情:
1. [输入函数名称和参数] 2. C-a 3. [输入下一个函数名称] 4. C-e 5. [填写其余参数] 6. C-a 7. [输入下一个函数名称] 8. C-e 9. [填写其余参数]
等等,如果我出错或忘记了某些内容,就会偶尔使用M-b,M-f,M-DEL(backward-word,forward-word,backward-kill-word)。
我最近发现了vim中的C-o,这是一个救命稻草 - 但我发现等效的按键将是:
1. [输入函数名称和参数] 2. C-o 0 3. [输入下一个函数名称] 4. C-o $ 5. [填写其余参数] 6. C-o 0 7. [输入下一个函数名称] 8. C-o $ 9. [填写其余参数]
等等; backward-word,forward-word和backward-kill-word的等效项将是C-o b和C-o w,以及C-w。
所以这让我想到,要在vim中编程,我可能需要扩大工作记忆,以便我可以暂停一个函数的构建,同时填写另一个函数,并一直向下堆栈。此外,在构建文本文档时,我发现我经常进行编辑(kill,copy,yank),甚至在完成完整思想之前就频繁进行编辑,这对于vim的操作风格“保持正常模式,插入模式中的文本突发,然后回到正常模式”来说并不那么方便,这似乎假定我能够在进入插入模式期间产生值得编辑的内容。为了使用vim,我发现自己在输入时更加谨慎,以减少模式之间的切换频率。这是因为我天生就是神经质的原因,还是一旦我掌握或将适当范围的vim键命令记忆到肌肉中,我就会停止认为它们如此不同?
如果您在emacs和vim中编程,您是否发现自己在每个编辑器中以不同的方式思考和构建程序和文本块?

2
这应该是一个社区维基。 - Alison R.
你说得对 - 谢谢。已更改。 - hatmatrix
1个回答

4

我从1992年开始使用vi,一直使用到2001年转而使用Emacs。在编写函数和代码块时,我没有注意到任何思维上的差异。这两个编辑器都有自己的特点和处理方式,但它们并不足以改变你的思考方式和编程方式。

我总是尝试找到实现我的意图的方法。我不会让编辑器强制我做我不想做的事情。当我对新代码进行过程化编程时,我使用一种称为“愿望式思维”的技术,它在《计算机程序的构造和解释》中提到

你想象自己处于完美的世界中,拥有所有需要的过程。你使用所有那些有用的函数来编写你的算法,这些函数将需要实现,但目前只有原型。这类似于自顶向下的方法。


谢谢 - 是的,我也会为C或Fortran代码做同样的事情。你还强调了我的潜在问题,那就是编辑器是否会改变你的思考方式... - hatmatrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接