LINUX.ORG.RU

Форматирование кода на javascript

 


2

2

Казалось бы, если открыть *.js файл и нажать =G, файл должен красиво отформатироваться с отступами. Однако почему-то это работает только в самых простых случаях. Если же взять, например, следующий код

var obj = {
	"a": {"b":
		[f(c,
		   d),
		   g(e,
		     h)]},
		     "i": {"j": 0}
};

стандартный форматтер обламывается. Как и этот, и этот. Я ожидал, что хоть какой-нибудь из них хотя бы ключи «a» и «i» поставит на одном уровне отступа, но не тут-то было.

А вот как выглядит этот код, отформатированный питоновским jsbeautifier:

var obj = {
    "a": {
        "b": [f(c,
                d),
            g(e,
                h)
        ]
    },
    "i": {
        "j": 0
    }
};

Я что-то упускаю?

Same shit, bro! Это у вима временами сносит крышу при форматировании JavaScript.

Плюсую к вопросу — может, кто-то разобрался как этот периодический баг фиксится??

noomorph ()

Кстати, если jsbeautifier работает хорошо и к нему есть CLI, то предлагаю разобраться как отдать ему выделенный фрагмент в visual mode, и отформатированным аутпутом заменить его соответственно. VimL (или как этот язык называется) я пока что не знаю, но есть возможность как раз разобраться.

В идеале лучше пофиксить =, но и такой вариант мог бы сгодиться как временное решение.

noomorph ()
Ответ на: комментарий от noomorph

Кстати, если jsbeautifier работает хорошо и к нему есть CLI, то предлагаю разобраться как отдать ему выделенный фрагмент в visual mode, и отформатированным аутпутом заменить его соответственно.

Это как раз не проблема, утилиту, запускаемую по =, можно указать в equalprg:

autocmd FileType javascript setlocal equalprg=js-beautify\ --stdin
discordia ()
Ответ на: комментарий от noomorph

Немного не так делается, но можно:

... When this option is empty
the internal formatting functions are used; either 'lisp', 'cindent'
or 'indentexpr'. ...

Т.е. нужно настраивать 'indentexpr'.

xaizek ★★★★★ ()

успешно использую какой-то плагин к виму для этого, но на работе. через часик напишу какой именно, и как настраивается.

waker ★★★★★ ()
sudo npm install -g js-beautify
nnoremap <leader>ff :%!js-beautify -j -q -B -f -<CR>

\ff (если leader-key дефолтный, слеш) делает вот так:

var obj = {
    "a": {
        "b": [f(c,
                d),
            g(e,
                h)
        ]
    },
    "i": {
        "j": 0
    }
};

clojure ()
Ответ на: комментарий от waker

Это всё хорошо, но почему не работают нормально стандартные средства? Это баг или какой-то принципиально неустранимый недостаток?

discordia ()
Ответ на: комментарий от discordia

а что, в виме где-то заявлена искоробочная поддержка javascript indenting?

вобщем, вот что у меня:

плагин брать отсюда: https://github.com/pangloss/vim-javascript

.vimrc:

filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle "pangloss/vim-javascript"
filetype plugin indent on

function SetJSOptions()
    set noexpandtab ts=4 sw=4 indentkeys=0{,0},0),0],0\,,!^F,o,O,e,!<Tab>
    let b:javascript_fold=0
    let g:javascript_conceal=1
    let javascript_ignore_javaScriptdoc=1
    set regexpengine=1
    syntax enable
endfunction

autocmd BufNewFile,BufRead *.js call SetJSOptions()
waker ★★★★★ ()
Ответ на: комментарий от waker

Но ведь оно не справляется с приведенным кодом, только что перепроверил с этим конфигом.

discordia ()
Ответ на: комментарий от waker

По поводу искоробочной поддержки: да, её нет, вместо неё cindent и cinoptions.

discordia ()
Ответ на: комментарий от discordia

да, ты прав, не справляется. я именно твой код не проверял. с тем, что я пишу, всегда справляется :)

возможно, есть смысл сообщить автору vim-javascript, мож пофиксит.

По поводу искоробочной поддержки: да, её нет, вместо неё cindent и cinoptions.

которые для C, собсно

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.