繁体   English   中英

用vim replace重新格式化Javascript函数表达式

[英]Javascript function expression reformatting with vim replace

这是我想做的重新格式化:

// before
var name1 = function(){ /* stuff */ }
//after
function name1(){ /* stuff */ }

我使用了vim replace命令:

%s/var\.*\s*\(\w*\)\s*=\s*function/function \1

但是我发现它对于任务来说有点长(匹配一个var,一个单词,一个=和一个函数)...

您将如何更好地做到这一点?

我也将使用替代命令,但略有不同:: :%s/var\\s\\+\\(\\w*\\)\\s*=\\s*\\(function\\)/\\2 \\1

这是我可以在宏中获得的最巧妙的方法:

0diw"fdt dtfw"fP

解释如下:

  • 0转到行首
  • diw删除当前单词的“内部”(即不是以下空格 ,我们将需要它!)
  • "fdt放入f缓冲区(也许用于“功能”?!)删除到下一个空格
  • dtf删除最多下一个f字符
  • w跳到下一个“单词”(这使我们进入开放式的括号)
  • "fP '从光标前的f缓冲区中放入'

现在快速进入~/.vimrc

noremap <F4> 0diw"fdt dtfw"fP

而你是黄金。 (或者您想要的任何快捷键,而不是F4

正如@apsillers所说,您可以捕获function ,因此您不必在replace命令的替换部分中键入它。 这产生了:

:%s/var\.*\s*\(\w*\)\s*=\s*\(function\)/\2 \1

但是,通过使用\\v或非常魔术来减少转义次数,我们可以做得更好。 这样产生:

:%s/\vvar.*\s*(\w*)\s*=\s*(function)/\2 \1

但是,我们仍然存在一些问题:

  • 当简单的\\s+可以匹配时为什么要匹配.*
  • \\w*还将匹配无效的空字符串,因此请使用\\w+

现在我们有:

:%s/\vvar\s+(\w+)\s*=\s*(function)/\2 \1

作为使用替代方法的替代方法,您可能希望使用宏或运行常规命令。 我更喜欢通过:norm使用global, :g和一些常规命令:

:g/=\s*function/norm ^deye3dwe"0p

该命令查找与=\\s*function匹配的所有行并执行normal命令。 我们运行的常规命令是^deye3dwe"0p ,可以将其分解如下:

  • ^将开始该行的开头。 如果您不关心缩进,请删除^
  • de删除单词( var )并保留以下空格
  • ye将拉动或复制带前置空格的变量名称
  • 3dw将删除3个单词,这将使我们在function上处于f
  • 通过e移至功能末尾
  • "0pfunction后粘贴新粘贴的变量名。我们必须使用"0寄存器,因为未命名的寄存器将被3dw破坏

有关更多帮助,请参见:

:h /\v
:h /\+
:h :g
:h :norm
:h "0

@apsillers:将function放入捕获组并用\\2引用

%s/var\.*\s*\(\w*\)\s*=\s*\(function\)/\2 \1

@Enermis:带有宏(假设光标位于varv上):

dwyef(i ^[pbbd0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM