h0rr0rr_drag0n 18.11.2010 12:38

VimShell в отдельном буфере vim'а

Лично мне, кажется весьма удобной возможность работать в консоли (например в том же bash'е) не отвлекаясь от любимого vim'а. Можно одновременно коммитить код или изменять структуру каталогов проекта или делать прочие подобные вещи не выходя из vim'а и не отвлекаясь на другие окна.
Раньше (пару лет назад), я искал плагин, который позволил бы открывать отдельный буфер с каким-нибудь shell'ом, но натыкался на предложения перекомпилировать vim, предварительно применив к его исходникам набор патчей. Естественно, меня не устраивало подобное положение вещей - мне хотелось простого плагина, а не плясок с бубном.
Оказывается, выход есть! Подобный плагин существует и называется Conque Shell.

Данный плагин позволяет открывать вертикальный или горизонтальный буфер или новую вкладку с практически любым командным интерпретатором. Также, можно открывать выбранный интерпретатор и в текущем буфере. Можно запускать почти все консольные программы - мне не удалось запустить лишь mc.
25d025a125d025bd25d025b.th.png
Как видно, цвета вполне хорошо отображаются даже в таком терминале...

Установка плагина проста и состоит из 4 шагов:
Нужно скачать последнюю версию conque.vba по сссылке вышеОткрыть скачанный файл в vim'еСказать в нормальном режиме :so %Выйти из vim'а
В зависимостях у плагина лишь сам Vim и Python.

Существует всего 4 основных команды для работы с плагином:
:ConqueTerm bash - открывает терминал с bash'ем в текущем буфере:ConqueTermSplit bash - открывает терминал с bash'ем в новом горизонтальном буфере:ConqueTermVSplit bash - то же самое, что и в предыдущем пункте, но буфер теперь вертикальный:ConqueTermTab bash - то же самое, но вместо нового буфера открывается новая вкладка

Команду создания нового горизонтального буфера с запущенным bash'ем я повесил у себя на отдельный хоткей. Вначале создается соответствующий буфер, затем в нем отключается, включенная мной ранее для всего Vim'а, подсветка пробелов и табуляций (чтобы не мешала), затем осуществляется переход в режим вставки для начала работы с запущенным интерпретатором.
1
2
3
4
5
"Открываем Bash в горизонтальном окне/буфере
"после отключаем подсветку пробелов и табуляций
"для открытого буфера
imap <C-c>b <Esc>:ConqueTermSplit bash<CR><Esc>:setlocal nolist<CR>a
nmap <C-c>b :ConqueTermSplit bash<CR><Esc>:setlocal nolist<CR>a



Настройки ConqueTerm просты и достаточно подробно описаны в :help ConqueTerm. Я опишу лишь те настройки, которые я был вынужден поменять для своего удобства.
1
2
3
4
5
6
7
8
"настройки для ConqueTerm
let g:ConqueTerm_InsertOnEnter = 0
let g:ConqueTerm_CWInsert = 1 " (парсер - лох!) по прежнему переходим между окнами по <C-w><whjkl>
let g:ConqueTerm_TERM = 'xterm'
let g:ConqueTerm_ReadUnfocused = 1
let g:ConqueTerm_CloseOnEnd = 1
let g:ConqueTerm_SendFunctionKeys = 1
</whjkl>


InsertOnEnter = 0 означает, что при переходе в буфер с открытым интерпретатором vim не будет самостоятельно переходить в режим вставки. Так как-то привычнее... CWInsert = 1 позволяет переходить между открытыми буферами по w и прочим подобным сочетаниям клавиш. Чтобы послать терминалу, надо просто нажать и отпустить эти клавиши и подождать.
ReadUnfocused = 1 указывает плагину на необходимость обновления содержимого терминального окна, даже если курсор находится в другом окне. Так можно получать, например, самые свежие показания от top'а. Автоскроллинг не поддерживается - автор пишет, что это связано с ограничениями вимовского скриптового языка.
SendFunctionKeys = 1 заставляет посылать функциональные клавиши F1-F12 напрямую терминалу, а не vim'у.
CloseOnEnd = 1 - буфер закрывается при завершении программы, запущенной в ней. В нашем случае этой программой является bash.

В случае, если терминал нещадно тормозит, имеет смысл отключить поддержку цвета:
1
let g:ConqueTerm_Color = 0 "disable colors


Конечно будет не так красиво и цветасто, как в обычном терминале, но работать будет довольно быстро.

Радует, что этот плагин поддерживает разнообразные извращения, например такие как это:
25d025a125d025bd25d025b.th.png
(uname -a, запущенный в сесси bash'а, которая запущена внутри консольного вима, который запущен в сесии bash'а, которая запущена внутри gvim'а)

В заключение, небольшой скринкаст, показывающий как все это работает "в движении":
Shell в отдельном буфере vim'а



По материалам блога Дракон-линуксоид


Тэги: shell vim
+ 12 -
Похожие Поделиться

saver 18.11.2010 13:25 #
Сенкс, надо
saver 18.11.2010 13:28 #
Ток он заглючил с мои навороченным промтом )) мелочи )
kovtunos 18.11.2010 14:06 #
Надо обязательно попробовать.
or10n 18.11.2010 14:38 #
а можно написать:
1):sh
2)сделать то что надо в терминале
3)написать exit в терминале и попасть обратно в вим
bosha 18.11.2010 14:42 #
http://welinux.ru/post/4561/#cmnt88104
h0rr0rr_drag0n 18.11.2010 15:56 #
1) Не получится одновременно видеть и текст и открытый шелл.
2) Не работает копирование/вставка/редактирование в шелле средствами вима (2yy, 3dw и т.п.)
3) В GVim'е :sh работает мягко говоря не очень...
bosha 18.11.2010 14:42 #
Имхо, быстрее открыть в буфере, и писать :bd и :bp. А если это на хоткеях (например как у меня), выходит итого быстрее.
dr_lo 18.11.2010 16:38 #
а в чем принципиальные преимущества метода по сравнению с GNU screen?
dr_lo 18.11.2010 16:38 #
дико извиняюсь. вопрос в пост, а не в каммент
bosha 18.11.2010 16:43 #
Ничего. У меня примерно такие же мысли, за исключение того, что предпочитаю tmux =)
dr_lo 18.11.2010 18:41 #
я не ошибусь, если предположу, что ты и со "скрином" знаком на уровне? не мог бы ты написать топик, типа "мое имхо. что лучше screen или tmux?"

bosha 18.11.2010 19:01 #
Отличий не так и много. Я давно писал про tmux, но там есть основные отличия и в комментариях с мухасом их тоже можно почерпнуть (отличия).

Пост именно об отличиях я вряд ли напишу, слишком занят :)
le087 18.11.2010 22:39 #
о_О... а я думал, что в Vim встроенный шел идет по умалчанию, как и в Emacs (M-x shell набираешь - и тебе достается странная, но вполне работоспособная консоль =)
h0rr0rr_drag0n 19.11.2010 00:28 #
Есть то что вылезает по команде :sh, но оно не слишком сильно встроенное - вим одновременно с таким шеллом уже не поиспользуешь...
zavx0z 26.09.2014 07:53 #
Доброе время суток. Я новичок в vim, но установить с помощью Bundle смог. Беда только, что хоткей добавил в .vimrc, а вот что за хотекей это, разобрать не могу. Подскажите чайнику.