Я визуально выбираю блок кода (scss) в Vim и пытаюсь переместить его так, чтобы он отображался после строки 6.

После визуального выбора строк я использую следующую команду: m -6

Однако на самом деле линии не перемещаются, как я ожидал. Смотрите этот Gif результата:

enter image description here

Видите ли вы, как результат заканчивается выручка? Мое понимание состоит в том, что команда move должна перемещать блок выбранного кода после указанной линии?

Таким образом, после команды перемещения код будет выглядеть так:

&.on-Grey_C7 {

}
&.on-Grey_BB {
    border: 1px solid brighten($color-yellow, -31);
}

Что я делаю не так?

vim
1
Ben Frain 8 Сен 2014 в 15:26
Чтобы переместить блок после определенного номера строки на самом деле: m {line-number}. В вашем случае это будет m 6 после выбора блока. это полезно прочитать
 – 
DOOM
8 Сен 2014 в 15:48

2 ответа

Лучший ответ

Даже если вы создали линейное визуальное выделение сверху вниз и ваш курсор находится в строке 173, когда вы выполняете команду Ex (например, :move) в диапазоне, курсор вернется в начало выбор (например, строка 171), и, следовательно, ваше смещение неверно ('<,'>m -4 верно).

Чтобы избежать необходимости мысленно настраивать смещение, вы можете использовать команду o в визуальном режиме (перед вводом командной строки с помощью :), чтобы переместить курсор в начало выделения.

3
Ingo Karkat 8 Сен 2014 в 15:50
Где курсор в визуальном выборе никак не влияет на перемещение. то есть с нажатием o или без него при визуальном выборе он приводит к одному и тому же результату.
 – 
Kent
8 Сен 2014 в 16:24
Отлично, теперь понятно, почему он это делает, спасибо. Однако даже сейчас я понимаю, что это все еще кажется мне немного «неправильным» и неинтуитивным. Есть ли какие-то преимущества в том, что Vim работает таким образом? В качестве связанного вопроса можно ли перехватить команду перемещения в этом контексте, чтобы она автоматически выполняла корректировку?
 – 
Ben Frain
8 Сен 2014 в 16:28
@Kent: Да, но перемещение курсора позволяет избежать учета этого явления; с 'relativenumber' вы можете просто прочитать количество строк для перемещения.
 – 
Ingo Karkat
8 Сен 2014 в 16:31
Я думаю, что это имеет преимущества для макросов и отображений, чтобы начать с последовательной позиции. Вы можете определить пользовательскую команду :Move, которая учитывает это, но я бы рекомендовал просто принять это, так как это влияет и на другие команды.
 – 
Ingo Karkat
8 Сен 2014 в 16:32
Ой, кажется, я неправильно понял ваш ответ... вы имели в виду от "текущего" ln - смещение. Ты прав.
 – 
Kent
8 Сен 2014 в 16:32

Все сработало правильно, вы плохо поняли адрес.

:'<,'>m -6

Перемещает ваш блок под строку с номером (your 1st selected line number -6)

В вашем случае номер вашей первой выбранной строки - 171, поэтому ваша заблокированная строка была перемещена под строку: 171-6 = 165, которая начинается с 166. vim делает это в точности правильно.

В вашем случае вам следует сделать:

:'<,'>m 6

Который перемещает ваш блок под линию (абсолютная строка #) 6

Чтобы понять адрес, :h address Вы также можете открыть новый буфер, выполнить !!seq 20, а затем немного поиграть.

1
Kent 8 Сен 2014 в 16:21