Есть ли режим HTML для вставки escape для vim? - PullRequest
4 голосов
/ 20 апреля 2011

Я использую vim для ведения блога о том, что я делаю в течение дня (какие команды я использовал для генерации вывода и т. Д.), И иногда мне нужно копировать-вставлять строки, содержащие специальные HTML-символы.Есть ли способ создать режим «html-paste», который (например) преобразует <в <?</p>

Ответы [ 3 ]

6 голосов
/ 20 апреля 2011

Для простого кодирования XML я использую unimpaired.vim Тима Поупа .

  • [x с последующим движением
  • , визуально выделите текст, затем [x
  • [xx для кодирования текущей строки

Для кодирования только что вставленного текста:

`[[x`]

Объяснение:

  • `[ и `] - отметки, установленные границами изменения или янки.`[ в начале и `] в конце.
  • Сначала перейдите к началу только что вставленного текста с помощью `[
  • Далее выполните [x, чтобы закодировать следующее движение
  • При использовании `] движение будет представлять собой весь текст между текущим положением курсора и концом вставленного текста.

При желании вы можете заключить его в отображение

nmap <leader>x `[[x`]

Дополнительная информация:

:h mark-motion
:h `[
5 голосов
/ 20 апреля 2011

Есть несколько небольших функций здесь , если кто-то захочет изменить их, чтобы принять диапазон, а затем предоставьте сопоставление, которое проходит отметки [ и ], чтобы воздействовать на последний вставленный текст.


На самом деле, посмотрев немного, вам вообще не нужно изменять функции из подсказки vim.Если функция не передает явно параметр range, функция вызывается один раз для каждой строки данного диапазона.Это означает, что все, что вам нужно сделать, это вызвать функцию с диапазоном.

Несколько полезных примеров приведены ниже.Первый вызывает HtmlEscape () для каждой строки в последнем вставленном тексте, второй делает то же самое, но для каждой строки в визуально выбранном блоке.Добавьте это к вашему .vimrc:

nnoremap <Leader>h :'[,']call HtmlEscape()<CR>
vnoremap <Leader>h :call HtmlEscape()<CR>

function HtmlEscape()
  silent s/&/\&amp;/eg
  silent s/</\&lt;/eg
  silent s/>/\&gt;/eg
endfunction

Очевидно, что если вы хотите заменить больше вещей, вам придется добавить их;на связанной вики-странице их много.

3 голосов
/ 20 апреля 2011

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

python import xmlrpclib, vim
function! EscapeHTML(str)
    try " Force any error to be an exception "
        let d={}
        python vim.eval("extend(d, {'xml': '"+xmlrpclib.escape(vim.eval("a:str")).replace("'", "''")+"'})")
        return d.xml
    endtry
endfunction
function! s:PasteHTML()
    return "\"=EscapeHTML(getreg(".string(v:register)."))\np"
endfunction
nnoremap <expr> ,p <SID>PasteHTML()

Требуется vim с поддержкой Python и установленным Python. xmlrpclib пакеты поставляются с Python. Если вы не хотите использовать Python, замените функцию EscapeHTML. С этим сценарием ,p будет работать так же, как p, за исключением преобразования его ввода.

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