Видео ролики бесплатно онлайн

Смотреть узбекский видео

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

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

21.07.10 17:59 alff31

Emacsvimperator для emacs пользователей

Для браузера firefox есть замечательный плагин под названием vimperator. Если коротко, то он скрывает меню, адресную строку, и панель закладок и превращает красивый браузер во что-то страшное и ужасное, добавляя снизу черную информационную полоску и командную строчку. После этого приходиться две недели учиться пользоваться браузером, управляя им исключительно клавиатурными сочетаниями. После этого наступает дзен и ты не понимаешь, зачем вообще были нужны все эти кнопочки и меню наверху. Поклонники vimа радуются жизни и прекрасно живут с данным дополнением. Я же лично сам vim недолюбливаю, так как режимы для меня это то, с чем я так и не смог ужиться, набираешь текст, а редактор превращает набор слов с дикое сочетание действий, которое долго приходится отменять, нажимая u. Впрочем пост не о том.

Я, как пользователь Emacs, встретив этот плагин, искал альтернативу, что-то вроде emacserator. :) Однако вменяемой альтернативы так и не нашёл, так и пользовался vimperator-ом.

И вот на днях наткнулся на конфиг файл Adrian C. (anrxc), который адаптировал vimperator для emacs пользователей.

Навигация по странице


C-n - листать вниз(Next)
C-p - листать вверх(Previous)

C-v - прокрутить вниз
M-v - прокрутить наверх

M-> - в конец страницы
M-< - в начало страницы

F - вперед.(Forward)
B, Backspace - назад.(Back)

C-a - стролить до упора влево
C-e - скролить до упора справо

M-Down - показать адресную строку
M-UP - скрыть адресную строку
C-l - фокус на адресную сроку

j - открыть ссылку в текущей вкладке
J - открыть ссылку в новой вкладке

C-x C-f - открыть локалный файл

C-g - отмена
C-x C-c -выход

Вкладки


C-f - следующая вкладка(Forward)
C-b - предыдущая вкладка(Back)

C-x b - выбрать вкладку из списка
C-x C-b - список всех вкладок

C-x t - открыть адрес в новой вкладке.
C-x l - открыть адрес в текущей вкладке.

C-x k - закрыть текущую вкладку(буфер)
C-_ - отменить закрытую вкладку

C-y - открыть новую вкладку с адресом из буфера обмена

Поиск и копирование


C-s - поиск вперед
C-r - поиск назад

М-w - копировать текущий url в буфер обмена
C-w - копировать выделенный текст в буфер обмена

C-x C-v - редактировать адрес текущей страницы

Работа с текстом


