Online video hd

Смотреть русское с разговорами видео

Официальный сайт rostobrnadzor 24/7/365

Смотреть видео бесплатно

h0rr0rr_drag0n 25.04.2009 17:06

VimСервер vim.

Cтатья предназначена для тех, кто редактирует много файлов в vim'e и желает, чтобы все файлы открывались в одной копии vim'a.



В редакторе вим есть режим "сервера" в котором он отсылает файлы, предназначенные для редактирования, т.н. вим-серверу, который их и открывает в своем окне для последующей правки. Таким образом в системе оказывается запущенной только одна копия vim'а - сервер.



Получить список vim-серверов уже запущенных в системе можно опцией --serverlist. Естественно сейчас она ничего вам покажет, потому что у вас не запущено ни одного vim-сервера.

Запустить сервер можно указав виму опцию --servername имя_сервера. Клиенты будут подключаться по имени сервера. Регистр символов в имени сервера роли не играет. Если вы попытаетесь запустить сервер с уже используемым именем, то вим добавит к имени нового сервера единичку и запустит его.

Отправить файл на сервер можно указав виму имя сервера опцией --servername (да она используется и для этого) и использовав одну из опций --remote* имя_файла.

Узнать подробнее об этих опциях можно в vim --help.



Для повышения удобства использования механизма "клиент-сервер" в виме я написал небольшой скрипт, который запускает сервер вима (если он еще не запущен) и отправляет файл на редактирование первому из серверов в списке vim --serverlist. Также скрипт использует механизм notify-osd - выводит красивый поп-ап при запуске вим-сервера.



Чтобы задействовать механизм notify-osd нужно установить пакет libnotify-bin. Хотя скрипт может прекрасно работать и без него.



  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/bash



############################################################################

############################################################################

##

## Скрипт для обеспечения редактирования всех открываемых при помощи vim

## файлов в одной копии vim'a/gvim'a.

##

## Автор: h0rr0rr_drag0n

##

############################################################################

############################################################################



#Путь к иконке vim'a

VIM_ICON=/usr/share/pixmaps/vim.svg

# Заголовок для всплывающей подсказки

NOTIFY_HEAD=Vim



# Проверим, установлен ли vim.

whereis -b vim | grep -q '/bin/vim'

if < "`echo $?`" != "0" >; then

echo "Vim not installed! Please install it."

exit 1

fi



# Проверим, установлен ли gvim.

whereis -b gvim | grep -q '/bin/gvim'

if < "`echo $?`" -ne "0" >; then

# gvim не установлен:

# используем по умолчанию vim

VIM=vim

else

# Установлен gvim -- используем его

VIM=gvim

fi



# Проверим, установлен ли notify-send

# Если нет -- не используем его

whereis -b notify-send | grep -q '/bin/notify-send'

if < "`echo $?`" -eq "0" >; then

USE_NOTIFY=yes

else

USE_NOTIFY=no

fi





# Получим список Vim серверов

VIM_SERVER=`vim --serverlist | head -n 1`



# Если ни один сервер не запущен -- запустим его.

if < ! -n "$VIM_SERVER" >; then

# Без иксов сообщения между клиентом и сервером не пересылаются.

# Проверим, запущены ли иксы.

if < -n "$DISPLAY" >; then

$VIM --servername vimserver1

if < "$USE_NOTIFY" == "yes" >; then

notify-send -u normal -t 5 -i $VIM_ICON "$NOTIFY_HEAD" "Vim server \&#34;vimserver1\" started."

fi

else

echo "No display: server start failed! File opened locally." >&2

vim $*

exit 0

fi

fi



# Перечитаем список серверов.

VIM_SERVER=`vim --serverlist | head -n 1`



# Сервер работает -- открываем в нем документ для редактирования.

$VIM --servername "$VIM_SERVER" --remote-tab-silent $* &&gt;/dev/null



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

