Вызов общего объекта на последовательности клавиш из vi / Vim - PullRequest
3 голосов
/ 16 марта 2009

У меня есть общая библиотека (в двоичной форме; у меня есть источник), которую я использую для инвертирования / циклического переключения между символами в исходных файлах в Visual Studio.

Я бы хотел использовать те же функции в vi и / или Vim.

В частности, я хотел бы сделать следующий сценарий:

  • курсор находится на слове
  • Я нажимаю последовательность клавиш, например, CTRL-I
  • vi / Vim прорабатывает все слова, о которых я говорю
  • vi / Vim вызывает мою общую библиотеку, передавая слово и получая замену инвертирования / цикла
  • vi / Wim заменяет исходное слово новым словом

У меня нет никакой подсказки, если / как заставить vi / Vim сделать это, и мне не повезло в поисках.

Любой совет, полученный с благодарностью ...

Ответы [ 3 ]

6 голосов
/ 16 марта 2009

Попробуйте

inoremap <C-i> <esc>"hciw<C-R>=libcall('path/to/your.dll', 'func', @h)<CR>

Что он делает:

  • создать карту для режима вставки
  • переключиться в нормальный режим "Как переместить слово под курсором в регистр h
  • = вставить в позицию курсора результат следующего выражения
  • libcall (...) вызывает функцию в библиотеке времени выполнения.
  • @ h - значение регистра 'h'.

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

inoremap <C-i> <esc>"hciw<C-R>=substitute(system('mybin --word='.@h), "\n", '', 'g')<CR>
1 голос
/ 16 марта 2009

Есть много способов сделать это (: h expand (), ...). Одним из них является следующий)

:nnoremap triggerkeysequence ciw<c-r>=libcall('path/to/your.dll', 'your_function',@")<cr>

Кстати: <c-i> равно <tab>, вы уверены, что хотите переопределить действие для этого ключа?

1 голос
/ 16 марта 2009

Я не знаю, как вызывать разделяемую библиотеку из обычных скриптов vim, но если вы можете создать оболочку python для вашей библиотеки и используете версию vim больше 7, вы можете сделать это, вызвав скрипт python внутри ВИМ.
Прежде всего, проверьте, включена ли поддержка Python: введите

:version

внутри vim для просмотра списка доступных функций; если у него есть поддержка Python, вы должны увидеть где-нибудь '+ python' (в противном случае '-python'). Если у вас не включен Python, вы можете обратиться к этой записи , чтобы скомпилировать vim с поддержкой Python.

Затем вы можете сопоставить клавишу для вызова функции python со словом, находящимся под курсором:

python << EOF
import vim
import MySharedLibraryPythonBinding

def MyFunction():
    # get word under cursor
    x = vim.eval('expand ("<cword>")')
    # get replacement
    MySharedLibraryPythonBinding.GetReplacement(x)
    # replace contents (you'll need some work here...)
    vim.current.line = "add something sensible here..."
EOF

nmap <F3> :py MyFunction( expand("<cword>") )<CR>

Конечно, это не полностью рабочее решение, но я надеюсь, что оно поможет вам выбрать правильный путь.

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