Можете ли вы получить доступ к регистрам из функций python в vim
Кажется, что vims python sripting предназначен для редактирования буфера и файлов, а не для работы с регистрами vims. Вы можете использовать некоторые команды пакетов vim, чтобы получить доступ к регистрам, но это не очень.
Мое решение для создания функции vim с использованием python, использующего регистр
что-то вроде этого.
function printUnnamedRegister()
python <<EOF
print vim.eval('@@')
EOF
endfunction
Регистры настройки также могут быть доступны с помощью
function setUnnamedRegsiter()
python <<EOF
s = "Some \"crazy\" string\nwith interesting characters"
vim.command('let @@="%s"' % myescapefn(s) )
EOF
endfunction
Однако это кажется немного громоздким, и я не уверен, что именно должно быть myescapefn.
Поэтому я никогда не мог правильно настроить настройку.
Итак, если есть способ сделать что-то более похожее на
function printUnnamedRegister()
python <<EOF
print vim.getRegister('@')
EOF
endfunction
function setUnnamedRegsiter()
python <<EOF
s = "Some \"crazy\" string\nwith interesting characters"
vim.setRegister('@',s)
EOF
endfunction
Или даже хорошая версия myescapefn, которую я мог бы использовать, это было бы очень удобно.
UPDATE:
На основе решения ZyX я использую этот кусок python
def setRegister(reg, value):
vim.command( "let @%s='%s'" % (reg, value.replace("'","''") ) )
Ответы
Ответ 1
Если вы используете одинарные кавычки, все, что вам нужно, это заменить каждое появление одиночной кавычки двумя одинарными кавычками.
Что-то вроде этого:
python import vim, re
python def senclose(str): return "'"+re.sub(re.compile("'"), "''", str)+"'"
python vim.command("let @r="+senclose("string with single 'quotes'"))
Обновить: этот метод в значительной степени зависит от (недокументированной) функции разницы между
let abc='string
with newline'
и
execute "let abc='string\nwith newline'"
: в то время как первый сбой второй не удается (и это не единственный пример различий между обработкой новой строки в :execute
и обычными файлами). С другой стороны, eval()
будет несколько более ожидаемым, чтобы справиться с этим, так как string("string\nwith newline")
возвращает точно то же самое senclose
, поэтому я пишу это сейчас только с помощью vim.eval
:
python senclose = lambda str: "'"+str.replace("'", "''")+"'"
python vim.eval("setreg('@r', {0})".format(senclose("string with single 'quotes'")))