LINUX.ORG.RU

Веб-разработка в Vim

 


28

11

Предлагаю обсудить и поделиться опытом по веб-разработке в Vim.

Я использую Vim в терминале termite (со своими патчами для дефолтного копипаста и прочее) с цветовой схемой gruvbox: как для терминала, так и для Vim.

Этот клавиатура-ориентированный vim-like терминал я упомянул не столько потому, что у него реализованы режимы как Vim (insert mode, selection mode, выделение клавиатурой включая блочное), а потому, что у него есть приятная фича (которую можно наблюдать в iTerm2 для OS X) при работе Vim'а в нём, а именно цвет курсора изменяется в зависимости от цвета символа, на котором находится курсор, а также при выделении цвет выделения повторяет цвет слов/строк (но без инвертирования где нужно, может еще допилят), скриншот.

Менеджер плагинов:

Перед обсуждением плагинов и настроек, хочу подчеркнуть почему я использую менеджер плагинов vim-plug: перепробовав все известные менеджеры плагинов, включая недоменеджер pathogen, остановился именно на vim-plug потому, что он самый быстрый (параллельная установка/обновление, к-во потоков настраивается), имеет приятный интерфейс, краткий синтаксис, а самое главное позволяет настроить загрузку или отключение плагинов по filetype и/или первому вызову самого плагина, это не только ускоряет старт/работу Vim, но и помогает разрулить конфликты некоторых плагинов, простой пример:

Plug 'tpope/vim-endwise',   { 'for': [ 'ruby','vim','sh','zsh' ] }
Плагин endwise будет загружен только для ft=ruby,vim,sh,zsh, т.к. если этот полезный плагин работает одновременно с не менее полезным плагином delimitMate, то возникает конфликт в файлах с ft=css,js и везде, где после открытия скобки нужен автоматический переход на следующую строку и автозакрытие скобки.

Кроме всего прочего, отдельно от веб-разработки-related для самого вима у меня такое:

Автоматическое переключение на английский в Normal mode и обратно на предыдущий в Insert mode:

Конечно же нужно решать проблему с локалями (т.к. веб-разработка, в отличие от программирования иногда ведется на отличных от английского языках), а именно с неудобством при их переключении в Normal mode и обратно, самое лучшее решение, это установка в систему xkb-switch + плагин в Vim для него.

Plug 'lyokha/vim-xkbswitch'
let g:XkbSwitchEnabled       = 1
let g:XkbSwitchLib           = '/usr/lib64/libxkbswitch.so'
let g:XkbSwitchIMappings     = ['ru']
let g:XkbSwitchSkipIMappings = {'*' : ['[', ']', '{', '}', "'"]}
Теперь не нужно переключать на английский входя в Normal mode и на русский обратно в Insert mode, переключение происходит автоматически. Очень удобно.

Линейка номеров строк:

set nu
set nuw=4
autocmd InsertEnter * set nornu
autocmd InsertLeave * set rnu
в Insert mode - с номерами строк всё как обычно, в Normal mode (точнее после первого входа в insert и выхода обратно в normal) включается типа линейки: скриншот.

Автоматическая паста с отступами:

Чтобы навсегда забыть эту проблему и не включать перед пастой каждый раз режим пасты или использовать хитрые хоткеи, можно просто добавить настройку:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Замена заменяемого без удаления (проблема забивания иксового буфера обмена):

Чтобы заменить слово или кусок окруженный делиметрами без удаления в иксовый буфер, можно использовать такую настройку на хоткей S :

nnoremap <silent> S :set opfunc=PasteReplace<CR>g@
function! PasteReplace(type, ...)
    if a:0
        silent exe "normal! `<" . a:type . "`>p"
    elseif a:type == 'line'
        silent exe "normal! '[V']p"
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]p"
    else
        silent exe "normal! `[v`]p"
    endif
endfunction
nmap SS S$
Теперь если нужно заменить слово без его удаления, можно просто: Sw , Si" , Si( , и т.п.

