четверг, 24 декабря 2015 г.

Нюансы разработки из консоли

Я уже давно отказался от работы в Netbeans, более того, от работы в GUI. Эта IDE достала меня своими тормозами, дождаться открытия diff'а перед коммитом почти нереально. А без просмотра диффа коммитить нехорошо. Бесконечное "фоновое сканирование проекта", откуда-то взявшаяся гора дубликатов файлов во все-таки открывшемся через 10 минут предпросмотре коммита, видимо из-за использования символьных ссылок. Тормоза UI, стоит только нажать Ctrl. И это на моем 4-ядерном  проце, 8Гб RAM и недешевом SSD диске Intel.
Тогда я и решил уйти в подполье. Сейчас работаю исключительно через putty, используя screen, vim, grep и консольный svn. Собственно сама работа ведется на сервере.

Поскольку сервер у меня работает 24х7 и доступен из инета - такой подход открыл массу удобств.
screen позволяет оставить работу в любой момент и в любом состоянии, закрыть putty, а затем вернуться и продолжить с того же места. Причем необязательно с того же компа. Хоть из интернет-кафе. Суть в том, что теперь не нужен специально подготовленный к разработке комп со всем установленным софтом. Только putty. И удобство работы зависит теперь не от мощности компа, а от размера его экрана. В принципе я и с нетбука однажды работал.
svn+vim вполне сносно позволяет смотреть diff и править прямо при просмотре. Это последнее, ради чего я иногда все же запускал Netbeans. Все-таки визуальный дифф - это очень удобно.
vim позволяет использовать гору плагинов, впрочем, я не увлекаюсь, дабы не получить тормозов. Удобная фишка - табы при редактировании файлов. Это, кстати, встроенная возможность vim'а, чтобы открыть несколько файлов таким образом, нужно использовать ключ -p
vim -p file1 file2
На фото - дифф одного из файлов моего проекта AcePHProxy, табы vim (вверху), группировка screen (внизу).


Настроить vim на всеми любимый "переход к определению функции" тоже можно, однако я работаю с одним и тем же проектом уже давно и сам знаю куда идти, тем более, что код там организован аккуратно. По сравнению с Netbeans я уж точно ничего не потерял, там пока дождешься этого перехода, уже можно давно файл найти и открыть самостоятельно.
Может я однажды попробую силы в написании плагинов для vim, тогда и организую.

Но linux не был бы linux'ом, если бы не требовалось доставать из ящика напильник..
Далее о том, как я настраивал svn diff через vim с редактированием прямо при просмотре, а также 256-цветный режим терминала и устранял сопутствующие глюки.

Конфиги и нюансы

~/.screenrc (неокончательный)

shell -$SHELL
defscrollback 2048
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
termcapinfo xterm ti@:te@
defscrollback позволяет скроллить Shift+PgUp'ом содержимое в screen-сессии.
hardstatus string организует внизу удобную статусную строку, без которой практически нереально ориентироваться, находишься ли ты в screen-сессии или вне ее, и если да, то в каком номере окна.
Далее я начал настраивать 256-цветный режим терминала (для vimdiff), потому как в обычном режиме цвета уж больно вырвиглазные, их всего 8.
Потребовалось добавить следующую строку в ~/.bashrc
export TERM=xterm-256color
Проверить цветность терминала можно командой "tput colors"
Затем немного настроек для цветовой схемы vim (использую desert). Я скопировал файл /usr/share/vim/vim74/colors/desert.vim в ~/.vim/colors/desert.vim и внес правки для ключей Diff*
hi DiffAdd    cterm=bold ctermfg=16 ctermbg=29 gui=none guifg=bg guibg=Red
hi DiffDelete cterm=bold ctermfg=16 ctermbg=16 gui=none guifg=bg guibg=Red
hi DiffChange cterm=bold ctermfg=16 ctermbg=248 gui=none guifg=bg guibg=Red
hi DiffText   cterm=bold ctermfg=16 ctermbg=29 gui=none guifg=bg guibg=Red
Цвета (здесь это 16, 29, 248) можно подобрать тут http://martin-thoma.com/colors-in-vim/
Например, чтобы использовать серый (x251_Grey78) для цвета фона пишем ctermbg=251.
В ~/.vimrc соответственно 
colorscheme desert
С первого раза не помогло. Цвета в vimdiff в screen остались прежние. К тому же обнаружились проблемы с прокруткой, она перестала работать. Вместо содержимого screen-сессии по PgUp я видел содержимое родительской консоли, основной ssh-сессии.
Дело оказалось в termcapinfo. Ранее строка была такой
termcapinfo xterm ti@:te@
и она не срабатывала для xterm-256color, заменил xterm на xterm*, помогло.

