Как мне перейти к концу строки в Vim?

1195

Я знаю, как обычно перемещаться в командном режиме, в частности, переходить на строки и т. Д. Но что это за команда, чтобы перейти к концу строки, на которой я сейчас нахожусь?

salt.racer
источник
19
Основные команды vim были рассмотрены менее чем за 10 минут youtube.com/watch?v=71YTkxUNwmg
eomeroff
14
Что плохого в том, чтобы тратить несколько минут на пробежку через vimtutor? Он уже является частью вашей установки Vim и показывает вам основы.
dash-tom-bang
@ dash-tom-bang Ну, у них здесь довольно высокий балл ... :) Но да, вы правы, vimtutorэто здорово. Возможно, они не знали об этом?
Прифтан

Ответы:

2055

Просто $ (знак доллара) ключ. Вы можете использовать, Aчтобы перейти к концу строки и переключиться в режим редактирования (Добавить). Чтобы перейти к последнему непустому символу, вы можете нажать gзатем _клавиши.

Противоположностью Aявляется I(режим вставки в начале строки), в сторону. Нажатие только на ^курсор поместит курсор на первый символ строки, не являющийся пробелом.

Dvorak
источник
81
Перейти к последнему g_
непустому
2
Иногда более полезен g_вариант, так как он не содержит пустых символов
rogercampos
6
Вариант _g действительно полезен при работе в визуальном режиме, поскольку позволяет использовать строку без какой-либо новой строки в конце.
Грег Роббинс
2
В то время как клавиши Home и End работают на обычной клавиатуре, $ и ^ необходимы, когда вы используете ноутбук :)
Шридхар Сарнобат
Вы должны добавить ^ в список.
Tek
304

Как много людей сказали:

  • $ приводит вас к концу линии

но и:

  • ^или _возвращает вас к первому непробельному символу в строке, и
  • 0(ноль) возвращает вас к началу строки вкл. пробельные
Роб Уэллс
источник
Я знал | возвращает нас к началу строки, но я не знал о 0. Итак, 0 и | делать то же самое, да?
Камран Бигдели
8
@kami: хотя описания разные, похоже, они ведут себя одинаково. Однако команда pipe |может принимать значения, например, 3 | перейти к третьему столбцу.
Пол Руане
136
  • $ перемещается к последнему символу в строке.
  • g _ переходит к последнему непробельному символу.

  • g $ переходит в конец строки экрана (когда строка буфера переносится на несколько строк экрана)

Пол Руане
источник
Я чувствую, что g_ - это то же самое, что и $ b
Дэйв Аарон Смит,
3
@DaveAaronSmith: переход bк началу предыдущего слова, которое совсем не одно и то же. Это примерно эквивалентно $ge.
Пол Руане
9
Я использую _и g_для visual / yanking, так как $также будет копировать / удалять символ новой строки (LN).
Эрнест
Для меня $ идет до конца текущей строки экрана (когда обернуто). Мне не удалось понять, почему. g_это единственный путь, который я нашел, чтобы добраться до фактического конца линии.
Ezuk
@ezuk $идет до конца строки, даже когда завернутый для меня. Я не знаю никаких настроек, чтобы настроить его поведение. Возможно, он был переназначен вашим .vimrc g$?
Пол Руане
66

Главный вопрос - конец строки

$ идет до конца строки, остается в командном режиме

A идет до конца строки, переключается в режим вставки

И наоборот - начало строки (технически первый непробельный символ)

^ идет в начало строки, остается в командном режиме

I (верхний регистр i) переходит в начало строки, переключается в режим вставки

Далее - начало строки (технически первый столбец независимо от пробела )

0 (ноль) переходит в начало строки, остается в командном режиме

0i (ноль, за которым следует строчная буква i) идет в начало строки, переключается в режим вставки

Для тех, кто начинает изучать vi, вот хорошее введение в vi путем перечисления бок о бок команд vi с типичным движением курсора в Windows GUI Editor и сочетаниями клавиш.

редактор vi для пользователей Windows

ар-экранном
источник
3
Аналогом Iявляется not, 0но ^, поскольку оба Iи ^переходят к первому непробельному символу строки, но 0переходят к нулевому столбцу (как следует из его названия).
wchargin
@wchargin правда, думал, что я не могу найти то, что аналог 0будет? (перейти к первому символу (= столбец 0) строки и перейти в режим вставки)
franssu
@franssu: я знаю только об одном 0i. :-)
wchargin
@wchargin - Спасибо за техническую правильность. Я обновил пост.
ap-osd
42

Если ваша текущая строка обернута вокруг видимого экрана на следующую строку, вы можете использовать g $, чтобы добраться до конца строки экрана .

Коммодор егер
источник
3
Я только что обнаружил, что команды g make vim перед ожиданием команд вверх и вниз перемещают курсор на основе экрана, а не на основе строки. Т.е. gj и gk позволяют вам двигаться вверх и вниз по длинной линии. Действительно полезно.
Druckles
1
Также обнаружил, что ввод gw и что-то, кажется, постоянно изменяют j и k, чтобы вести себя так. Не уверен, как или почему. Кто-нибудь может объяснить это?
Druckles
4
@Druckles: немного поздний ответ, но если вам все еще интересно, (или если кто-то еще читает это), gwи gqэто команды, которые переформатируют текст. (см. :h gwи :h gq) Вероятно, произошло то, что вы сделали gw{motion}и изменили текст так, чтобы строки экрана соответствовали фактическим строкам.
pandubear
13