C-i - в поле ввода открывает текст для редактирования в emacs.(для этого он должен быть запущен и сделать M-x server-start или в .emacs добавить
1
2
(server-start)
(add-hook 'after-init-hook 'server-start)

C-c i - фокус на последнее использовавшееся полее ввода.

Разное


C-d - временно отключить перехват следующего нажатия(что-бы браузер их не порехватывал горячие клавиши)
C-z - оключить перехват нажатий(до нажатия esc)

C-c g - исходный код страницы
C-h i - справка по vimperator-у

C-c C-u - на главную сайта.
C-c h - открыть домашнюю страничку.

C-c f - открыть домашнюю директорию.
C-c u - директоря уровнем выше.

C-c p - показать картинку в новом окне
C-c m - открыть контекстное меню ссылки
C-c a - добавить закладку

C-x C-f - открыть локалный файл

C-c t - получить tinyurl текущей странички.

Конфиги


Файл .vimperator
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
" {{{ anrxc's vimperator configuration with Emacs bindings
"
" Bindings
"   * http://sysphere.org/~anrxc/j/articles/vimperator/index.html

" Todo
"  * C-n and C-p in "INSERT (menu)" mode
"    * http://code.google.com/p/vimperator-labs/issues/detail?id=36

" License
"  * http://creativecommons.org/publicdomain/zero/1.0
" }}}


" {{{ Options
"
" User styles as colorschemes in Vimperator 2
colorscheme zenburn

" Window title
set titlestring=Firefox

" No toolbar and scrollbars by default
set go-=brT

" Editor, C-i invokes it in text fields
set editor=emacsclient

" Command line and search patterns history
set history=10000

" Show pattern matches as you type
set incsearch

" Hilight previous search pattern matches
set hlsearch

" Override ignorecase if pattern has uppercase chars
set smartcase

" Show the tab bar only if more then one tab is open
set showtabline=0

" Focus content after a page has loaded
set focuscontent

" Show destination links in 1=status line, 2=command line
set showstatuslinks=2

" Show completions and use AwesomeBar (+search plugins)
set complete=sl
set wildoptions=auto

" Ex commands output in a new tab by default (prefs, addons...)
set newtab=all

" Internal default search engine is ignored, plugins are used
set ds=yubnub
" }}}


" {{{ Key bindings
"     - Emacs GTK key-theme and FF already provide bindings for input fields
"
" M-x enters command mode
noremap <A-x> :

" Emacs navigation in command line and insert mode
cmap <C-n> <Tab>
cmap <C-p> <S-Tab>
cmap <C-f> <Right>
cmap <C-b> <Left>
cmap <C-j> <CR>
noremap <C-j> <CR>
inoremap <C-j> <CR>
inoremap <C-n> <Down>
inoremap <C-p> <Up>
inoremap <C-f> <Right>
inoremap <C-b> <Left>

" Use C-f and C-b for tab browsing
noremap <C-f> <C-n>
noremap <C-b> <C-p>

" Use C-a and C-e to jump to first/last tab
"noremap <C-a> g0
"noremap <C-e> g$
"
" Or use them to go to the absolute left/right of the document
noremap <C-a> 0
noremap <C-e> $

" Use C-p and C-n for up/down
noremap <C-p> 2k
noremap <C-n> 2j

" Use C-v and M-v for jump scrolling
noremap <C-v> <C-d>
noremap <A-v> <C-u>

" Goto the top of the document with M-<
noremap <A-<> gg

" Goto the end of the document with M->
noremap <A->> G

" Use C-s and C-r for searching (n/N for next/prev as in less)
noremap <C-s> /
noremap <C-r> ?

" Copy the current URL to the clipboard with M-w
noremap <A-w> y
"
" Copy selected text to the clipboard with C-w
noremap <C-w> Y

" Paste the current clipboard selection to a new buffer with C-y
noremap <C-y> P

" Use current URL as a start for a new location with C-x C-v
noremap <C-x><C-v> O

" C-g as cancel (C-q is stop)
cmap <C-g> <Esc>
imap <C-g> <Esc>
noremap <C-g> <Esc>

" Avoid Find dialog when canceling a started command, C-x C-g
noremap <C-x><C-g> <Esc>
"
" Avoid quit on C-q, and it's more suitable for Stop here
noremap <C-q> :stop<CR>

" Kill the buffer with C-x k
noremap <C-x>k d

" Undo close tab with C-_ (also with C-Shift-t, as C-t is new tab)
noremap <C-_> u

" Exit and save the session with C-x C-c
noremap <C-x><C-c> ZZ

" Buffer lists with C-x b and C-x C-b
noremap <C-x>b b
noremap <C-x><C-b> B

" Open a link in a new tab with C-x t
" Open a link in the current tab with C-x l
noremap <C-x>t :t<SPACE>
noremap <C-x>l :o<SPACE>

" Open hints in new tab by default (switch roles of f and F)
"noremap f F
"noremap F f

" Switch hints to letter "j", for right hand usage
noremap j f
noremap J F
"
" Extended hint mode with M-j
"  ; - focus link, a - save, y - copy link, O - :open query, T - for :tabopen ...
noremap <A-j> ;

" We can now also use F for Shift+b/f as back/forward
noremap F L
noremap B H

" Back with Backspace as well
map <BS> H

" Use C-h i to start help
noremap <C-h>i :help<CR>

" Record a key sequence into a macro with C-x (
noremap <C-x>( q

" Play a macro with C-x e
noremap <C-x>e @

" Set a mark at the cursor with C-x r m
noremap <C-x>rm m

" Jump to the mark in the current buffer with C-x r b
noremap <C-x>rb '

" C-v was pass-next, remap to bind with default keys
noremap <C-d> <C-v>
"
" C-x C-f starts the "Open File" dialog (C-x C-s is Save)
map <C-x><C-f> <C-d><C-o>


" {{{ Personal key bindings
"
" M-Up/Dn toggles the toolbar and scrollbars
map <A-Down> :set go+=brT<CR>
map <A-Up> :set go-=brT<CR>

" Sidebar selection with s, close with S
map s :sidebar<SPACE>
map S :sbclose<CR>

" Dialog selection with d
map d :dialog<SPACE>

" Focus the address bar with C-l
map <C-l> <C-d><C-l>

" Focus last used input field with C-c i
map <C-c>i gi

" Add a bookmark with C-c a (dialog)
map <C-c>a <C-d><C-d>

" Bookmarks search, and search by tag
map <C-c>q :bmarks<SPACE>
map <C-c>w :bmarks -tags=

" View source with C-c g, and
map <C-c>g gf
" ... in an editor with C-c e
map <C-c>e gF

" Open picture location with C-c p
map <C-c>p ;i

" Open context menu with C-c m
map <C-c>m ;c

" Open home directory with C-c f
map <C-c>f ~

" Go to home page with C-c h
map <C-c>h gh

" Go to parent directory with C-c u
map <C-c>u gu

" Go to the root of the website with C-c C-u
map <C-c><C-u> gU

" Restart with C-c C-r
map <C-c><C-r> :restart<CR>

" Tab moving helpers
map <A-m> :tabmove<SPACE>
map <A-Left> :tabmove! -1<CR>
map <A-Right> :tabmove! +1<CR>
" }}}


" {{{ Plugin bindings
"
" Buftabs
map <C-c>b :set invbuftabs<CR>

" Noscript
map <C-c>s :noscript toggletemp<CR>
map <C-c>S :noscript popup<CR>

" TinyURL
map <C-c>t :exe ":tinyurl "+getBrowser().contentWindow.location.href<CR>
" }}}
" }}}


" {{{ Javascript functions
"
" Show the Feed and Bookmark buttons on the statusbar
javascript <<EOF
(function(){
    var statusPanel = document.createElement("statusbarpanel");
    statusPanel.setAttribute("id", "buttons-panel-clone");
    statusPanel.appendChild(document.getElementById("feed-button"));
    statusPanel.appendChild(document.getElementById("star-button"));
    statusPanel.firstChild.setAttribute("style", "padding: 0; max-height: 16px;");
    document.getElementById("status-bar")
            .insertBefore(statusPanel, document.getElementById("security-button"));
})();
EOF
" }}}


echo "[vimperator initialized]"
 


Файл .vimperator/plugin/buftabs.js

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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240

// PLUGIN_INFO {{{
let PLUGIN_INFO =
<VimperatorPlugin>
  <name>Buftabs</name>
  <description>Add buffer tabs to the statusline to save space.</description>
  <version>1.1</version>
  <author mail="[email protected]" homepage="http://tuple-typed.org/">Lucas de Vries (GGLucas)</author>
  <license>WTFPL version 2 (http://sam.zoy.org/wtfpl/)</license>
  <minVersion>2.2</minVersion>
  <maxVersion>2.2</maxVersion>
  <detail><![CDATA[

  == Usage ==
  When the script is loaded it hijacks the statusline to display a list of tabs,
  you can use the "buftabs" option to toggle it on or off.

  == Styling ==
  Use the BufTab and BufTabSelected highlight groups to style the buftabs.
  Make sure you've called the "loadplugins" command before using the highlight
  groups in your vimperatorrc.

  == Length ==
  You can set the max length of a title before it is cut off with the
  buftabs_maxlength option. It is set to 25 by default.

  ]]></detail>
</VimperatorPlugin>;
// }}}

buftabs = {
    // Update the tabs
    updateUrl: function (url)
    {
        // Get buftabbar
        var btabs = document.getElementById("liberator-statusline-buftabs");
        var urlWidget = document.getElementById("liberator-statusline-field-url");
        var browsers = window.getBrowser().browsers;
        var position=0, selpos;

        // Make sure we have an appropriate amount of labels
        while (btabs.childNodes.length > browsers.length)
        {
            btabs.removeChild(btabs.lastChild);
        }

        while (btabs.childNodes.length < browsers.length)
        {
            var label = document.createElement("label");
            btabs.appendChild(label);

            label.onclick = function (ev)
            {
                if (ev.button == 0)
                    tabs.select(this.tabpos);
                else if (ev.button == 1)
                    tabs.remove(tabs.getTab(this.tabpos), 1, false, 0);
            }
        }

        // Create the new tabs
        for (let i=0; i < browsers.length; i++)
        {
            // Create label
            var browser = browsers[i];
            var label = btabs.childNodes[i];

            // Hook on load
            if (browser.webProgress.isLoadingDocument)
            {
                browser._buftabs_label = label;
                browser.contentDocument.addEventListener("load", function ()
                {
                    buftabs.fillLabel(this._buftabs_label, this);
                }, false);
            }

            // Fill label
            label.tabpos = i;
            buftabs.fillLabel(label, browser);

            if (tabs.index() == label.tabpos)
            {
                selpos = [position, label.clientWidth+position];
            }

            position += label.clientWidth;
        }

        // Scroll
        if (selpos[0] < btabs.scrollLeft || selpos[1] > btabs.scrollLeft+btabs.clientWidth)
            btabs.scrollLeft = selpos[0];

        // Show the entire line if possible
        if (btabs.scrollWidth == btabs.clientWidth)
            btabs.scrollLeft = 0;

        // Empty url label
        urlWidget.value = "";
    },

    // Fill a label with browser content
    fillLabel: function(label, browser)
    {
        var maxlength = options.get("buftabs_maxlength").get();
        var tabvalue;

        // Get title
        if (browser.webProgress.isLoadingDocument)
        {
            tabvalue = "Loading...";
        } else {
            tabvalue = browser.contentTitle || "Untitled";
        }

        // Check length
        if (tabvalue.length > maxlength)
            tabvalue = tabvalue.substr(0, maxlength-3)+"...";

        // Bookmark icon
        if (bookmarks.isBookmarked(browser.contentDocument.location.href))
            tabvalue += "\u2764";

        // Brackets and index
        tabvalue = "["+(label.tabpos+1)+"-"+tabvalue+"]";

        label.setAttribute("value", tabvalue);

        // Set the correct highlight group
        if (tabs.index() == label.tabpos)
            label.setAttributeNS(NS.uri, "highlight", "BufTabSelected");
        else
            label.setAttributeNS(NS.uri, "highlight", "BufTab");


    },

    // Create the horizontal box for adding the tabs to
    createBar: function()
    {
        var statusline = document.getElementById("liberator-statusline");
        var buftabs = document.getElementById("liberator-statusline-buftabs");
        var urlWidget = document.getElementById("liberator-statusline-field-url");

        // Only create if it doesn'
t exist yet
        if (!buftabs)
        {
            buftabs = document.createElement("hbox");
            buftabs.setAttribute("id", "liberator-statusline-buftabs");
            buftabs.setAttribute("flex", "1");
            buftabs.style.overflow = "hidden"

            statusline.insertBefore(buftabs, urlWidget);
        }
    },

    destroyBar: function()
    {
        var statusline = document.getElementById("liberator-statusline");
        var buftabs = document.getElementById("liberator-statusline-buftabs");

        if (buftabs)
            statusline.removeChild(buftabs);
    }
}

/// Attach to events in order to update the tabline
var tabContainer = window.getBrowser().mTabContainer;
buftabs._statusline_updateUrl = statusline.updateUrl;

tabContainer.addEventListener("TabMove", function (event) {
    if (options.get("buftabs").get())
        statusline.updateUrl();
}, false);
tabContainer.addEventListener("TabOpen", function (event) {
    if (options.get("buftabs").get())
        statusline.updateUrl();
}, false);
tabContainer.addEventListener("TabClose", function (event) {
    if (options.get("buftabs").get())
        setTimeout(statusline.updateUrl, 0);
}, false);
tabContainer.addEventListener("TabSelect", function (event) {
    if (options.get("buftabs").get())
        statusline.updateUrl();
}, false);

window.getBrowser().addEventListener("load", function (event) {
    if (options.get("buftabs").get())
        statusline.updateUrl();
}, false);

/// Initialise highlight groups
highlight.loadCSS(String(<![CDATA[
    BufTab
    BufTabSelected   font-weight: bold;
]]>));

/// Options
options.add(["buftabs"],
        "Control whether to use buftabs in the statusline",
        "boolean", true,
        {
            setter: function (value)
            {
                if (value)
                {
                    buftabs.createBar();
                    buftabs.updateUrl(null);

                    statusline.updateUrl = buftabs.updateUrl;
                } else {
                    buftabs.destroyBar();
                    statusline.updateUrl = buftabs._statusline_updateUrl;
                    statusline.update();
                }

                return value;
            },

            completer: function (context)
            [
                [false, "Don't show buftabs, show the url"],
                [true, "Show buftabs"]
            ],

            validator: Option.validateCompleter
        });

options.add(["buftabs_maxlength"],
        "Max length of an entry in the buftabs list",
        "number", "25",
        {
            setter: function (value)
            {
                buftabs.updateUrl();
                return value;
            }
        });
 


Файл .vimperator/plugin/tinyurl.js

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
/*
 * This script adds a tinyurl command to Vimperator
 *
 * You can map this script adding this to your .vimperatorrc
 * :map <silent> your_key :exe ":tinyurl "+getBrowser().contentWindow.location.href<CR>
 * @author: fox (fox91 at anche dot no)
 * @version: 0.1
 *
*/


commands.addUserCommand(['tinyurl'],
    "TinyUrl command",
    function(args) {
        if (args.length == 1) {
            let req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
                .createInstance(Components.interfaces.nsIXMLHttpRequest);
            req.open('GET', "http://tinyurl.com/api-create.php?url=" + escape(args[0]), true);
            req.onreadystatechange = function (aEvt) {
                if (req.readyState == 4) {
                    if(req.status == 200) {
                        let clip = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
                            getService(Components.interfaces.nsIClipboardHelper);
                        clip.copyString(req.responseText);
                        liberator.echo("TinyUrl: " + req.responseText);
                    }
                    else
                        liberator.echoerr("Error contacting tinyurl.com!\n");
                }
            };
            req.send(null);
        }
        else {
            liberator.echoerr("Please specify one url");
        }
    });
 



Вообще конфиги подробно комментированы, можно поменять на свой вкус что не нравится. Все эти сокращения даже для меня выглядят ужасно, но когда привыкнешь, то становится довольно удобно.



rushba 21.07.10 18:12 # +1
Для пользователей емакса есть conkeror.
alff31 21.07.10 18:30 # +0
Согласен, но в случае возникновения каких-то нестандартных действий тут можно откатить и сделать :set guioptions+=mT, а там нужно рыться в документации. Все шорткеи удобнее для повседневных действий, а не для тех, что делаешь раз в пол-года.
Как-то начинал пользоватся, но как-то что-то неосилил, да и бросил.
rushba 21.07.10 18:36 # +0
:set... -- это совсем не по-емаксовски, а вот рыться в документации -- это емакс-вей.
alff31 21.07.10 19:01 # +0
Спасибо, не надо мне такого счастья, сейчас попробовал, не осилил даже установку adblock. Минут 10 возился.
Я как-то не очень люблю приложения, в которых полчаса читать маны ради последующей экономии двух минут. Обойдусь vimperator-ом.
muhas 21.07.10 18:19 # +0
запятые в тегах расставь, плз

а по сабжу conkeror для емаксеров...
K-9 21.07.10 18:20 # +0
А для хрома есть?
alff31 21.07.10 18:30 # +0
Адекватной альтернативы нет.
K-9 21.07.10 18:31 # +0
Обидно =(
Aesdana 21.07.10 18:32 # +0
Тогда подскажите неадекватную )
alff31 21.07.10 18:38 # +0
В теме http://welinux.ru/post/3683/ кто-то отписывался по этому поводу, но комментарии куда-то исчезли оттуда.
Aesdana 21.07.10 18:28 # +1
Интересно, надо запробовать.
Очень порадовали Емаксератором и стролить до упора влево
alff31 21.07.10 18:33 # +0
Описал просто конфиг. Тоже не совсем понял, для чего.
1
2
3
4
5
6
7
" Use C-a and C-e to jump to first/last tab
"noremap <C-a> g0
"noremap <C-e> g$
"
" Or use them to go to the absolute left/right of the document
noremap <C-a> 0
noremap <C-e> $
lockie 21.07.10 18:42 # +0
В нить внезапно врывается uzbl.
kstep 21.07.10 18:49 # +0
узбл ниасилил.
lockie 22.07.10 14:52 # +0
Я тоже :(
kstep 21.07.10 18:49 # +0
После этого приходиться две недели учиться пользоваться браузером, управляя им исключительно клавиатурными сочетаниями. После этого наступает дзен и ты не понимаешь, зачем вообще были нужны все эти кнопочки и меню наверху.


+1 от меня =) У меня было именно так именно с таким результатом =)
vyazovoi 24.07.10 16:37 # +0
Лучше бы кто емакс-лайк конфиг для uzbl написал а то самому лень.

Conkeror рулит, только js надоел.
alff31 24.07.10 23:26 # +0
Я физически не могу его написать, тк в глаза не видел uzbl. Или вы про Adrian C.?

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

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

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


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

            Online video HD

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

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

            Full HD video online

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

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

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