Подтвердить что ты не робот

Написание функции vim для вставки блока статического текста

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

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

:inshtml

и у вас есть vim dump следующее в текущий файл в текущем местоположении курсора

<!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? Есть ли лучший способ?

4b9b3361

Ответ 1

Я делаю это, сохраняя под моей папкой 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>

Ответ 2

Поздно к стороне, как раз для будущей ссылки, но другой способ сделать это - создать команду, например.

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

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

:Inshtml

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

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

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

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

:Inshtml blah

Ответ 3

Я создал новый файл 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, он печатает этот текст в новый файл

Ответ 4

snippetsEmu

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

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

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


ИЗМЕНИТЬ

snipMate

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

Ответ 5

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

:ab insh 'your html here'

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

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

autocmd BufNewFile *.html call GenerateHeader()

и определите функцию GenerateHeader(), чтобы вставить мой требуемый шаблон (я делаю то же самое для Java/Perl и т.д.).

Стоит получить Vim Cookbook для такого рода вещей. Это хорошая инвестиция.

Ответ 6

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

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

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

Ответ 7

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

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

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

Чтобы каждый раз в режиме вставки вы нажимали Ctrl j, он вызывает script htmlScript.py, который имеет в нем что-то вроде этого ( ПРИМЕЧАНИЕ. Я на самом деле не тестировал эту )

#!/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.

Ответ 8

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

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

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

let @a = @*

Чтобы этот шаблон зарегистрировался.

Ответ 9

Есть много плагины расширителя шаблонов для vim.

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

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