Проекты/сессии:

Плагин vim-startify - стартовый экран, можно настроить на сессии и букмарки, чтобы каждый раз не открывать то же самое в сплиты/табы/буферы.

Документация:

Для открытия документации в браузере (как минимум для того, что нас интересует: HTML, JavaScript, CSS, SCSS, LESS, Ruby, Rails, Django, PHP и т.п.) исходя из из ft= и положения курсора, удобно замапить на F1:

Plug 'Keithbsmiley/investigate.vim'
nnoremap <F1> :call investigate#Investigate()<CR>

Автокомплит и сниппеты:

В отличие от YouCompleteMe, автокомплитер neocomplete не тормозит (при работе и старте), не нужен питон (но нужен lua), а всё остальное такое же (для веб-разработки). Интегрируется с родным движком сниппетов neosnippet, который работает как с родными, так и универсальными vim-snippets (объединенные Snipmate & UltiSnip).

Настройка для навигации по комплиту через Tab (сам комплит всплывает автоматически, можно настроить обратное):

imap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
if has('conceal')
  set conceallevel=2 concealcursor=i
endif

ZenCoding/Emmet:

Полнофункциональный Emmet для Vim: emmet-vim

Работает как нужно, но по дефолту неудобный (как по мне) хоткей <c-y>, , я настроил себе на jk . Т.е. Esc у меня kj , а дополнить jk . Первое время пользовался F4, привожу настройки, но jk намного удобнее. Просто на Tab настроить нельзя (иначе как пользоваться Tab?).

Plug 'mattn/emmet-vim',           { 'for': ['html','xhtml','css','sass','scss','less'] }
au FileType html,css,sass,scss,less imap <expr><F4> emmet#expandAbbrIntelligent("\<tab>")
au FileType html,css,sass,scss,less imap <expr>jk   emmet#expandAbbrIntelligent("\<tab>")
au FileType html                    imap <C-\>      <CR><CR><Esc>ki<Tab>
Плагин MatchTag - для отображения парных тегов.

Кроме Emmet'а для Vim существует аналог: Sparkup (нужен питон, не пробовал).

Отображение отступов:

Можно настроить каким символом и цветом отображать линии отступов, я настроил на хоткей <A-i> , альт как непечатаемый символ, так что проще посмотреть настройку склонировав репу на гитхабе и заглянув в .vimrc (или нажать C-v A-хоткей), скриншот.

