2011-12-14 3 views
6

Я хотел бы создать интерфейс в Javascript, где я собираю нажатия клавиш и отправляю их в удаленный экземпляр vim и возвращу данные о экземпляре любых изменений. Я вполне уверен, что смогу реализовать всю связь между браузером и сервером javascript. Я просто не уверен, как передать данные в vim и как заставить его говорить со мной.Отправить команды vim программно

Любые указатели будут оценены! Спасибо

Редактировать: Первоначальная реализация может быть найдена на Github.

+2

Никогда не пробовал, но если вы скомпилируете vim с поддержкой '' клиентов + '(http://vimdoc.sourceforge.net/htmldoc/remote.html), его можно запустить в режиме клиент-сервер. См. [Это сообщение в блоге] (http://ajayfromiiit.wordpress.com/2009/10/21/server-and-client-mode-in-vim/) для простого примера. –

ответ

18

Посмотрите на TextAid (в частности, на сервер Perl). Может быть, вы найдете полезные идеи.

--re-EDIT--

Поскольку мне нравится ваша идея, которую я смотрел немного дальше.

Предположив Vim скомпилирован с +clientserver, вы можете запустить Vim, как это:

$ vim --servername MYSERVER /path/to/tempfile` 

на удаленном поле. Vim запускается в режиме сервера, и вы можете отправить его команды, как:

$ vim --servername MYSERVER --remote-send 'ihello<Esc>' 

иметь:

hello 

на первой линии, если вы пришлете:

$ vim --servername MYSERVER --remote-send 'A world<Esc>' 

вы получите:

hello world 

Если вы пришлете:

$ vim --servername MYSERVER --remote-send 'yy5p' 

вы получите:

hello world 
hello world 
hello world 
hello world 
hello world 

Если вы отправляете:

$ vim --servername MYSERVER --remote-send ':%s/hello/goodbye cruel<CR>' 

вы получите:

goodbye cruel world 
goodbye cruel world 
goodbye cruel world 
goodbye cruel world 
goodbye cruel world 

который является своего рода прохладным, но вам нужно отправить обратно новое состояние буфера, которое вы делаете с помощью writin g временный файл и отправку его содержимого обратно клиенту после каждой команды. Это означает, что вы много читаете/пишете на своем сервере. Можно также написать макрос, который отправляет содержимое буфера в какой-то внешний процесс при каждом «изменении».

--EDIT--

Если вы следовали по ссылке, а не отвергая мой ответ вы бы увидели, что расширение выше работ, посылая содержимое текстового поля на сервер Perl через HTTP.

Я не думаю, что это имеет значение вообще, если Vim является локальным или на удаленном сервере.

Сервер записывает его во временный файл, который затем открывается с помощью Vim.

Когда Vim записывает файл, его содержимое затем отправляется обратно на расширение сервером.

Ваша часть JS будет делать то, что делает расширение: захватить содержимое текстового поля, отправить его с помощью запроса AJAX POST на ваш сервер, дождаться ответа и обновить содержимое текстовой области.

На самом деле, я думаю, что вы даже можете использовать сценарий выше, как есть. Или, по крайней мере, считать это отправной точкой для собственного приложения.

+0

Я хочу создать облачный редактор vim, а не локальную утилиту. Спасибо –

+0

Пожалуйста, уточните свой вопрос. Ничто в нем не говорит, что вы хотите создать облако Vim. Что такое облако Vim, так или иначе? – romainl

+0

Почему кто-то отказался от этого ответа? Mah .. – lucapette