Можете ли вы получить доступ к регистрам из функций Python в VIM - PullRequest
10 голосов
/ 23 апреля 2010

Похоже, что сценарии vims python предназначены для редактирования буфера и файлов, а не для работы с регистрами vims. Вы можете использовать некоторые команды vim packages, чтобы получить доступ к регистрам, но это не очень красиво.

Мое решение для создания функции 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 я использую этот кусок питона

def setRegister(reg, value):
  vim.command( "let @%s='%s'" % (reg, value.replace("'","''") ) )

1 Ответ

6 голосов
/ 23 апреля 2010

Если вы используете одинарные кавычки, все, что вам нужно, это заменять каждый вхождения одинарной кавычки двумя одинарными кавычками. Примерно так:

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'")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...