Plug 'Yggdroot/indentLine'
let g:indentLine_enabled    = 0
let g:indentLine_char       = '¦'
let g:indentLine_color_term = 239
let g:indentLine_color_gui  = '#A4E57E'
nmap ^[i :IndentLinesToggle<CR>

Подсветка синтаксиса:

Plug 'tpope/vim-haml',            { 'for': 'haml'   }
Plug 'wavded/vim-stylus',         { 'for': 'stylus' }
Plug 'groenewege/vim-less',       { 'for': 'less'   }
Plug 'digitaltoad/vim-jade',      { 'for': 'jade'   }
Plug 'slim-template/vim-slim',    { 'for': 'slim'   }
Plug 'othree/html5-syntax.vim',   { 'for': 'html'   }
Plug 'cakebaker/scss-syntax.vim', { 'for': 'scss'   }

Plug 'hail2u/vim-css3-syntax',    { 'for': ['html','css'] }
augroup VimCSS3Syntax
  autocmd!
  autocmd FileType css setlocal iskeyword+=-
augroup END

Проверка синтаксиса:

Для проверки синтаксиса используется Syntastic + сторонние чеккеры:

Plug 'scrooloose/syntastic', { 'for': ['ruby','html','css', 'javascript', 'haml'] }
let g:syntastic_auto_jump           = 1
let g:syntastic_error_symbol        = '✖'
let g:syntastic_warning_symbol      = '►'
let g:syntastic_javascript_checkers = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_html_checkers       = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_ruby_checkers       = ['rubylint' ] " gem install ruby-lint
let g:syntastic_haml_checkers       = ['haml-lint'] " gem install haml-lint
let g:syntastic_css_checkers        = ['csslint'  ] " sudo npm install -g csslint
let g:syntastic_css_csslint_args    = "--ignore=zero-units"

Деобфускация / beautify'еры:

Плагин vim-autoformat работает со сторонними 'formatprograms', например js-beautify для HTML, CSS и JavaScript. autopep8 для питона и т.д. Всё это должно быть установленно.

Plug 'Chiel92/vim-autoformat'
let g:formatprg_args_javascript = "-j -q -B -f -"
noremap  <F8>   :Autoformat<CR><CR>
vnoremap <C-F8> gq

JavaScript:

Дефолтная поддержка JavaScript в Vim на довольно низком уровне, так что необходимы плагины как для самого JS, так и для библиотек, плагин javascript-libraries-syntax поддерживает почти все основные либы: jQuery, underscore.js, Backbone.js, AngularJS, RequireJS, Sugar.js, Jasmine и т.д.

Plug 'moll/vim-node'
Plug 'pangloss/vim-javascript',      { 'for': 'javascript' }
Plug 'jelera/vim-javascript-syntax', { 'for': 'javascript' }
let javascript_enable_domhtmlcss = 1
let g:html_indent_inctags        = "html,body,head,tbody"
let g:html_indent_script1        = "inc"
let g:html_indent_style1         = "inc"

Plug 'othree/javascript-libraries-syntax.vim', { 'for': 'javascript' }
let b:current_syntax       = 'javascript'
let g:used_javascript_libs = 'angularjs'

Также полезен tern_for_vim (сам Tern должен быть установлен), который умеет в 'Jump to the definition', 'Find the type' и т.д.

Пробельные символы:

По A-w показывает, по \-dw удаляет. Перевести все табы в пробелы (вдруг кто не знает), в Vim: :retab .

Plug 'ntpeters/vim-better-whitespace'
let g:better_whitespace_enabled = 0
nmap ^[w :ToggleWhitespace<CR>
nmap <Leader>dw :StripWhitespace<CR>

И кое-какие настройки по-мелочи:

set splitbelow
set splitright
inoremap  kj           <Esc>
map       gm           :call cursor(0, virtcol('$')/2)<CR>
nnoremap  <F12>f       :exe ':silent !firefox %'<CR><C-l>
nnoremap  <F12>c       :exe ':silent !chromium-browser %'<CR><C-l>
1-2 строки: для нормального открытия (слева направо) сплитов.
3: Esc на kj - мегаудобно.
4: для попадания на средину строки.
И последние две для предпросмотра в браузерах.

Мой ~/.vimrc

Кто что использует и как, кроме вышеуказанного?

Не знаю что и сказать, статья просто великолепная! Много чего узнал, особенно вот про эту настройку

Автоматическое переключение на английский в Normal mode и обратно на предыдущий в Insert mode:

Теперь меньше буду психовать когда нужно что-то написать на русском языке.

liathit ★★
()

Спасибо за XTermPasteBegin(), раньше постоянно переключал pastetoggle.

По поводу разрешения конфликтов плагинов через загрузку по filetype: не работает, если разных буферах открыты напр., js и ruby, т.к. runtimepath общий для всех буферов.

mtk
()

Я использую WebStorm/Pycharm. На vim даже смотреть не могу. Ещё Sublime нравится, но он тоже не тянет на IDE.

menangen ★★★★★
()

Юзаю гвим с темой lucius (темный, и кажется поменял бэк), конфиг с нуля под себя, с допилом под платформы. Не-г вим не понимаю. Плагинов не использую, т.к. в основном в нем сишка — всегда хватало path, tags. По поводу ультраудобств не заморачиваюсь, хоть и изучал в свое время, кто что мапит. Раньше имапил альт-кнопку на русский вариант, чтобы не переключаться, и писал инсерт-сниппеты, щас перестал. Затачиваю after/syntax под используемые либы и фреймворки, глаз радовать. В общем-то вим привлекает возможностями метаредактирования — превратить один вид говнокода в другой (if->switch), накидать таблицу вида енум:строка-с-его-именем, выравнивания для красоты, поискозамены НЕХ по проекту. Обвязка рядом в окне терминала, но make, grep, cn, cp иногда интересны. В остальных случаях он не киллер, т.к. кнтрл-влево-право, ц-ц, ц-в хватает, чтобы набирать. Никогда не понимал программистов, для которых важна скорость творческой работы. Важно не отвлекаться на херню и не злиться из-за рутины.

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

А, да. Конфигурил так: открыл мануал по опциям и каждую попробовал в чем разница. Недефолты записал в конфиг. Обмениваться конфигами смысла нет, у каждого руки под свой мпх заточены.

arturpub ★★
()
imap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"

Vimscript выглядит как каша из Perl с ногтями.

Почему на нем продолжают писать, если в Vim давно есть +python?

anonymous
()

Я использую Vim в терминале termite

Прикольный эмулятор терминала. А как он по скорости? С rxvt-unicode сравнивали?

andreyu ★★★★★
()

а самое главное позволяет настроить загрузку или отключение плагинов по filetype

Это значит, что если у меня в буферах вима лежат файлы с разным filetype, то плагин будет то загружаться, то выгружаться? Сомнительное преимущество.

andreyu ★★★★★
()

Автоматическое переключение на английский в Normal mode и обратно на предыдущий в Insert mode:

Использую kbdd + одна строчка в конфиге вима.

andreyu ★★★★★
()

Гитхаб там Atom какой то выкатил, говорят годно и лицензия MIT. Не знаю зачем я тут это написал)

ychuperka
()

спасибо за авто-режим paste ;)

