Написание функции 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? Есть ли лучший способ?
Ответы
Ответ 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 требует один шаблон файл для каждого фрагмента.