2013-03-30 2 views
1

Я хочу выполнить команду "yiw:s/\<<C-r>"\>/<C-r>"/g<Left><Left>" по последовательности клавиш. Так что я сделать отображениепоследовательность клавиш vim как аргумент функции

nnoremap <F7> yiw:s/\<<C-r>"\>/<C-r>"/g<Left><Left> 

Это отображение скопировать слово под курсором, то строка: s/\ < «> /»/г «(где» заменяются скопированной слова) появляется в команде строка и курсор в командной строке находятся в конце оператора замены.

Я также хочу сохранить позицию курсора перед этой командой и восстановить ее после.

function! SafeCommand(cmd) 
let line = line('.') 
let col = col('.') 
// execute cmd here 
call cursor(line, col) 
    endfunction 

Как это сделать?

+0

1) вы сопоставляются '' f' затем 7', не '' . 2) если вы хотите сделать ': s /../../ g', вам нужно поставить' 'там 3), даже если был' ', левый левый тоже не имеет смысла, потому что после подстановка, ваш курсор будет в начале этой строки. 4) Я не понял, что вы пытаетесь сделать ... замените слово под курсором тем же словом? можете ли вы немного объяснить это в своем вопросе? – Kent

+1

после запуска вашей отображаемой команды нажатие клавиши Ctrl-O может вернуть вас в прежнее положение. Кроме того, вам не нужно копировать текущее слово, в командной строке ' (: h )' будет скопировать слово под курсором. вы все равно хотите эту функцию? – Kent

+0

Thx для советов. Но да, я все еще хочу знать, как написать такую ​​функцию. – user14416

ответ

1

Как правило, вы просто поместите всю (сложную) команду в функцию и вызовите эту функцию из :nnoremap. Но это не работает для неполных команд, таких как шаблон :substitute, который представляет ваше сопоставление. Для этого вам необходимо включить сохранения/восстановления частей в командной строке (хотя это некрасиво):

:fun! Save() 
    let s:line = line('.') 
    let s:col = col('.') 
:endfun 
:fun! Restore() 
    call cursor(s:line, s:col) 
:endfun 
:nnoremap <F7> yiw:call Save()<Bar>s/\<<C-r>"\>/<C-r>"/g<Bar>call Restore()<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>