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

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

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

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

25.04.09 17:06 h0rr0rr_drag0n

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
140
141
142
143


#!/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 \"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 $* &>/dev/null

 


Теги:

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

Мне показалось, правильным было бы заврапить стандартный вызов редактора этой функцией. Для этого надо положить скрипт в свой локальный 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
140
141
142
143
144
145
146
147


#!/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.09 00:19 # +2
$VIM --servername "$VIM_SERVER" --remote-tab-silent ${*%%-f} &>/dev/null

Если имя файла содержит пробелы, то вместо него будут открыты несколько файлов. Это можно избежать, заменив ${*%%-f} на "${@%%-f}"

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 140)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 2760 из 212 городов)
            Топ пользователей Топ блогов
            welinux.ru

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

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


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

            Online video HD

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

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

            Full HD video online

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

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

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