VIM-这不仅是编辑器,而且还与您的所有工作环境集成在一起

为什么Vim / Neovim特别好? 您的工具包不仅是一个编辑器(它本身可以通过插件很好地扩展并且具有丰富的基本功能,并且在定制领域非常灵活),而且还包括您的整个工作环境 ,以及gnu / coreutils和不只是 您可以在不离开编辑器的情况下使用任何程序或解释器,并直接在编辑器中使用它。


前言


这篇文章是为某个私人圈子而匆忙撰写的,但是我认为很有可能将其发布在Habr上。 对于某些人来说,这可能会成为一种灵感,有人会帮助更好地理解Vim的哲学,而别人会为自己采取一些技巧。 为了以防万一,我会保留一点意见,我不希望我会在评论中向某人证明某些事情,例如,说服您一定要放弃自己的胖IDE并开始使用Vim,我对此一点都不感兴趣。


对企业


例如,在这里,采用这样的一段代码(来自Haskell项目配置),一个包依赖关系列表(例如在真空中):


build-depends: X11 , base , directory , extra , GLFW-b , safe , aeson , containers , data-default , text , process , time , dbus 

我们想要什么?


  1. 依字母顺序排序依存关系
  2. 不区分大小写地排序( X11GLFW-b不应超过所有内容)
  3. 还原逗号( aeson会移到最顶部,并且它的左侧不再应该有逗号,但是X11的左侧应该有一个逗号)
  4. 恢复缩进(以便您还可以从历史记录中获取命令,并在具有不同嵌套级别的另一个配置中重用该命令,甚至可以在Vim配置中绑定热键命令)

解决方案


首先,选择(通过视觉突出显示)除第一行build-depends外的依赖项列表。 当然,您可以按V (具有逐行选择的可视模式),然后通过jk或向上和向下箭头选择所需的行。 就我而言,我使用可视模式的自定义热键一挥手来完成此操作:


 xn iz <esc>[zV]z 

例如,在依赖项列表的中间,我只按viz键,所有依赖项都被突出显示,因为 整个折叠都突出显示,这又是当前的嵌套块(因为我已将foldmethod定义为indent )。 但您也可以按顺序手动键入[zV]z而无需自定义热键( [z跳到折叠的开头,a ]z到结尾),但是 对我来说,经常使用这样的操作,然后我将其缩短为viz -没有像shift这样的修饰符,它会在反射时立即压缩(最接近的标准类似物是vip以选择一个最接近的空行的块)。


然后按:冒号)进入命令模式,以执行相对于当前视觉突出显示的命令。 实际上,这是通常的命令模式,但是会立即添加选择标记,即 看起来像:'<,'>其中'<,'>是选择范围,其中'<是视觉选择的第一行,而'>是最后一行。


单击后! (感叹号)在键盘上,这意味着进一步操作都是shell / bash(取决于设置)命令。 它看起来像:'<,'>! 。 实际上,突出显示后,您可以立即单击! 并得到相同的结果- :'<,'>!


此操作会将突出显示的行重定向到STDIN命令,并将突出显示的行替换为该命令的STDOUT排气口。 例如,您可以使用sort命令,仅用于验证,结果不是我们需要的- '<,'>!sort ,然后按Enter ,我们得到:


  build-depends: , aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time X11 

coreutils和一般塔楼的时尚


恢复上一个选择(您可以按gv恢复上一个选择),然后按! 然后是向上箭头-这将恢复历史记录中的最后一条命令,因此我们无需再次编写,我们只需从历史记录中提取先前的命令并进行更改即可。 为了更舒适地编辑命令,可以按Ctrl + f这将打开其他命令。 顺便说一句,具有标准命令编辑功能的窗口以及Vim的所有功能,历史记录中的所有以前的团队都将在这里显示为单独的行,也可以选择,编辑和执行这些行。


正确的做法-您可以想到一个发现,我的意思是:首先删除逗号,对它们进行排序(不区分大小写)(不区分大小写),然后返回逗号(第一行除外)。


