Написание функции 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
).