anjolio 25.04.2009 18:50 #
+ 1 -
Вроде как нехорошо ставить оценку и не комментировать.
Вообщем, жирный "+" со всего размаху мышкой! Спасибо!
h0rr0rr_drag0n 25.04.2009 19:36 #
+ 1 -
Пожалуйста! =))
librarian 25.04.2009 20:10 #
+ 1 -
Как минимум любопытно, не знал от такой возможности vim
finger 25.04.2009 21:17 #
+ 0 -
дико извиняюсь за оффтоп, но чем вы погоду смотрите?
cyrus 25.04.2009 21:46 #
+ 0 -
Это gnome-applet если я не ошибаюсь
h0rr0rr_drag0n 25.04.2009 21:54 #
+ 0 -
Апплетом часов =))
cyrus 25.04.2009 21:34 #
+ 0 -
Что-то я не понял, что всё-таки значит этот сервер..
если надо редактировать несколько файлов я использую табы.. и вроде как один вим при этом открыт. И зачем тогда сервер этот нужен? поясните пожалуйста
finger 25.04.2009 21:36 #
+ 0 -
А если вы не в ГУЯх работаете?
cyrus 25.04.2009 21:51 #
+ 0 -
И причём тут ГУИ? О_о
cyrus 25.04.2009 22:27 #
+ 0 -
Кажется понял, что имелось в виду)
Я говорил про табы не терминала, а табы в самом виме. Они работают без всяких иксов
h0rr0rr_drag0n 25.04.2009 22:12 #
+ 0 -
Например, если вы будете открывать файл на редактирование, вызывая вим через командную строку, то будет использоваться новая копия вима, но никак не та, в которой у вас уже редактируются файлы. Сервер + мой скрипт позволяют обойти это ограничение - теперь после ввода vim filename файл откроется в новой вкладке уже работающей копии vim'a.
cyrus 25.04.2009 22:26 #
+ 0 -
Если в виме написать
:tabe или :new tab
А потом :read filename
то вроде бы один и тот же вим работает...по крайней мере топ так говорит) Но всё равно надо будет попробовать этот скрипт и сервер)
h0rr0rr_drag0n 25.04.2009 22:28 #
+ 1 -
Можно просто :tabnew filename =)
cyrus 25.04.2009 22:35 #
+ 0 -
ага :)
yuretsz 27.04.2009 15:59 #
+ 1 -
Ну с этим скриптом кажется, что так гораздо удобнее
softzilla 29.04.2009 11:05 #
+ 1 -
Спасибо!

Мне показалось, правильным было бы заврапить стандартный вызов редактора этой функцией. Для этого надо положить скрипт в свой локальный bin, и внести несколько изменений:

#!/bin/bash

############################################################################
############################################################################
##
## Скрипт для обеспечения редактирования всех открываемых при помощи vim
## файлов в одной копии vim'a/gvim'a.
##
## Автор: h0rr0rr_drag0n
##
############################################################################
############################################################################

#Путь к иконке vim'a
VIM_ICON=/usr/share/pixmaps/gvim.png
# Заголовок для всплывающей подсказки
NOTIFY_HEAD=Vim

# Проверим, установлен ли vim.
whereis -b vim | grep -q '/bin/vim'
if < "`echo $?`" != "0" >; then
echo "Vim not installed! Please install it."
exit 1
fi

# Проверим, установлен ли gvim.
whereis -b gvim | grep -q '/bin/gvim'
if < "`echo $?`" -ne "0" >; then
# gvim не установлен:
# используем по умолчанию vim
VIM=/usr/bin/vim
else
# Установлен gvim -- используем его
VIM=/usr/bin/gvim
fi

# Проверим, установлен ли notify-send
# Если нет -- не используем его
whereis -b notify-send | grep -q '/bin/notify-send'
if < "`echo $?`" -eq "0" >; then
USE_NOTIFY=yes
else
USE_NOTIFY=no
fi


# Получим список Vim серверов
VIM_SERVER=`$VIM --serverlist | head -n 1`

# Если ни один сервер не запущен -- запустим его.
if < ! -n "$VIM_SERVER" >; then
# Без иксов сообщения между клиентом и сервером не пересылаются.
# Проверим, запущены ли иксы.
if < -n "$DISPLAY" >; then
$VIM --servername vimserver1
if < "$USE_NOTIFY" == "yes" >; then
notify-send -u normal -t 20 -i $VIM_ICON "$NOTIFY_HEAD" "Vim server \"vimserver1\" started."
fi
else
echo "No display: server start failed! File opened locally." >&2
vim $*
exit 0
fi
fi

# Перечитаем список серверов.
VIM_SERVER=`$VIM --serverlist | head -n 1`

