: читать после курсора, а не после строки

11

Я :r !uuidgenчасто использую, чтобы вставить новый UUID в буфер. Это работает, но я обычно пытаюсь вставить uuid между кавычками и :r !uuidgenпечатать uuid на новой строке.

Чтобы обойти эту проблему, я в настоящее время использую простую раскладку клавиш:

nnoremap <C-u> mm:r!uuidgen<CR>dW"_dd`mp

Этот макрос устанавливает метку mm, вставляет uuid r!uuidgen, удаляет вставленный uuid dW, удаляет лишнюю строку "_dd, возвращается к метке BACKTICKmи, наконец, вставляет uuid p.

Есть ли способ :rсразу после курсора без этого макроса / связывания клавиш, который тратит впустую регистр?


источник
1
SU вопрос , также с обходными путями, как этот.
Муру

Ответы:

8

Вы можете использовать регистр выражений "=и system():

<C-r>=system("uuidgen | tr -d '\n'")<CR>

Это будет выглядеть так в режиме вставки:

inoremap <key> <C-r>=system("uuidgen | tr -d '\n'")<CR>

или с отображением выражения:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")
romainl
источник
5

В режиме вставки вы можете нажать Ctrl-R, а затем набрать:

=system('uuidgen')

Обратите внимание, что это добавит завершающий символ новой строки, потому что это то, что uuidgenвыводит; чтобы исправить это, мы могли бы использовать:

=system('uuidgen')[:-2]

Удалить перевод строки.

От :help i_CTRL-R:

Вставьте содержимое реестра. Между вводом CTRL-R и вторым символом будет отображаться «», чтобы указать, что вы должны ввести имя регистра.

[..]

'=' регистр выражений: вам предлагается ввести выражение (см. выражение)

Чтобы привязать это к Ctrl-uпримеру, вы можете использовать:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>
Мартин Турной
источник
2

Еще один, с :python:

:py import uuid, vim; vim.command(':normal i' + str(uuid.uuid1()))

Вы можете отобразить как:

:inoremap <key> <esc>:py import uuid, vim; vim.command(':normal a' + str(uuid.uuid1()))<cr>a

UUID генерируются модулем Python UUID .

Мур
источник
1
Хотя это довольно извращенный способ.
Муру
0

Это, возможно, менее предпочтительно, чем использование решения с чистой vim, однако, если вы используете диспетчер сниппетов, такой как Ultisnips, вы можете попробовать добавить фрагмент, например, такой:

snippet uuid "insert new uuid" w
`uuidgen`
endsnippet

Таким образом, вы можете ввести uuidи нажать на триггер расширения в режиме вставки, и uuidон будет заменен выводом соответствующей команды оболочки. Это, конечно, может быть легко адаптировано для других команд и расширено мощными способами, как описано в документах Ultisnips.

Simut
источник