hope13 ★★★
()
Ответ на: комментарий от VimCasts

Приблизительно так делаю я. Тут нет переключения на русский (или предыдущую раскладку) при входе в insert mode, но сделать его легко по аналогии.

autocmd InsertLeave * call SetUsLayout()

function! SetUsLayout()
    if has('unix') && &term == 'builtin_gui'
        silent !qdbus ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout 0 >/dev/null
    endif
endfunction
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Чего-то у меня не работает, ни 'builtin_gui', не 'xterm-256color'.

После выхода в normal - кидает в ввод в командной строке, выход только через C-c.

VimCasts
() автор топика
Ответ на: комментарий от arturpub

То-то с него копируют фишки все IDE ака idea/eclipse и др. Кстати, поддерживает хоткеи Vim, смысл использовать vim в 21 веке при веб разработке мне не понятен. Неужели у всех такие слабые компы, что нормальные Eclipse и IDEA не тянут или некомфортно работать. У меня на проекте примерно в 2.000 файлов IDEA открывается около 4 секунд. Раз в день это сделать не проблема, да и тормозов никаких нет. Sublime так вообще, летает как молния даже с кучей плагинов.

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

Ты мой коммент читал вообще, или тебя вступлением разорвало?

arturpub ★★
()
Ответ на: комментарий от ychuperka

Гитхаб там Atom какой то выкатил

Это саблаймоклон на JavaScript

kravich ★★★★
()
Ответ на: комментарий от menangen

Держу вас за всё, что только можно, главное, не сделать вам больно.

Во многих странах Южной Америки твой аватар явно показывал бы что ты пассывный гэй... что собственно и подтверждается твоим каментом.

А по теме - не понимаешь в чём соль? Проходи мимо, тебе тут делать нечего.
ТС поделился полезными вещами, а ты зачем сюда заглянул?
В общем давай как в поговорке про устав и чужой монастырь.

q11q11 ★★★★★
()
Ответ на: комментарий от menangen

То-то с него копируют фишки все IDE ака idea/eclipse и др.

А ты не подумал откуда сам саблайм эти же фишки скопировал?

У меня на проекте примерно в 2.000 файлов IDEA открывается около 4 секунд.