# Сервер работает -- открываем в нем документ для редактирования.
$VIM --servername "$VIM_SERVER" --remote-tab-silent ${*%%-f} &>/dev/null
VIM_WINDOW=`xwininfo -root -tree|grep $VIM_SERVER|awk -F" " '{print $1;}'`
wmctrl -i -a $VIM_WINDOW


1. Заменен вызов вима с полным путем, что бы скрипт не вызывал сам себя
2. Поиск сервера через "правильный" вим, а то у меня "vim --serverlist" говорит что такого параметра нет.
3. Обкусывание параметра "-f" который передается из GUI c именем файла и не нужен в случае сервера.
4. Добавлено поднятие окна вим-сервера поверх всех окон. xwininfo - слегка притормаживает при переборе всех окон, может быть кто знает как получить ид-окна быстрее?

Кстати у notify-send парамтр времени задается в миллисекундах... потом за 5 мс... ничего не увидеть.
lemming 05.05.2009 00:19 #
+ 2 -
$VIM --servername "$VIM_SERVER" --remote-tab-silent ${*%%-f} &>/dev/null

Если имя файла содержит пробелы, то вместо него будут открыты несколько файлов. Это можно избежать, заменив ${*%%-f} на "${@%%-f}"
dzheika 23.04.2011 16:04 #
+ 1 -
Все очень здорово, я постоянно редактирую в vim'е множество файлов, скриптов со множеством вкладок и некоторыми настройками, выставленными "на лету" (разбиение отдельных вкладок на окна, выставление этим окнам соответствующих пропорций в зависимости от данных, возможно кодировка, foldmethod, сами fold'ы и т.д.) и в последнее время все больше становится востребованным применение сервера, т.к. все эти настройки не хотелось бы терять. Собственно, чтобы не тратить время на чтение документации, гугление и т.п. решил сразу зайти сюда и быстренько ознакомиться (просто помню, что тут была такая статья, некогда на нее натыкался). И правда, статья весьма компактная и доходчивая... только мне немноженько поломал мозг скрипт))) зачем такие извращения?

whereis -b notify-send | grep -q '/bin/notify-send'
if < "`echo $?`" -eq "0" >; then
USE_NOTIFY=yes
else
USE_NOTIFY=no
fi

вот конкретно if < "`echo $?`" -eq "0" >; then ... fi ломает мозг))
проще: if < "$?" -eq "0" >; then ... fi
еще проще: if ((! $?)); then ... fi
еще еще проще: if $COMMAND; then ... fi
совсем лучше:
NOTIFY_SEND_EXEC="/bin/notify-send"
if < -x "$NOTIFY_SEND_EXEC" >; then
USE_NOTIFY=yes
else
USE_NOTIFY=no
fi
# или лучше не запоминать yes/no, а в конкретном месте проверять на test -x и если есть (существует такой exec-file), то вызывать
h0rr0rr_drag0n 23.04.2011 16:56 #
+ 0 -
Все просто - скрипт писался давно и мой тогдашний скилл скриптописания на баше был невысок))
kstep 23.04.2011 16:18 #
+ 0 -
Вообще я не понимаю зачем такие извращения, ведь gvim --remote-tab-silent сделает абсолютно то же самое: передаст файл серверу, если он запущен, либо запустит новый вим с этим файлом. Единственное достоинство этого скрипта в том, что он красивое уведомление показывает, в остальном не вижу большого смысла.
h0rr0rr_drag0n 23.04.2011 17:00 #
+ 0 -
я написал небольшой скрипт, который запускает сервер вима (если он еще не запущен)