首先,使用sed命令和正则表达式( [, ] -逗号或空格,然后是另一个空格, \(\w\)转义括号以突出显示,以除去逗号(第一行具有一个额外的缩进,以便所有行都具有相同的缩进)块进行替换,因此它可以用作\1\w是第一个字母字符,在替换中,我们将通过替换\1来恢复字母字符:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' 

我们得到以下内容:


  build-depends: X11 base directory extra GLFW-b safe aeson containers data-default text process time dbus 

接下来,我们将(通过符号|是bash的功能)通过管道传递给sort sort命令,并传递-f以区分大小写:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' | sort -f 

我们得到:


  build-depends: aeson base containers data-default dbus directory extra GLFW-b process safe text time X11 

快完成了! 它仅保留添加逗号和第一行-几个空格。 我们使用相同的sed ,在其操作语法中,您可以指定字符串和字符串范围(如在Vim本身中,语法是相同的,很好的或几乎相同的)。 前缀1表示第一行, 2,$表示从第二行到末尾的范围( $类似于^表示文件的开头,类似于正则表达式中的相同字符,表示该行的结尾和开头)。 我们将使用\w跳过缩进并立即选择第一个字母字符: 1s/\w/ &/ -在这里,我们替换第一行,通过&还原第一个字母字符(类似于\1 ,只有&表示所有内容在整个正则表达式下, \1表示第一个用括号括起来的块),并在其前面添加了两个空格。 对于其余的行,而不是两个空格,请添加逗号+空格,后跟: 2,$s/\w/, &/ ,整个命令将如下所示: sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' ,-- -e我们用来将2个操作彼此分开。 在Vim中,整个操作如下所示:


 :'<,'>!sed 's/[, ] \([^, ]\)/\1/' | sort -f | sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' 

我们申请并获得:


  build-depends: aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time , X11 

做完了! 不再需要写第二遍了,只需键入前几个字符即可,例如: :'<,'>!se (实际上,您只需要按!se ),然后使用向上箭头从历史记录中获取所需的命令。 一种或另一种方式,我经常建议立即练习写这类东西。 因此,您将同时在bash和Vim本身中提高日常工作技能, 本质上,您在做同一件事。


最后,可以将整个命令分配给一个热键,或抽象为一个函数,然后在任何地方重复使用一个或两个。


使用第三方PL


您可以运行某种对您方便的语言的解释器,而不是从coreutils中启动某些东西,我喜欢通过Perl6 (最近将它重命名为Raku )来做这些事情:


 :'<,'>!perl6 -e 'my @x=lines.map(*.subst(/<[,\s]>\s(\w)/,{$0})).sort(*.lc); @x.shift.subst(/\w/,{q/ /~$_}).say; .subst(/\w/,{q/, /~$_}).say for @x' 

是的,至少在zoskoscript(node.js)上:


 :'<,'>!node -e 'let fs=require("fs"), x=fs.readFileSync(process.stdin.fd).toString().replace(/\n$/,'').split(/\n/).map(x=>x.replace(/[, ] (\w)/,"$1")).sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())); console.log(x.shift().replace(/(\w)/," $1")); process.stdout.write(x.map(x=>x.replace(/(\w)/,", $1")).join("\n"))' 

这也可以在Vim本身的VimL / Vimscript上完成,而无需调用外部命令。 但是这篇文章不是关于这个的。


自然,正如您可能已经猜到的那样,您可以轻松地将脚本保存到单独的文件中,甚至可以编译自己的程序,该程序需要输入STDIN并输出在STDOUT中处理的内容,然后只需调用以下命令即可在Vim中使用它: ,同样,可以将其分配给热键):


 :'<,'>!~/my-program-or-script 

因此,当您在Vim中编写代码时,不仅Vim本身可以使用,而且整个工作环境都可以使用。


最简单的示例之一是拒绝JSON文件:


 :%!jq 

只需几次按键操作,当您可以通过jq获取并运行文件而无需离开Vim时,为什么还要为任何新的编辑器/ IDE /等等重新发明AST解析器和prettifayer的JSON? 我不是在谈论这样一个事实,您可以通过jq以这种方式处理大型JSON文件,而无需离开Vim,例如在树中找到所需的键,进行排序,仅保留必要的数据,等等。

Source: https://habr.com/ru/post/zh-CN483580/


All Articles