Написание функции vim для вставки блока статического текста - PullRequest
43 голосов
/ 27 марта 2009

Я хотел бы иметь возможность делать что-то подобное в vim (вы можете предположить, что v7 +, если это поможет).

Введите команду вроде этой (или что-то близкое)

:inshtml

и vim выдает следующее в текущий файл в текущей позиции курсора

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    </body>
</html>

Могу я написать функцию vim? Есть ли лучший способ?

Ответы [ 10 ]

39 голосов
/ 27 марта 2009

Я делаю это, сохраняя в папке vim набор файлов, которые затем вставляю с помощью команды r (которая вставляет содержимое файла в текущем месте, если номер строки не передается) из некоторой функции:

function! Class()
    " ~/vim/cpp/new-class.txt is the path to the template file
    r~/vim/cpp/new-class.txt
endfunction

Это очень практично, на мой взгляд, когда вы хотите вставить многострочный текст. Затем вы можете, например, назначить сочетание клавиш для вызова вашей функции:

nmap ^N :call Class()<CR>
34 голосов
/ 27 мая 2011

Опоздал на вечеринку, просто для дальнейшего использования, но другой способ сделать это - создать команду, например,

:command Inshtml :normal i your text here^V<ESC>

Вы можете назвать это как

:Inshtml

Объяснение: команда выполняется в командном режиме, и вы переключаетесь в нормальный режим с помощью: normal, затем для вставки режима с помощью 'i', после чего 'i' - ваш текст, и вы заканчиваете escape, который вводится как ввод символа ^ V

Также возможно добавить аргументы, например,

:command -nargs=1 Inshtml :normal i You entered <args>^V<ESC>

где <args> (введено буквально как есть) будет заменено фактическими аргументами, и вы вызываете его с

:Inshtml blah
14 голосов
/ 22 января 2016

Я создал новый файл generate_html.vim в ~ / .vim / plugins / со следующим кодом

"
" <This plugin generates html tags to new html files>
"

autocmd BufNewFile  *.html  call    Generate_html()

function! Generate_html()
    call append(0, "<!DOCTYPE HTML>")
    call append(1, "<html><head>")
    call append(2, "    <title></title>")
    call append(3, '    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />')
    call append(4, '    <style type="text/css">')
    call append(5, '    </style>')
    call append(6, '</head>')
    call append(7, '<body>')
    call append(8, '</body>')
    call append(9, '</html>')
endfunction

таким образом, каждый раз, когда я открываю новый файл .html в vim, он печатает этот текст в новый файл

8 голосов
/ 27 марта 2009

snippetsEmu

Мне нравится использовать плагин vim snippetsEmu для вставки фрагментов кода, подобных вашему.

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

snippetsEmu поставляется с различными фрагментами (также для HTML), и новые фрагменты могут быть легко добавлены.


EDIT

snipMate

Сегодня я вновь посетил мои установленные модули VIM Confiugration + и нашел плагин snipMate , который ИМХО даже лучше, чем snippetsEmu . snipMate обновляет так же, как TextMate все заполнители на лету.

7 голосов
/ 27 марта 2009

Можете ли вы определить аббревиатуру. например,

:ab insh 'your html here'

как ничего из вышеперечисленного не выглядит параметризованным?

Фактически, глядя на мои настройки VIM, я обнаруживаю новый файл .html, загружаемый таким образом:

autocmd BufNewFile *.html call GenerateHeader()

и определите функцию GenerateHeader() для вставки моего необходимого шаблона (я делаю то же самое для Java / Perl и т. Д.).

Стоит получить Кулинарную книгу Vim для такого рода вещей. Это разумное вложение.

4 голосов
/ 27 марта 2009

Это должно быть возможно. Я использую авто-замену. В моем .vimrc у меня есть эта строка:

iab _perls #!/usr/bin/perl<CR><BS><CR>use strict;<CR>use warnings;<CR>

И всякий раз, когда я запускаю скрипт Perl, я просто набираю _perls и нажимаю Enter.

3 голосов
/ 24 февраля 2012

Вы можете использовать Python (или любую другую программу), если, как и я, вы не совсем поняли vimScript

Этот парень говорит о регистре выражений vim. По сути, вы помещаете что-то подобное в ваш .vimrc файл

:imap <C-j> <C-r>=system('/home/BennyHill/htmlScript.py')<CR>

Чтобы каждый раз в режиме вставки вы нажимали Ctrl j , он вызывает скрипт htmlScript.py, в котором есть что-то подобное ( NOTE У меня есть на самом деле это не проверял)

#!/usr/bin/env python
import sys

snippet="""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
    </body>
</html>"""

sys.stdout.write(snippet)

Тогда просто не забудьте сделать файл исполняемым (chmod 0755 /home/BennyHill/htmlScript.py). Это может быть излишним, но мне гораздо удобнее с Python, чем с синтаксисом vim.

1 голос
/ 27 марта 2009

Существует множество плагинов для расширения шаблонов для vim.

Примечание: я поддерживаю форк muTemplate . Просто добавьте свой код в {rtp}/template/html.template или в $VIMTEMPLATES/html.template. И это все. Если вы не хотите, чтобы фрагмент неявно загружался при открытии нового HTML-файла, назовите файл-шаблон html/whatever.template (вместо html.template) и загрузите его с :MuTemplate html/whatever или whatever^r<tab> в INSERT режим (в буфере HTML).

Все проблемы пути, проблемы переносимости и т. Д. Уже решены. И в отличие от snippetEmu, который поддерживает (и каким-то образом ожидает) несколько ( трудно поддерживаемых , IMO) фрагментов в одном и том же файле определения фрагментов, для Mu-шаблона требуется один файл шаблона на фрагмент.

1 голос
/ 27 марта 2009

Вы можете один раз скопировать этот текст в какой-нибудь (например, «а») регистр. И вставляйте его каждый раз, когда вам нужно, если вы не перезаписываете регистр 'a'.

Для копирования для регистрации в визуальном режиме: "ay
Чтобы вставить из реестра в обычном режиме: "ap
Чтобы вставить из регистра в режиме вставки: a

Или, если этот шаблон уже скопирован, вы можете использовать

let @a = @*

Чтобы поставить этот шаблон для регистрации.

0 голосов
/ 23 февраля 2018

Поместите ваш текст в файл (например, html). Затем добавьте в ваш .vimrc.
следующее command Inshtml r html

Я использую Inshtml вместо inshtml, потому что vim не поддерживает пользовательские команды, начинающиеся с маленькой буквы.

Тогда, если вы можете набрать Inshtml в командном режиме (то есть, :Inshtml).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...