Вкратце говоря, если сервер внезапно оказался не запущен, то этот скрипт сначала запустит его, а лишь потом передаст ему файл на редактирование.
Уже не помню, но подозреваю, что если просто открывать файл через --remote-tab-silent при не запущенном сервере, то нас ожидает ругань на отсутствие этого самого сервера и все(.
kstep 23.04.2011 19:01 #
+ 1 -
Неправда ваша.

vim --help

--remote <файлы> По возможности редактировать <файлы> на сервере Vim
--remote-silent <файлы> То же, но без жалоб на отсутствие сервера
--remote-wait <файлы> То же, что и --remote, но с ожиданием завершения
--remote-wait-silent <файлы> То же, но без жалоб на отсутствие сервера
--remote-tab<-wait><-silent> <files> As --remote but use tab page per file


Сам пробовал, при первом выполнении gvim --remote-tab-silent молча запускает новый вим, при последующих быстро передаёт файлы существующему. Единственный момент, когда он ругается — отсутствие иксов, тогда он скажет, что не может открыть дисплей, но всё равно запустится в консоли.
dzheika 23.04.2011 16:45 #
+ 2 -
Вот говно... vim-server немного не то, что я ожидал)) в конечном итоге придется все равно прибегнуть к screen/dtach, осталось только придумать механизм... например, при запуске vim'а проверять рабочий каталог на предмет файла .vim-server (ибо, как правило, группу файлов на одном вим-сервере чаще всего можно связать по рабочему каталогу <�например, по каталогу проекта, над которым работаешь, а сами файлы, разумеется, лежат где угодно, но большинство из них именно в дочерних каталогах от рабочего>). Осталось только решить, использовать ~/bin/vim заглушку или реализовать через vim-скрипт (~/.vimrc или ~/.vim/)...
screen-сессию обозвать vim-server-$name, vim-server-сиссию $name, сами редактируемые файлы, при наличии уже поднятого vim-сервера, отправлять на него и открывать уже поднятную screen-сессию (можно и с -x), в противном случае — все поднять (vim-server в screen'е) и работать в свое удовольствие :-). В конечном итоге все сведется к: $ cd ~/projects/current-project-dir && echo "my-project-name" > .vim-server && vim # в последующие разы просто $ vim, вся магия в .vim-server
Что ж, идей много...
kstep 23.04.2011 19:04 #
+ 0 -
vim --servername VIM --remote-tab-silent.
Читайте уже справку, всё прекрасно работает без костылей.
dzheika 23.04.2011 19:14 #
+ 0 -
))) ты просто не уловил идею и проблему, вставшую передо мной. дело в том, что, во-первых, такая команда отправляет файл на сервер, при этом сама ничего не дает (возвращает консоль непосредственно), во-вторых, всегда должен быть открыт vim-server, т.е. он не может висеть как демон... а проблема как раз в этом и заключается, что я могу случайно или по необходимости грохнуть иксовую консоль, в которой висит vim-server, ну и в-третьих, тебе не кажется, что каждый раз писать такую команду несколько накладно?

что я хочу:
1. чтобы vim-server висел демоном (вне зависимости от той консоли, где его запустили)
2. чтобы к нему всегда можно было приконнектиться простой командой (например, vim)

есть идеи, кроме как использования screen/dtach и исключая ручного патчинга сорцов vim'a?
philosoft 23.04.2011 20:05 #
+ 1 -
Элементарно. nohup + алиас на vim.
dzheika 24.04.2011 18:15 #
+ 2 -
о_О и как ты себе это представляешь? дай готовый, а главное рабочий пример))
philosoft 24.04.2011 18:36 #
+ 1 -
С алиасом я немного погорячился, не подумав. Правильнее будет использовать шел-функцию. Вот рабочий пример. За нюансами в соответствующие маны, гугл и мозги.
1
2
3
4
5
function vim()
{
  VIM_EXEC="$(command -v gvim)";
  eval "nohup $VIM_EXEC --remote-silent $1 &>/dev/null &";
}
dzheika 25.04.2011 20:35 #
+ 0 -
как я понимаю (читай вижу), это поднимает gvim? а если грохнуть иксы? :-), а если так же успешно "случайно" (или по необходимости) закрыть окно? я хочу, чтобы вим работал в режиме демона — т.е. висел вне зависимости от иксов. Например, как mpd. Вот было бы здорово, если бы он именно так и работал в режиме демона... поднимался бы себе в фоне, а уже vim-клиенты бы к нему подключались и отвечали за работу с tty (читай вывод на экран), сама же работа с файлами производилась бы именно на сервере.
dzheika 25.04.2011 20:56 #
+ 2 -
Вопрос имеет более, так сказать, "правильное" решение (не без помощи philosoft, за что ему спасибо): http://ajayfromiiit.wordpress.com/2009/10/15/vim-sessions/
philosoft 25.04.2011 21:06 #
+ 2 -
После переписки сошлись на сессиях.

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн