如何在Vim中格式化JS代码?

如何在Vim中格式化JS代码?,vim,Vim,我有一点JavaScript 15 $('.ajax_edit_address').each(function() { 16 $(this).ajaxForm({ 17 target: $(this).parents('table.address').find('tr.address_header').children(':first'), 18 success: function(response) { 19 $('input, s

我有一点JavaScript

 15   $('.ajax_edit_address').each(function() {
 16     $(this).ajaxForm({
 17       target: $(this).parents('table.address').find('tr.address_header').children(':first'),
 18       success: function(response) {
 19         $('input, select, textarea', '.ajax_edit_address').removeClass('updating');
 20       }
 21     });
 22   });
这是我喜欢的格式。但是假设我刚打完一些东西,我想把它整理一下。所以我在上面运行Vim代码格式化程序

=7j
结果是

 15   $('.ajax_edit_address').each(function() {
 16       $(this).ajaxForm({
 17 target: $(this).parents('table.address').find('tr.address_header').children(':first'),
 18 success: function(response) {
 19 $('input, select, textarea', '.ajax_edit_address').removeClass('updating');
 20 }     
 21 }); 
 22       });
Vim似乎在函数作为方法参数时遇到了问题

以下是我认为与我的.vimrc相关的部分

:set cindent shiftwidth=2

" indent depends on filetype
:filetype indent on

:filetype plugin on

是否还需要安装或配置其他东西来格式化JS代码?

不幸的是,“cindent”无法完成这项工作,因为它与C语法有很大关系。由于javascript的所有默认缩进脚本都是启用“cindent”,所以这没有多大帮助。它甚至在剧本里这么说

“维修人员:没有!想改进吗?”


除了基本的javascript,我什么都不做,所以我从来没有想过要找到更好的。从vim.org上的快速浏览来看,它可能值得一试。它比较新,所以它可能考虑到了现在使用的更复杂的javascript。

最大的问题似乎是cindent没有意识到这一点语法类型:

test({
  var b = 2;
});
它将把它变成这样:

test({
    var b = 2;
    });
如果您处理这种情况,我想缩进对于jQuery语法来说不会太糟糕。但是这需要您编写一个自定义javascript缩进文件。此外,您必须编辑html缩进文件,以避免对包含javascript内容的脚本标记使用cindent


我认为没有人成功地为javascript创建了与jquery/prototype兼容的缩进文件。现有的javascript缩进脚本都有缺陷。

VIM插件可以正确处理jquery。这是在线的VIM插件版本。

我建议使用CLI版本的einars/jsbeautify,您可以在这里找到:。 这是www.jsbeautifier.org的离线版本


使用此插件,只需按下一个按钮即可在当前缓冲区上运行格式化程序。

有一个简单得多的解决方案,不需要vim插件

安装到您的系统python:

pip install jsbeautifier
然后将其添加到.vimrc中:

autocmd FileType javascript setlocal equalprg=js-beautify\ --stdin
就这样


运行
:帮助equalprg
了解其工作原理。

另一种不需要在vim中配置任何内容的替代方法是在保存时手动运行format命令,如:

:w !js-beautify --stdin >%
以这种方式保存后,
vim
编辑器将要求您重新加载当前文件内容:

W12: Warning: File "src/static/js/main.js" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 
这与
:w sudo tee%
命令类似,该命令用于保存您在没有权限的情况下修改的文件

该命令使用标准输入(
STDIN
)并将其写入用作当前文件源的变量文件描述符
%

PS:当然你需要安装
js-bestify

pip install jsbeautifier
如果您已安装(可用于Python:
pip install jsbelifier
,或节点:
npm-g install js belifiy
),则您可以直接从vim运行它-以重新格式化当前文件:

:%!js-beautify

我刚刚试过;它并不完美,但比默认脚本要好得多。谢谢!有趣的是,jamessan linked脚本似乎能正确处理这种情况,但代码更简单(见上文)这一切都搞砸了…我被这个答案弄糊涂了。当然JS美化器会用无效的语法做奇怪的事情…这个脚本有点奇怪…它会变成:var x=1+2+3+4+5+6+7;变成var x=1+2+3+4+5+6+7;还有其他一些奇怪的情况,所以不要在整个文件上运行它…你可以添加的选项对于可能有用的行:--indent size=3--indent char=char(默认为空格)--indent with tabs--space in paren你可以通过进入命令行并键入“js beautify”来查看所有命令。最好!为什么在这里使用
equalprg
而不是
formatprg
?@nikobealic=用于缩进,gq用于文本回流。如果我在HTML中的
标记中有Javascript,我如何通过可视行模式使用它?