我对2020年编辑工作的几点思考

2020-09-07 10:57:51

最近我尝试了很多编辑器。当我说“尝试”时,我真正的意思是我花了一些时间来配置和使用这些编辑器。我花时间使用的有:

Nevim是我主要的日常编辑,我几乎所有从事的项目都使用它。

Emacs,这是我在Haskell和Rust代码库(以及YAML/Markdown/TOML)上使用的。

Doom Emacs,当我看到我以前工作过的一家公司的同事时,我尝试了这个方法(UI的“统一”感觉和一切看起来如此流畅给我留下了深刻的印象)。所以我试了试。

还有一大堆我不想谈的东西,因为我很快就不用了。

本文的目标是创建我对编辑的看法以及我对当前情况的看法的时间“快照”。十多年来,我一直在使用vim,特别是nevim。在谈论每个编辑器之前,我需要解释一下我目前的工作流程和我在编辑中所珍视的东西。期待一个正在环顾许多编辑的新手的观点。

这只是一个个人工作流程/观点,目前对我来说效果很好。这并不意味着它会对您产生影响,也不意味着不同的工作流程会更糟。

我是法国人,我使用的键盘布局是为了用法语快速打字和编码。事后看来,既然我用英语打字的次数比用法语多,也许我应该选择另一种键盘布局,但我的键盘布局的编码体验真的很棒,所以我留了下来。

键盘布局是bépo。我是通过“推荐”的方式学习bépo的--也就是说,你必须练习打字(法语中的“指纹”)。这意味着我用我所有的手指在键盘上打字,键盘上的每个键都被分配了一个手指来按它。这对肌肉记忆和减轻手腕疼痛有很大帮助(当我在键盘上打字时,我的手腕几乎不动),等等。打字速度是准确和舒适的副作用(如果你好奇,我打字速度很快,但还有更快的人-我每分钟打字大约120到130个字)。因为我认为在编程时速度并不重要,我认为这里要记住的最重要的部分是舒适性:手腕不动,我的手指绕着键盘飞来飞去,不管速度有多快。

出于各种原因,我认为模态编辑器更优秀。第一个是,我真的很讨厌用鼠标做一些事情,而不必用光标和点击按钮来移动数百个像素。例如,在我当前的机器上运行一个应用程序,只需键入程序名Altd(我通常使用补全,所以我从不键入完整的程序名),然后按Enter键。所有这一切都没有把我的手从键盘上移开。对于Firefox、kdenlive等程序,我会这样做,但对于终端应用程序,我只需在我的终端中键入并完成它们,我只需用Alt Return打开它。

因此,在编辑器中使用鼠标在光标周围移动对我来说完全不是最理想的,特别是因为我们大部分时间都在编写代码(即,我们在键盘上键入),所以使用鼠标移动意味着在键盘和鼠标之间来回移动几次。也许你不在乎,这对你来说很酷,但对我来说,这是真正的恐怖之地。我做这件事的时候感觉很不舒服。

此外,非模态的现代编辑器通常通过使用箭头键让人们移动,箭头键要么位于键盘的远处,要么像我的键盘一样是60%自制的,不能直接访问,然后需要一个功能键才能启用它们。

这是我喜欢模式编辑器的第一个原因。它们更聪明地利用你的键盘来实现简单但反复出现的功能,比如四处移动。我喜欢它们的第二个原因是,它们为非模态编辑器提供了一种全新的模式(即普通模式),你有一个完整的键盘/许多键来绑定动作,并做很多人们通常用鼠标做的事情,这就是我喜欢它们的第二个原因,也是因为它们有一个全新的非模态编辑器模式(即普通模式),你有一个完整的键盘/很多键来绑定动作,并且可以做很多人们通常用鼠标做的事情。能够将一个编辑器分成几个缓冲区,在缓冲区中移动,转到段落开头,搜索和替换,将动作注册到宏中并重放,等等,所有这些都不需要移动手腕。如果你习惯了鼠标,学习曲线是陡峭的,但一旦你通过了心理障碍,真的,这是我个人的观点,但我真的认为在那之后再次使用鼠标对我来说是一种障碍。

在模式编辑器中使用箭头或h j k l移动的对象。您可以很容易地通过光标在文档中的移动方式发现它们。它通常意味着按住一个键,直到光标到达给定行,然后再按另一个键,直到光标到达给定列,然后调整是否经过了他们想要的位置。

人们使用鼠标,通过点击他们想要放置光标的位置。