Потом обнаружился еще косяк: терминал putty стал скукоживаться при переходе к сессии screen, т.е. делаешь "screen -rd" и putty сама изменяет размер, становится меньше по ширине.
Если в .bashrc вместо export TERM=xterm-256color поставить export TERM=xterm, тогда не скукоживается. Роем инет.. находим багрепорт
https://bugs.launchpad.net/ubuntu/+source/screen/+bug/1309897
и магическую последовательность для .screenrc
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
но тогда, $%&@*, возвращается проблема со скроллом!!1
Посмотрев примеры различных termcapinfo (что это вообще такое хз) в инете, понял, что значения параметра вроде бы двоеточием разделяются, если их несколько. 
попробовал записать так
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l:ti@:te@'
получилось!
Уже потом оказалось, что все намного проще, когда я наткнулся на страницу с цветами vim, увидел там строку
You might need to set t_Co=256
Попробовал добавить "set t_Co=256" в .vimrc и получил то, что было нужно - 256-цветный режим vim.

Отмечу, что содержимое скроллбуфера доступно до детача screen-сессии, после аттача ее обратно Shift+PgUp уже не позволяет смотреть буфер окна, но есть еще способ - режим копирования буфера. Активируется последовательным нажатием Ctrl+A, затем Esc, и позволяет посмотреть буфер кнопкой PgUp или стрелками. Выход из режима - Esc.

ИТОГО

.screenrc
shell -$SHELL
defscrollback 2048
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
# https://bugs.launchpad.net/ubuntu/+source/screen/+bug/1309897
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l:ti@:te@'
.bashrc, хз куда запихать правильнее
export TERM=xterm-256color
Чтобы svn diff выполнялся через vimdiff, пропишем скрипт-обработчик этой команды
.subversion/config
diff-cmd = /home/<username>/.subversion/vimdiff_wrap
Сам скрипт
.subversion/vimdiff_wrap
#!/bin/bash
# Configure your favorite diff program here.
DIFF="/usr/bin/vimdiff"
# надо выдернуть имя реального файла из строки с (working copy) для передачи в качестве 2 параметра
# однако это только для диффа с working copy, если дифф читается из истории для заданных ревизий.
# то брать надо аргумент 7 без обработки и добавить -R (readonly) к параметрам vim
# xargs will do the trimming for you. It's one command/program, no parameters, returns the trimmed string, easy as that!
FPATH=$7
if [[ $5 == *"working copy"* ]] ; then
    FPATH=`echo "${5}" | sed -e 's/(working copy)//g' | xargs`
fi;
# редактирование временного файла, создаваемого svn при диффе, не обновляет файл в рабочей копии
# так что придется передавать путь к реальному файлу, хотя и чую, что я колхозник и говнокодер
# Subversion provides the paths we need as the sixth and seventh
# parameters.
LEFT=${6}
RIGHT=$FPATH
# Call the diff command (change the following line to make sense for
# your merge program).
$DIFF $LEFT $RIGHT
~/.vimrc
colorscheme desert
set encoding=utf8      " set charset translation encoding
set termencoding=utf-8     " set terminal encoding
set fileencodings=utf8,cp1251  " set save encoding
set tabstop=4 "4 space tab
set shiftwidth=4 "The amount to block indent when using < and >
set smarttab "Uses shiftwidth instead of tabstop at start of lines
set noexpandtab "Replaces a <TAB> with spaces--more portable, [no] - inverted logic
set softtabstop=4 "Causes backspace to delete 4 spaces = converted <TAB>
set showtabline=2
filetype indent on
filetype plugin on
set nu "line numbers on (set nonu)
set mouse=a " включить режим с мышью
syntax on "подсветка синтаксиса
"folding settings
set foldmethod=indent  "fold based on indent
"set foldmethod=syntax  "с php не сработало что-то
set foldnestmax=2      "deepest fold is 10 levels
"set nofoldenable      "dont fold by default
set foldlevel=1            "this is just what i use
тут основной конфиг .vim, почти голый. настройка vim как IDE это тема для целой статьи, скорее даже для цикла статей. Впрочем, их уже много написано в инете


2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Нормальный ход =)) Жаль с .NET так просто не съедешь в консоль =((

    ОтветитьУдалить