Во многих случаях, когда мы находимся внутри строки, мы заключены в двойные кавычки, или при написании оператора мы не хотим нажимать клавишу escape и идти до конца этой строки клавишей со стрелкой и нажимать точку с запятой ( ;) только для завершения линия. Напишите следующую строку в вашем файле vimrc :

imap <C-l> <Esc>$a

Что говорит линия? Он отображает Ctrl + l в серию команд. Это эквивалентно одновременному нажатию Esc(командный режим), $(конец строки), a(добавление).

Pramod
источник
спасибо за это. Я давно хотел добавить Ctrl-e обратно в мой vim, как и в конец строки, как на моей первой машине, и не знал как
tristanbailey
1
Как говорится в принятом ответе, вы можете нажать A, чтобы сделать то же самое.
Trysis
4
@trysis, который вы неправильно поняли, это не отходит от режима редактирования, что довольно приятно.
Маркони
2
Вы правы. vimконечно, позволяет делать гораздо больше за гораздо меньшее время с такими вещами. @razorxpress, незначительная корректировка будет imap <C-l> <Esc>A, что делает Ctrl + l равным нажатию Esc(выход из режима вставки), затем A(добавление к концу строки).
trysis
3
Я думаю, что более идиоматический способ отобразить это будетinoremap <C-l> <C-o>A
bennyty
12

Преимущество клавиши «Конец» в том, что она работает как в обычном, так и в режиме вставки.

'$' работает только в обычном / командном режиме, но также работает в классическом редакторе vi (полезно знать, когда vim недоступен).

дислокация
источник
38
Зачем ты слоняешься вокруг режима вставки ?! Ни один обычный порядочный гражданин не идет туда после дневного света. Вы знаете, что там происходит, не так ли? Код там исчезает, понимаешь? Он исчезает и больше никогда не слышен.
Ладья
3
Спасибо за это, так как мне нравится оставаться в режиме вставки, как только я вхожу в него. К сожалению, у моего ноутбука нет клавиши завершения. :(
Луч
12

Также обратите внимание на различие между линией (или, возможно, физической линией) и линией экрана . Строка заканчивается символом конца строки ("\ n"). Строка экрана - это то, что происходит в виде одной строки символов в вашем терминале или на экране. Эти два варианта расходятся, если у вас физические строки длиннее ширины экрана, что очень часто встречается при написании электронных писем и т.

Различие проявляется и в командах конца строки.

  • $и 0перейти к концу или началу физической строки или абзаца соответственно:
  • g$и g0перейти к концу или началу строки экрана или абзаца, соответственно.

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

:noremap 0 g0
:noremap $ g$
loevborg
источник
1
Как добраться до последнего без пробела строки? (будь то экранная линия или физическая линия)
Kamran Bigdely
g_это последний непробельный символ физической строки. Как насчет строки экрана?
Trysis
10

Нажмите, Aчтобы войти в режим редактирования, начиная с конца строки.

Брайан
источник
9

Или есть очевидный ответ: используйте Endключ, чтобы перейти к концу строки.

Davr
источник
1
Да, я заметил, что Mac-терминал захватывает ключи и не передает их на работу внутри терминала. Одна из вещей, которые меня раздражают, когда я немного использую Mac.
Давр
Весь смысл использования vim не в том, чтобы использовать такие ключи, как 'End'. Никогда не выходите из дома.
Джон Тороддсен
7
На Mac нет клавиши End.
Кенорб
1
@kenorb Был, когда я разместил комментарий ... но Apple любит удалять функции на протяжении многих лет. netdna.webdesignerdepot.com/uploads/2009/01/... это на самом деле одна из моих любимых клавиатур всех времен
Davr
9

Я не вижу горячей клавиши для MacBook для использования VIM в стандартном терминале. Надеюсь, это кому-нибудь поможет. Для пользователей macOS (протестировано на macbook pro 2018):

fn+ - перейти к началу строки

fn+ - перейти к концу строки

fn+ - переместить страницу вверх

fn+ - переместить страницу вниз

fn+ g - переместить курсор в начало документа

fn+ shift + g - переместить курсор в конец документа

Для последних двух команд иногда нужно нажать дважды.

Александр Юшко
источник
6

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

graywh
источник
3

Самый простой вариант - ввести $. Если вы работаете с блоками текста, вам может понравиться команда {и }для перемещения абзаца вперед и назад соответственно.

Paranza
источник
2

Я привык к Home / End, приводя меня к началу и концу строк в режиме вставки (от использования в Windows и, я думаю, в Linux), который Mac не поддерживает. Это особенно раздражает, потому что когда я использую vim в удаленной системе, я также не могу легко это сделать. После некоторых мучительных проб и ошибок я придумал эти .vimrcстроки, которые делают то же самое, но привязаны к Ctrl-A для начала строки и Ctrl-D для конца строки. (По некоторым причинам, Ctrl-E, я думаю, зарезервирован или, по крайней мере, я не мог найти способ связать его.) Наслаждайтесь.

:imap <Char-1> <Char-15>:normal 0<Char-13>
:imap <Char-4> <Char-15>:normal $<Char-13>

Здесь есть хорошая диаграмма для кодов управляющих символов ASCII и для других:

http://www.physics.udel.edu/~watson/scen103/ascii.html

Вы также можете сделать Ctrl-V + Ctrl-, но это не так хорошо вставляется в такие места.

Маркус
источник