Подтвердить что ты не робот

Notepad ++ как "multi editing" в VIM?

Я перехожу из Notepad ++ в VIM в качестве основного текстового редактора.

Notepad ++ может иметь несколько курсоров, удерживая нажатой клавишу ctrl и щелкая в любом месте текста, поэтому, если вы введете, текст появится в нескольких местах.

Возможно ли это в vim? Что-то вроде вставки после выбора нескольких строк в визуальном режиме, но с возможностью иметь курсоры в любом месте текста.

Это функция, которую я редко использую, и это довольно легко избежать, мне просто любопытно, так как ее единственная, с которой я не мог найти замену в vim еще.

4b9b3361

Ответ 1

Существует не встроенная функция такого типа.

Позвольте мне предложить функцию, которая повторяет команду (например, . повторение последней команда изменения) в положениях заданных меток. Обе метки и команда заданные как строковые аргументы. Знаки, указанные в пути, варьируются в регулярном выражений или спецификатора scanf -формата. Например, za-dx означает метки z, a, b, c, d, x.

function! MarksRepeat(marks, command)
    let pos = 0
    let len = strlen(a:marks)
    let alpha = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    let beta =  '1234567899bcdefghijklmnopqrstuvwxyzzBCDEFGHIJKLMNOPQRSTUVWXYZZ'
    while pos < len
        if a:marks[pos + 1] != '-'
            exe 'norm `' . a:marks[pos] . a:command
            let pos += 1
        elseif a:marks[pos] <= a:marks[pos+2]
            let mark = a:marks[pos]
            let stop = a:marks[pos+2]
            if mark =~ '[0-9a-zA-Z]' && stop =~ '[0-9a-zA-Z]'
                while 1
                    exe 'norm `' . mark . a:command
                    if mark == stop
                        break
                    endif
                    let mark = tr(mark, alpha, beta)
                endwhile
            endif
            let pos += 3
        endif
    endwhile
endfunction

В вашем случае эту функцию можно использовать следующим образом.

  • Отметьте все места для одновременных вставок (кроме одного) с помощью Vim меток (с помощью команды m).
  • Собственно вставьте текст в одно место, которое не было отмечено.
  • Запустите функцию:

    :call MarksRepeat(‹marks›, '.')
    

Ответ 2

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

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

Ответ 4

Ответ ib и многоцелевое vim-плагин интересны, но следующее предложение, которое не требует специальной функции или плагина.

Временно set foldmethod=manual, затем отметьте блоки, с которыми вы хотите работать, с помощью zf.

Наконец, используйте команду ex :folddoclosed для выполнения ex-команд на сложенных блоках.

Например: :folddoclosed norm Iinsert some text at the front

Обратите внимание, что вы можете использовать :folddoclosed для любых сложенных групп строк, чтобы вы могли использовать другие методы foldmethod... но обычно имеет смысл вручную создавать складки.

Вы также можете использовать визуальные маркеры, а затем :norm, который дает вам :'<,'>norm... Но визуальные маркеры позволяют вам выбирать непрерывный диапазон строк. Используя сгибы и :folddoclosed, вы можете работать с несколькими диапазонами строк одновременно.

Еще один совет... чтобы сэкономить время на ввод :folddoclosed, я наберу :fo<shifttab><shifttab><shifttab>