2013-05-08 3 views
1

Я хочу скопировать несколько строк в vi.Как узнать в VI, на какой строке курсор включен?

У меня есть текст, как

python class1 def: 
    code code code 
    ... 
    code code code 
    last line class1 

python class2 def: 
    code code code 
    ... 
    code code code 

Я хочу, чтобы скопировать весь class1. Я пытался сделать это с yNy, поэтому мне нужно было получить N, то есть подсчитать количество строк, которые имеет класс.

Тогда я подумал, что было бы хорошо, чтобы получить номер строки python class1 def: (скажем, X) и last line class1 (Y), вычислить N=Y-X, перейти к первой линии класса и сделать yNy. Однако я не мог понять, как я могу получить номера строк.

Итак, есть ли способ узнать, в какую строку я нахожусь? И вообще, есть ли другой способ скопировать пасту всего блока, как тот, который я указал?

Это моя vi версия:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:44:45) 
Included patches: 1-547 
+1

Попробуйте нажать 'Ctrl-g' на данной строке. Фактически это дает гораздо больше деталей, чем ':. ='. – devnull

ответ

4

Номер текущей линии может быть получен :.=. Ctrl-g дает более подробную информацию, включая имя файла, информацию о колонке, ...

Чтобы скопировать блок, перейдите к началу строки, которую нужно скопировать 0. Нажатие v начнет визуальный режим. Перейдите к последней строке, которую нужно скопировать. Yank y. (Визуальный выбор сейчас находится в буфере.)

6
  • Используя только нормальный режим команд:

    Вы можете сделать y} дергать все от текущей строки до и включая следующую пустую строку, ограничивающую что Vim считает «абзацем». Это может работать или не работать в зависимости от стиля кодирования.

    По-прежнему используя понятие «пункт», вы можете сделать yip или yap из любой точки абзаца.

    Вы можете установить опцию number, которая позволяет вам видеть абсолютные номера строк и, следовательно, иметь возможность делать y10G, «держите все отсюда до строки 10».

    Вы можете установить опцию relativenumber, которая позволяет видеть относительные номера строк и, следовательно, иметь возможность делать y5j, «держите все отсюда до 5 строк ниже».

    Вы можете сделать V/foo<CR>y, чтобы вытащить все отсюда до foo линии.

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

    Вы также можете установить отметку в первой строке класса с помощью ma, переместить курсор на последнюю строку и сделать y'a (что звучит как имя божества Лавкрафта).

  • Использование Ex команды:

    Поскольку вышеупомянутый number опция показывает число абсолютных строк, вы можете увидеть, что класс заканчивается на линии 10 и сделать :.,10y.

    Поскольку вышеупомянутый relativenumber опция показывает число относительных линий, вы можете видеть, что класс заканчивается 5 строкой ниже и сделать :,+5y (опуская подразумеваемые .).

  • Использование строки статуса (или нет):

    Вы можете :set ruler иметь номер текущей строки, отображаемой на правой стороне статусной, если у вас есть один или на правой стороне вашей командной строки, если вы не У вас есть статусная линия.

  • Использование Vimscript:

    Вы можете использовать line('.'), чтобы получить номер текущей строки.

  • Использования пользовательских текстовых объектов:

    Есть ряд пользовательских текстовых объектов, доступных на vim.org для отступа блоков, аргументов функции и многих других. Возможно, есть один для классов Python.

В целом, я бы посоветовал вам установить либо ruler, number или relativenumber постоянно в вашем ~/.vimrc и привыкнуть к нему.

  • ruler является наименее инвазивным из связки, но это также наиболее ограничен: вы знаете, где вы находитесь, но это не помогает, если вы хотите, чтобы определить цель.

  • number является наиболее классическим и может использоваться для легкой ориентации конкретной линии.

  • relativenumber Вначале немного странно и, как и number, можно легко использовать для таргетинга на определенную линию.

Выбор number или relativenumber это, насколько я понимаю, дело вкуса. Я нахожу relativenumber очень интуитивно понятным, YMMV.

+0

Отлично! 'y}' отлично работал для целей Python. Тот, который я не мог использовать правильно, это * Вы можете ': установить номер' и сделать' y10G' *. Я получаю ошибку * E488: Trailing characters * *. Кроме того, я бы добавил ': set nonu' для выхода из режима': set number'. Спасибо за такое подробное объяснение. – fedorqui

+0

Это две разделенные команды: ': set number' позволяет отображать абсолютные номера строк, а' y10G' - это еще одна команда, которая держит «отсюда до строки 10». ': set nu' и': set rnu' используются только для активации номеров строк и вовсе не предназначены для ввода каждый раз, когда вы хотите вывести несколько строк. Это было бы безумно inneficient! Просто добавьте одну или другую настройку в '~/.vimrc' и наслаждайтесь. – romainl

+0

Я добавил дополнительную информацию. – romainl

2

Выполните следующие действия в режиме командной

  1. :.= возвращает номер строки текущей строки в нижней части экрана
  2. yNy или Nyy копирует следующие N строк, в том числе линия тока
  3. p пасты скопированный текст после текущей строки

Кроме того,

:set nu! в командном режиме включит/выключит номер строки в начале каждой строки.

+0

Спасибо! ':. =' отлично подходит для этой цели. В другом ответе также предлагается опция «Ctrl-g» для получения дополнительной информации. – fedorqui

1

Позвольте регистрам vim выполнить эту задачу. зачем расчет линий

, например, если вы хотите скопировать строки X в линию у

1) переместить курсор на 1-го символа в строке X.

2) типа «мы». это сохранит текущую позицию курсора в регистре «a».

3) переместить курсор последнего символа строки Y.

4) типа "y`a". копия делается

5) р пасты скопированный текст

Этот метод может работать не только линии, но блок, слова даже на персонажей.

+0

Отлично! Я не знал об этом методе регистрации. Я также исправил формат в вашем коде, только крошечные вещи. Благодаря! – fedorqui

+0

, если вы хотите скопировать строку x в строку y, просто выполните ': xty' – Kent

+0

Спасибо, @Kent. То, что я получаю, это просто строка 'x', скопированная. – fedorqui