2017-02-16 1 views
0

Я написал команду карты в vim, которая граничит с тем, что она слишком сложна для моего вкуса. Я бы хотел:аннотация и повторное использование частей команды карты в vimrc

  1. Отрежьте части или, по крайней мере, выплюньте их на несколько строк и объясните каждый.
  2. Повторное использование большинства из них только с 2 вещами, каждый раз изменяя только 2 вещи.

Команда использует плагин vim-pandoc для создания Html-файла из текущего файла pandoc и копирования его в буфер обмена.

nnoremap <leader><leader>11 :w<cr>:Pandoc html<cr>:sleep 100m<cr>:e <c-r>=expand('%:r')<cr>.html<cr>ggVG"+y:b#<cr>:bd #<cr> 

Моя первая попытка таким образом:

nnoremap <expr> <leader><leader>22 MyFunc() 

func! MyFunc() 
    let save = ':w<cr>' 
    let runPandoc = ':Pandoc html<cr>' 
    let sleep = ':sleep 100m<cr>' 
    let viewResult = ':e ' . expand('%:r') . '.html' . '<cr>' 
    let copyAll = 'ggVG"+y' 
    let backToPrevBuf = ':b#<cr>' 

    return save . runPandoc . sleep . viewResult . copyAll . backToPrevBuf 
endfunc 

Однако, это не работает, потому что он имеет <cr> в возвращаемом значении вместо фактического выполнения ввода.

Используя это, я могу передать аргумент MyFunc, который изменит части html на другие типы файлов.

Мои два вопроса:

  1. Есть лучше, более прямой путь абстрагируясь от части длинных карт?
  2. Как я могу решить проблему с результатом <cr>, вместо фактического значения «Нажмите кнопку ввода».

Спасибо за помощь!

EDIT:

После получения предложения Теперь у меня есть текущая версия, это кажется немного многословным. В то время как я могу обернуть кнопки feeds, чтобы быть более коротким именем с параметром «n», есть ли что-нибудь еще, что я могу сделать?

func! MyFunc() 
    call feedkeys(":w\<cr>",'n') 
    call feedkeys(":Pandoc html\<cr>",'n') 
    call feedkeys(":sleep 100m\<cr>",'n') 
    call feedkeys(':e ' . expand('%:r') . '.html' . "\<cr>",'n') 
    "TODO read about :%y+ understand why it copies the entire file 
    call feedkeys('ggVG"+y','n') 
    call feedkeys(":b#\<cr>",'n') 
endfunc 

EDIT:

Наконец, я понял, что это значит избавиться от feedkeys, и теперь я достиг конечного пункта назначения:

nnoremap <silent> <leader><leader>22 :call MyFunc()<cr><cr> 

func! MyFunc() 
    w 
    Pandoc html 
    sleep 100m 
    execute 'e' (expand('%:r') . '.html') 
    %y+ 
    b# 
endfunc 

Спасибо за помощь!

+0

: ч feedkeys() может сделать трюк для вас. –

+0

Последний трюк, IIRC ': e%: r.html' или даже': e% <. Html' должен работать. –

+0

Вы также можете избежать открытия и закрытия буфера с помощью следующего: 'let @ + = join (readfile (expand ('%: r).'. Html ')," \ n ")'. Иногда это интересно избегать запуска автокоманд, поскольку они могут иметь побочные эффекты, замедлить выполнение и т. Д. –

ответ

2

Есть ли лучший, более прямой способ абстрагирования участков длинных карт?

Поскольку вы уже назвали функцию, а функция просто конкатенации rhs отображения, почему бы просто не сделать реальную работу в вашей функции, а просто карта для выполнения функции, как: nnoremap whatever :call yourFunc()<cr>

Как я могу решить проблему с <cr>, появляющейся в результате вместо фактического значения «Нажмите кнопку ввода».

Использование "\<cr>"

+0

+1. Используя ': map-', вы запутываете вещи. @Kent прав, сохраняйте свою функцию простой и позволяйте ей выполнять эту работу. –

+0

Кстати, 'copyall' просто становится:':% y + '. –

+0

Итак, я попытался переписать его в соответствии с вашими предложениями, а также комментарий @ OSwaldo и отредактировал сообщение в соответствии с тем, что я получил, было ли это то, что вы имели в виду? Это кажется немного подробным. – PsyFish

Смежные вопросы