Ну ок, а гиговый файл оно у тебя сколько минут открывать будет?
Я уверен что твоё IDE просто умрёт при попытке это выполнить.

q11q11 ★★★★★
()
Ответ на: комментарий от arturpub

Важно не отвлекаться на херню и не злиться из-за рутины.

Браво! :)

boombick ★★★★★
()

Esc на kj - мегаудобно.

Ты не сможешь написать blackjack, а также lockjaw и Reykjavik.

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

Ты не сможешь написать blackjack, а также lockjaw и Reykjavik.

Смогу, даже kjkjkjkj смогу написать.

VimCasts
() автор топика
Ответ на: комментарий от q11q11

а ты зачем сюда заглянул?

Чтобы узнать, каково это, разрабатывать на vim. Он, вроде как, просто текстовый редактор. Типа nano.
Вижу вы прямо-таки, геевед. Обязательно обращусь к вам при посещении ЮА, будете помогать находить гетеросексуалов.

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

Я использую WebStorm/Pycharm. На vim даже смотреть не могу.
заглянул чтобы узнать, каково это, разрабатывать на vim.

cам себе противоречишь? уныло выглядит

Он, вроде как, просто текстовый редактор. Типа nano.

ты мне должен новый ноут, жыром всё залил, не отмыть уже

а проверь :-) Откроет так же как и vim, без проблем.

ты сам-то проверял? или это просто тебе так кажется?

q11q11 ★★★★★
()
Ответ на: комментарий от menangen

а проверь :-)

ну ок, попробовал я посмотреть на это чудо...
устанавливать 350 мегов хз чего + дыркониум на 160 мегов только для того чтоб редактировать php + шаблоны ?!?!?
ну уж нет, спасибо, я наркотики не употребляю
мне и так 8 гиг рамы мало, а тут ещё и ЭТО минимум 2 прсит

и кстати, что IDEA умеет такого киллер фичастого чего не может VIM?
ах да, ты же не знаешь что умеет VIM чтоб хоть как-то сравнивать

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

Хороший рефакторинг, поддержку всяких билд-систем и ещё куча всего из коробки. Сам люблю vim, но тут же разные вещи вообще.
По поводу огромных файлов, ну хз. Зачем их открывать. А если уж так выходит, что они создаются и приходится редактировать, то да, обычно vi(m) или sed и grep.

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

Мужчина, я люблю nano, могу гиговые файлы открыть им, присылай. Я пишу о том, что для web-разработки нужно использовать серьезные ide, без которых ты просто не разберёшься в коде. Уверен, что vim не поддерживает и 20-ю часть автокомплита и поиск использованной переменной, экземпляра класса и его переменных, переход к саб-классу и прочее, например, кликнул мышкой на метод экземпляра, и переходишь к её родителю в супер-классе, это vim умеет? Он вообще, мышу поддерживает? А мне хватает 4 гигов на маке, т.ч. доводы смешны, никаких тормозов и гемора с оперативой никогда не было. Просто не у всех программистов «веб разработка» сводится к скачал вордпересс, настроил темы, подправил 3 файла php и один css, и всё, в бой, к заказчику)

menangen ★★★★★
()
Последнее исправление: menangen (всего исправлений: 1)
Ответ на: комментарий от menangen

я люблю nano, могу гиговые файлы открыть им, присылай.

ай не гони, я только что проверил
при попытке открыть дамп на 2.4 гига nano за минуту ничего в терминале не нарисовал, вообще ничего, при этом 2 ядра на 100% загрузки
VIM же этот дамп открыл примерно за 5 секунд и не поперхнулся

Уверен, бла бла бла...

как ты можешь быть уверенным в чём-то, если тебе даже не с чем сравнивать?
ctrl+LMB и есть вся киллер фича IDEA? (или чем ты там пользуешься...)
а VIM много чего умеет, только ты об этом не узнаешь и продолжишь слепо и упорото верить в своё мнение
и мышь он поддерживает, только это наиярчайший пример «ненужно»
и кстати видишь, ты даже не знал что в VIM всё можно делать и без мыши, а это базис между прочим
так почему ты споришь о вещах в которых вообще не разбираешься? тупой тролль?