人们使用相对数字。这是对第一组的改进:他们通常使用相对数字来知道他们想要非常快地跳转到哪些行,这样在到达他们想要的行之前,他们不必长时间按向上/向下键。取而代之的是,他们看着线条上的数字,按下那个数字,然后按下方向,然后砰地一声,他们就在线条上了。然后,他们使用vim中的典型动作,如$(转到行尾)、f(转到f之后键入的下一个字符的第一个匹配项,如f(将使光标转到下一个()、%(转到匹配的分隔符)或w(转到下一个单词的开头)/b(转到上一个单词的开头)等),以便在同一行上移动得更快(它也可以跨行工作)。

我认为这代表了我看到的人们行为的99.9%。显然,您会明白我不属于第二组People…。但实际上我并不真正属于任何一个。我想,对于大多数人来说,我是如何移动的是错综复杂的,我知道有些人不会理解它的感受。我使用h、j、k、l和第三组中描述的vim的所有动作(甚至更多;我需要四个小时的完整讲座才能解释所有这些动作:d),但这完全取决于我需要旅行的距离。如果我的光标在一个单词上,并且我想移动到同一行上离光标非常近的一个单词的开头,如果它相隔三个单词,我只需输入www(如果我感觉有趣,则输入3w)。如果距离较高,我会使用名为[EasyMotion]的工具。

EasyMotion确实是一个很棒的工具。其想法是,它有几种模式,具体取决于您要执行的移动类型:

按行:此模式允许您跳转到当前(或所有打开的)缓冲区中的任何行。

按字:TIHS模式允许您跳转到当前(或所有打开的)缓冲区中的任何“字”。

按字符:当单词模式不能跳转到特殊操作符或字符时(因为它不能被识别为单词),此模式允许您跳转到当前或(或所有打开的)缓冲区中的任何字符。

我通常的做法是将这三种模式映射到<;Leader>;l、<;Leader>;w>;和<;Leader>;c(在我的示例中,<;Leader>;是空格键)。

键入任何突出显示的字符都会使我的光标跳转到它。这同样适用于单词,SPC w:

对于字符模式,在按SPC c之后,我必须按下另一个字符(我想跳到的那个字符)。假设我们想跳到#(它不是单词的一部分):spc c#:

这种移动方式一开始并不直观,但一旦你习惯了,就会…。这是必备的。

在我喜欢模态编辑的所有事情中,下面是我期望拥有的功能的非穷尽列表:

C-I和C-O:它们允许我跳到缓冲区中的某个/a文件/某个位置,然后使用C-o返回到我之前所在的位置(像读出一样),或者使用C-I再次返回(像读入一样)。

宏和寄存器:它们允许我通过分配单个键来粘贴内容,从而将内容拖到不同的寄存器(如剪贴板)中。例如,我可以使用";TYI((“将yank放入matching()内的测试寄存器中),然后使用";tp粘贴该内容。宏允许更强大的编辑控制,方法是使用关键字q为一组动作分配一个键(qa会将所有下一次击键和动作注册到a宏中)。然后,例如,只需使用@a重放宏。

显然,所有基本的vim动作,比如d删除,y拖动,c更改,t转到您搜索的字符之前的字符,%转到另一个分隔符,等等。还有更复杂的文本操作,比如“让我们更改这个函数参数列表中的内容,由(”:ci(.。

列出所有内容会花费太多时间,但主要思想是:在编辑代码时需要模态特性。

那么让我们来谈谈我在前言中提到的编辑名单。这个想法是为了给出我自己对这些编辑的看法。关于我喜欢编辑代码的方式,以及我认为缺少的地方,我喜欢他们的哪些地方。

我目前在它的TUI版本中使用nevim,因为它是迄今为止对我来说最稳定、最快速、最简单的nevim体验。我已经尝试了几个图形用户界面版本,但是一直没有找到我想要的--主要原因是它们几乎都使用网络™技术,这对我来说很难说不。我想我应该对最后一点做更多的阐述。

在我的机器上编辑内容与Web技术无关。这适用于许多其他事情,但实际上,在编辑器中运行复杂的JavaScript VM/CSS引擎在很多层面上都是错误的(性能是第一个层面)。

大多数时候,基于Web技术的编辑器需要很长时间才能加载。是的,甚至VS Code--请记住,我的每日编辑器是nevim,它在大约23ms的时间内加载,安装了近50个软件包(您可以使用:profile来获取该值)。在这23毫秒中,co.nvim花费了大约12毫秒。

NPM是有史以来编写的最糟糕的软件之一。请不要让我再用一次。

所以我使用了几个我将要描述的插件。我认为重要的是让人们知道所有这些,因为在集体思想中,人们仍然认为vim/nevim是过去的编辑。其实也不算。

Ryanoasis/vim-devicons添加了许多Unicode图标,其他软件包将使用这些图标来提供更华丽、更性感的界面体验。

SINNHE/SONOKAI,我目前使用的配色方案。这与你用“末日Emacs”得到的东西非常相似--尽管它的对比度稍低一些。

塑料男孩/vim降价降价支持nevim。默认情况下,nevim已经对Markdown提供了很好的支持,但是这个包有几个很酷的特性,比如Folds。我用了那么多褶皱,可能会把它扔掉。

Mzlogin/vim-markdown-toc一个非常酷的包,它提供了一种在Markdown缓冲区中创建目录的方法,并让nevim在编辑标题时自动更新部分。

Norcalli/nvim-Colorizer.lua一个超级酷的扩展,它将自动更改包含十六进制值的文本的背景色,例如#f8324F或#42cf69:

AirBlade/vim-gitgutter是我安装过的最好的插件之一。它提供了在GIT中编辑版本文件(添加、修改、删除等)时在缓冲区顶部看到的檐槽:

但它可以做的更多,在它可以做的所有事情中,它可以帮助您在编辑器中预览块、舞台或丢弃它们。这对我来说简直就是一场爆炸:

Tpope/vim-逃逸您希望在nevim中从git中找到的所有功能。您可以看到diff、解决合并冲突、编写提交消息等。然而,我倾向于仍然停留在命令行上,因为我还没有完全解决这个插件通常如何处理修复和挤压的问题。

Lymsd/git-messenger.vim这是一个光标错误工具。实际上并不是很有用,因为fugiant已经有了一个git指责窗口,该窗口将用提交注释每一行。我有时会用这个,但我可能会把它扔掉。

Tveskag/nvim-debut-line A git blout内嵌在您的行的右边。例如,非常类似于VS Code中的默认git插件。

Juegunn/fzf.vim如果您需要安装一个插件,那就是这个。它有如此多的功能:打开文件,git文件,缓冲区,抓取,搜索历史,命令,配色方案等等。顾名思义,它使用fzf作为后端,所以你会得到非常酷的模糊搜索体验(具有精细化的搜索,这是我在任何其他编辑器中都很难找到的-也就是说,你可以键入一些东西,然后放入空格并再次键入,以匹配实际匹配之前发生的事情)。

Machakann/vim-illitedyank一个有趣的功能:它会突出显示你为了获得更好的视觉反馈而拉出的线条/物体。令人惊讶的是,Nevim在默认情况下没有这一点。

Liuchxu/vista.vim我不时地使用这个命令来获得符号树,但是现在输出结果并不是很吸引我。我可能也会抛弃它。

到目前为止,neoclide/oc.nvim是nevim最好的完成引擎。我过去常用其他的,比如麦芽酒,但这次是王牌。它基本上为您提供了许多语言的LSP补全功能。它有一个集成的市场,你可以用它来安装新的LSP服务器和集成,它甚至支持完全不相关的东西(有点令人惊讶,我认为这些应该是独立的插件),比如coc-explorer(对我来说,它现在是NERDTree的替代品),coc-snipits,等等。

刘成旭/vim-key哪个密钥来自emacs,但适用于nevim。基本上,当正确设置时,它将为您提供序列可能的键绑定的可视列表。我认为它不是很有用(或者它对于试图使用您的配置的人来说是有用的,或者如果您安装的插件附带了很多键绑定--顺便说一句,我真的不喜欢这些),但是它看起来相当酷。

SirVer/ultisnips代码段支持。Ultisnips的代码片段引擎允许很大的空间,比如通过shell、VIML、Python等进行插值。

Juegunn/vim-asy-align一个相当整洁的插件,只需几次击键即可轻松对齐文本/表格。

六城旭/vim-clap将所有可能的搜索/模糊查找源整合到一个现代快速的UI中。不幸的是,现在这个插件对我来说相当不稳定,所以我一直使用fzf。

很快的。真的是这样。它马上就会打开。无论我使用的是哪种终端(即使我当前使用的是alacritty),四处移动、滚动等都很流畅。

在nevim中投入的插件和努力真的很棒。我非常喜欢vim-githerter;我也非常喜欢这个着色器插件。到目前为止(在很大程度上),co.nvim一直很受欢迎。EasyMotion正在给我打色情片。Fzf太快了,应该是非法的。

Nevim有一个对他们正在做的事情真正充满热情的社区,新版本增加了许多非常酷的功能,我们很快就会在新的插件中采用这些功能,比如弹出/浮动窗口/Linter注释的虚拟文本等等。

有些东西我还没有谈到,但它是vim/nevim::help页面的杀手级特性。我认为没有其他软件有这样一套很酷的帮助页面。真的,试一试吧。您想知道如何配置co.nvim吗?只需键入:help coc-nvim。

插件管理器是存在的(我个人使用vim-Plug,但你会发现更多),它们让你的生活变得如此轻松。

尽管我喜欢TUI的速度(到目前为止我还没有遇到过更快的),但TUI对我来说就像黑客一样。例如,如果您将一个窗口拆分为两个缓冲区,那么垂直的“标记”、“边缘”,无论您想怎么称呼它们,都是实际的Unicode字符。终端的工作方式使得忽略这些字符成为可能,但它仍然让人感觉毛骨悚然。如果你想要一些东西,比如小地图,或者一些文本周围简单的薄框,或者任何一种比简单地变成粗体模式或底层更复杂的视觉反馈,你基本上是得不到的。

New vim的GUI是…。没有达到我的期望。不管怎么说,他们中的大多数都是基于网络技术的,所以他们对我来说不是很好的候选人。对于其余的人,就像基于Qt的客户一样,他们觉得有点被抛弃了:(.。有一些人试图制作新的,但他们还没有准备好AFAIK。

Coc.nvim有时觉得自己在做错误的事情。例如,在编辑Java时,当试图跳转到符号定义(或简单地查找符号)时,它经常会超时。那太糟糕了。

在编辑器运行时更改配色方案是浪费时间,并且到处都会生成不完整的语法突出显示。这是我的遗憾。:(。

所以我不会在这里谈论太多,因为我才刚刚开始在工作中使用它(社区版)。我用的是香草的,几乎没有改动。我只用它编辑Java。

Java支持确实是完美无缺的。它为你做了很多事情,其中,我真的印象深刻:

重构机制允许我选择函数内的代码块,要求编辑器“将其移动到专用函数中”。到目前为止,所有编辑器都可以做到这一点,但给我留下深刻印象的是,IntelliJ的想法能够找出需要捕获哪些变量并将其作为参数放入函数,然后在替换移动的代码块时自动在调用点传递它们。真的很整洁。

查找符号、查找已实现的函数、继承类、超类等的速度。所有这些都是即时的,都很好地呈现在您面前。我的胃口。

语法突出显示还可以;我特别喜欢这两个变量声明的内联类型属性,而且在将参数传递给函数时也是如此。

我使用的是社区版,它只支持Java和其他一些配置语言。例如,您得不到分析器--这将是非常令人感激的!

尽管编辑器的异步部分令人印象深刻,但它有时会在随机时间为投影编制索引,如果你在笔记本电脑上工作,那么当机器升空时,要做好登陆火星的准备!-也就是说,当它发出海拉的噪音并迅速升温时。

我尝试了Vim集成,但我无法将其与我的bépo键映射一起正确使用。无法重新映射某些运动和/或模式开关。我把它弄坏了,深深地哭了起来。

如果没有Vim支持,即使编辑器有很多快捷键,您仍然需要使用鼠标来执行非常基本的任务。

因此,这是一个很重要的问题,因为它是微软在编辑方面的做法。似乎每个人都喜欢VS Code,我知道为什么。用户界面流畅而快速-对于基于网络的编辑器…而言。)。LSP支持显然是高级的,完美无缺。它有很多社区插件、主题和集成。在很大程度上,尽管它是基于Web的,但我一直很享受它。

社区很大,现在大多数人都在用,所以我猜如果你有什么麻烦,可以四处打听一下。

事实上它是用网络技术写的。在所有基于Web的编辑器中,它是最快的,但是如果您习惯了vim/new vim,您还是会对它不满意。

VIM集成很差/不起作用(我尝试将h重新映射为c-reemory,bépo键盘布局)。这根本行不通。

我最近一直在使用emacs(香草),因为我看到一个同事在使用doom Emacs。我把这两个放在同一个部分,因为它们非常相似。我对Emacs和Deom Emacs的看法可以用一个词来概括:团结。我不知道他们是怎么做到的,但是所有的插件都能很好地相互融合。我使用Ivy界面进行完成和模糊搜索,所有东西都非常…。9~10成熟。用户界面很华丽,主题很棒(我喜欢默认的黑色主题,毁灭主题),编辑器相当快-对我来说仍然比nevim慢,特别是在滚动时,但仍然比基于Web的编辑器快得多。

一旦正确设置(更好的默认值等),编辑器就会感觉非常现代(就像您在VS Code/ATOM中会发现的那样)。感觉很光滑,而且设计得很好。

E。

.