Как многократно добавлять текст с обеих сторон слова в vim? - PullRequest
5 голосов
/ 31 мая 2011

У меня есть куча ссылок на локальные переменные в скрипте Python, которые я хочу вместо этого извлечь из словаря. Итак, мне нужно существенно изменить foo, bar и другие на env['foo'], env['bar'] и так далее. Нужно ли писать регулярное выражение и сопоставлять каждое имя переменной для преобразования, или есть более прямой подход, который я мог бы просто повторить с помощью команды .?

Ответы [ 4 ]

6 голосов
/ 01 июня 2011

Вы можете использовать макрос: введите эти команды за один раз (с интервалом только для вставки комментариев)

             " first move to start of the relevant word (ie via search)
qa           " record macro into the a register.
ienv['<esc>  " insert relevant piece
ea']         " move to end of word and insert relevant piece
q            " stop recording

затем, когда вы переходите к следующему слову, просто нажмите @a, чтобы воспроизвести макрос (или даже @@, чтобы повторить последний повтор после этого).

5 голосов
/ 01 июня 2011

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

%s/\\(foo\|bar\|baz\\)/env['\1']/

Замена foo, bar и baz какими-либо фактическими именами переменных. Вы можете добавить столько дополнительных переменных, сколько захотите, просто убедитесь, что экранировали свои каналы OR с обратной косой чертой. Надеюсь, это поможет.

3 голосов
/ 01 июня 2011

вы могли бы написать функцию, которая бы хорошо это делала, добавив это в ваш файл .vimrc:

function! s:surround()
    let word = expand("<cword>")
    let command = "%s/".word."/env[\'".word."\']/g"
    execute command
endfunction
map cx :call <SID>surround()<CR>

Это будет окружать каждое вхождение слова, находящегося в данный момент под курсором.

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

function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/g"
    execute command
endfunction
map cx :call <SID>surround()<CR>

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

function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/c"
    execute command
endfunction
map cx :call <SID>surround()<CR>
0 голосов
/ 01 июня 2011

Я нашел один способ сделать то, что мне нужно.Используйте q{0-9a-zA-Z"} для записи нажатий клавиш в буфер.Поместите курсор в начале имени переменной, затем cw и введите env[''].Затем переместите курсор назад на одну пробел к последней кавычке и вставьте буфер, заполненный командой cw, с помощью P.Наконец, повторно используйте запись с @{0-9a-z".=*} для каждой переменной.

...