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

Я хотел бы иметь возможность сделать что-то подобное в 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 ответов

Решение

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

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

: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

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

snippetsEmu

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

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

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


РЕДАКТИРОВАТЬ

snipMate

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

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

:ab insh 'your html here'

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

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

autocmd BufNewFile *.html call GenerateHeader()

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

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

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

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

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

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

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

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

Так что каждый раз, когда вы нажимаете Ctrl-J в режиме вставки, он вызывает скрипт 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.

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

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

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

let @a = @*

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

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

NB: я поддерживаю форк 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-template требуется один файл-шаблон на фрагмент.

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

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

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

Другие вопросы по тегам