хватает 4 гигов на маке
просто у всех программистов «веб разработка» сводится к

ой ну ты то тут илиткой не выступай, покажи свои проекты, чтоб все увидели твою «уникальность»

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

ой ну ты то тут илиткой не выступай, покажи свои проекты, чтоб все увидели твою «уникальность»

У него NDA, дядя, все дела. И вообще, какая тебе разница на неосиляторов? В интернете кто-то не прав? Они же от титьки никогда не отвалятся.

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

Хорошо. Он поддерживает мышь. Что ты можешь сделать мышью в нём? Скопипасть строку и вставить её? Это всё? В IDEA/Eclipse тоже можно делать всё без мышки, но зачем? Это (использование компа без мышки) не удобно и похоже на работу калеки. Если ты не пользуешься мышкой, зачем она тебе? Отключи её.

menangen ★★★★★
()
Ответ на: комментарий от q11q11

и мышь он поддерживает, только это наиярчайший пример «ненужно»

Это всё круто. Но если речь о веб, то тебе нужно переключаться на браузер и проверять результат. И если там не hello world, без мыши никак.

А вообще у тебя какие-то комплексы и ты полностью упорот. Наехал на парня с нифига. Комплекс илитки у тебя.

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

то тебе нужно переключаться на браузер и проверять результат

вот когда переключаюсь на браузер - тогда и берусь за мышь

Наехал на парня с нифига.

тред не читай, сразу отвечай

q11q11 ★★★★★
()
Ответ на: комментарий от menangen

Это (использование компа без мышки) не удобно и похоже на работу калеки.

в этом треде речь только о работе в VIM, если ты этого ещё не понял...
а, ну таки да, не понял, всё ещё кукарекаешь про IDEA/Eclipse

q11q11 ★★★★★
()

Спасибо за пост - интересно и полезно. Пару фишек попробую.
Вопрос: разобрался как нормально настроить vim для Clojure?

kovrik ★★★★★
()
Ответ на: комментарий от andreyu

Какая версия kbdd? Вроде в 0.7 есть регрессии, я пользуюсь 0.5.2.

у меня тоже 0.7, но --version показывает 0.6, короче, как видно, решение с xkb-switch чуток стабильнее, чем зависеть от старой, определенной версии kbdd

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

у меня тоже 0.7, но --version показывает 0.6,

У меня 0.5.2.

короче, как видно, решение с xkb-switch чуток стабильнее, чем зависеть от старой, определенной версии kbdd

За давностью лет не помню по какой причине я отказался от xkb. Но помню, что возвращаться на xkb желания у меня не было. Так что каждому свое. Опять же, зачем мне тягать плагин, если достаточно пары строк в конфиге?

andreyu ★★★★★
()
Ответ на: комментарий от menangen

Это (использование компа без мышки) не удобно и похоже на работу калеки.

На работу калики похожи те погроммисты, которые мышой программируют. Смотреть на таких смешно.

andreyu ★★★★★
()

Хмм. А чем консольный vim лучше gvim в таких юзкейсах? Заодно исключаются все грабли с копипастой, скоростью отрисовки etc.

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

Заодно исключаются все грабли с копипастой

Грабли с копипастой наоборот прибавятся. А вот шрифты красивше станут.

Siado ★★★★★
()
Ответ на: комментарий от x3al

А чем консольный vim лучше gvim в таких юзкейсах?

Наверное ничем, если не использовать интеграцию с tmux и интерпретаторами (например для тестов и вообще): vimux, tslime2, slimux.

VimCasts
() автор топика
Ответ на: комментарий от kovrik

как нормально настроить vim для Clojure?

пока нет, да и специально для кложуры осваиваю имакс, для общего образования, так сказать.

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

Эмм. tslime2 спокойно юзается с gvim, остальные не щупал. Окна же рулятся WM'ом.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.