Формат XML і повернення до тієї ж лінії в Vim

Я хотів би відобразити F5 , щоб відформатувати поточний буфер за допомогою xmllint --format і повернутися до того самого рядка. Легко зробити лише форматування.

autocmd FileType xml map  :w:silent %!xmllint --format -

Я грав навколо, повернувшись на той самий рядок на деякий час, і знизу знімався, це повинно бути очевидним, я не знаю, що я роблю (взагалі не працює).

fun! XmlFormat()
  let @`\" = line(".")
  w
  silent %!xmllint --format -
  normal! g`\"
endfun
autocmd FileType xml map  :call XmlFormat()

Чи потрібно зберігати поточну лінію в буфері, чи можу я використовувати змінну? Як я можу виконати зовнішню команду в межах функції? Нарешті, як найкраще перейти до номера рядка, що зберігається в змінній?

0
Замість того, щоб використовувати xmllint, який стискає порожні рядки, я б запропонував спробувати налаштування vim-sensible які роблять equals (=) працювати з коробки, щоб відступити XML. Див. Також stackoverflow.com/a/28365920/1207769
додано Автор ctrueden, джерело

1 Відповіді

Ви можете використати відображення, як:

nnoremap  mmgg=G`m

Він використовує маркування руху та = команда фільтрування. Ви можете використовувати xmllint, встановивши параметр equalprg . Я написав статтю про це відображення тут , якщо ви хочете більш детальний опис.

4
додано
Ах ... Використання знаків - набагато краще ...
додано Автор schmmd, джерело
Вам не потрібна тут map , вам потрібно nnoremap .
додано Автор ZyX, джерело
Можна скористатися тим фактом, що Vim автоматично зберігає позицію до останнього стрибка, спрощуючи команду та уникаючи модифікації знаків: : nnoremap gg = G`` .
додано Автор ib., джерело
Ти правий. Я відредагував відповідь.
додано Автор lucapette, джерело
@ бі так, так. Я люблю вім за це. Я довідаю як мінімум одну річ
додано Автор lucapette, джерело