LINUX.ORG.RU

Пара вопросов по использованию vim

 


2

1

Добрый вечер.

У меня четвёртое по счёту сильное желание использовать vim. Примерно каждый год обострение.

Пытаюсь спрыгнуть со scite.

1. Если курсор в конце строки, как сделать переход на начало следующей при нажатии «l», и обратно при нажатии «h»?

2. В файлах, которые приходится править, иногда встречаются очень длинные строки. В скайте есть киллер-фича (имхо, потому что больше нигде не встречал) под названием «wrap.aware.home.end.keys» (http://www.scintilla.org/SciTEDoc.html). Это когда при нажатии «End» курсор прыгает на конец отображаемой (виртуальной) строки, а при повторном нажатии - перемещается в конец реальной строки. (Обратное действие на «Home»). Можно ли замутить подобное поведение в vim'е?

2.1 Можно ли перемещаться по отображаемой (внутри одной физически) строке клавишами «j» и «k»?

(∞ - 1). Не нужно, но всё-таки, можно ли как-нибудь, в исключительных случаях, закончить файл без перевода строки в конце?

∞. По умолчанию пальцы правой руки находятся на клавишах «j, k, l, ;». Что делать в командном режиме. Перетаскивать всю руку на одну клавишу влево и привыкать жать «l» мизинцем? Или жать и «h» и «j» указательным?

(поместил в development ибо в 99% случаев приходится править исходники).


2. Перемещение по отображаемой - gj и gk, перемещение в начало линии - g^, в конец - g$. То есть все то же, что для реальных строк, но с префиксом g

keyran ★★
()

2.1 Можно ли перемещаться по отображаемой (внутри одной физически) строке клавишами «j» и «k»?

Нет, зачем? Это вообще перевернуто с головы на ноги. Противоречит базовой идеологии вима.

Для этого есть w, e, b, f, F, t - и так далее.

2. В файлах, которые приходится править, иногда встречаются очень длинные строки. В скайте есть киллер-фича (имхо, потому что больше нигде не встречал) под названием «wrap.aware.home.end.keys» (http://www.scintilla.org/SciTEDoc.html). Это когда при нажатии «End» курсор прыгает на конец отображаемой (виртуальной) строки, а при повторном нажатии - перемещается в конец реальной строки. (Обратное действие на «Home»). Можно ли замутить подобное поведение в vim'е?

Есть, это называется: 0 - начало строки реальной, ^ - первый печатаемый символ. В конец g_ и A соотв.

При повторном нажатии - можно настроить, но это поломает всё остальное.

Короче, вим всё может, ты почитай литературу или посмотри видосы.

Посоветовать?

science ★★☆
()

1.Опция whichwrap

К примеру, set whichwrap=b,<,>,[,],l,h - перемещать курсор на следующую строку при нажатии на клавиши вправо-влево и пр.

keyran ★★
()
Последнее исправление: keyran (всего исправлений: 1)
Ответ на: комментарий от science

Так же, как и для обычных строк. Если строка разбита на несколько линий, то просто j перейдет на следующую строку, а gj на следующую линию( под курсором) той же строки, или просто на следующую строку.

keyran ★★
()

По умолчанию пальцы правой руки находятся на клавишах «j, k, l, ;»

всё-же по умолчанию это h , j , k , l

в чем проблема мизинцем на правый шифт? Ты ведь не поднимаешь и не смещаешь кисть, всего лишь слегка поворачиваешь. С этим не должно быть проблемы.

science ★★☆
()
Ответ на: комментарий от keyran

2. Перемещение по отображаемой - gj и gk, перемещение в начало линии - g^, в конец - g$. То есть все то же, что для реальных строк, но с префиксом g

Класс ) . Спасибо. И так и сяк запросы гуглу составлял, но так и не нашёл ничего подобного.

vIM
() автор топика
Ответ на: комментарий от science

При повторном нажатии - можно настроить, но это поломает всё остальное.

Ок. Повторное нажатие в конец не критично. Отучусь. Перемещения вниз/вверх по виртуальным строкам мне будет достаточно.

Посоветовать?

Эх. Я бы с огромным удовольствием посмотрел. Но мой английский очень плох. Даже тех. литературу читаю с пачкой словарей.

vIM
() автор топика
Ответ на: комментарий от keyran

1.Опция whichwrap
К примеру, set whichwrap=b,<,>,[,],l,h

Да. Это оно. Ещё раз спасибо.

vIM
() автор топика
Ответ на: комментарий от vIM

Перемещения вниз/вверх по виртуальным строкам мне будет достаточно.

попробуй пока так конечно, раз привык, но это не идиоматически для vim'а. гораздо удобнее перемещатся «на три слова вправо» или «ко второй букве z» или «в начало следующего предложения».

val-amart ★★★★★
()
Ответ на: комментарий от science

всё-же по умолчанию это h , j , k , l

Это в vim'e. На клавиатурах есть засечки именно для указательных пальцев. Хотя можно привыкнуть и к h , j , k , l.

в чем проблема мизинцем на правый шифт? Ты ведь не поднимаешь и не смещаешь кисть, всего лишь слегка поворачиваешь. С этим не должно быть проблемы.

Проблема не с шифтом а с обычными клавишами.

Я просто заметил за собой что часто делаю по разному. В командном режиме перемещаю всю руку на h , j , k , l, а в текстовом назад на j , k , l, ; . И из-за этого путаюсь. Оттягиваю указательный палец и нажимаю, g думая что там h (и наоборот). Частенько вообще забываю в каком я режиме (часто приходится править файлы по мелочи, прыгать по режимам), Надеюсь со временем пройдёт, но хотелось бы узнать что делают прожжённые vim'еры?

vIM
() автор топика

В файлах, которые приходится править, иногда встречаются очень длинные строки.

в 99% случаев приходится править исходники

Серьезно, я бы начал отсюда.

unlog1c ★★★
()
Ответ на: комментарий от val-amart

попробуй пока так конечно, раз привык, но это не идиоматически для vim'а. гораздо удобнее перемещатся «на три слова вправо» или «ко второй букве z» или «в начало следующего предложения».

Да, тут у меня большие проблемы. Я слов не вижу ) . Одни только разнообразные скобочки, математические знаки, да кавычки ) . И все приклеены к друг-другу как попало, и с первого взгляда не могу определить, слово это или пачка склеенных полу-слов.

vIM
() автор топика
Ответ на: комментарий от unlog1c

Серьезно, я бы начал отсюда.

Увы. Очень маленькая конторка с постоянной текучестью кадров. Я единственный кто сидит тут уже около 7-и лет, и в последние годы только и приходится поправлять (дополнять костылями да подпорками) чужие исходники.

vIM
() автор топика

Как успехи? Я тоже неосилятор. Поставил сегодня на работе. Элементарная правка пару слов заняла чертову уйму времени. Расстроился, пошел обратно в geany :(

coderage
()
Ответ на: комментарий от coderage

Как успехи?

В этот раз я не поленился, и поставил заглушки в ~/bin/mcedit на всех серверах и ~/bin/scite на рабочих и домашних компах ) . И вот уже третий день использую исключительно вим.

Я тоже неосилятор. Поставил сегодня на работе. Элементарная правка пару слов заняла чертову уйму времени. Расстроился, пошел обратно в geany :(

Так же. Вроде можно и в vim'е поправить, но когда что-то горит и надо сделать быстро, начинал использовать привычные mcedit да scite.

В этот раз я подготовился, выбрал самое тихое время года. И сегодня совершил подвиг — во время несанкционированной жопы воспользовался vim'ом вместо /usr/bin/mcedit ! Добавить в конфиг одну строчку это конечно пустяк, но даже эта мелочь меня дополнительно вдохновила.

vIM
() автор топика
Ответ на: комментарий от vIM

для таких случаев есть W, B и E — работает как w, b и e только слова считает по пробельным символам, т.е. для lowercase команд строка «omg that's — I don't know, cute? ehh.» это 14 «слов» а для uppercase — только 7.

еще есть очень полезная команда «%», переходит на matching parenthesis, т.е. прыгает по парным скобкам. вообще именно обилие всяких прикольных команд для перемещения курсора имхо одно из главных преимуществ ви — когда их осиливаешь даже на 30%, навигация по файлу и скорость редактирования ростут _неимоверно_.

а вообще надо нормально форматировать код, вот.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

для таких случаев есть W, B и E — работает как w, b и e только слова считает по пробельным символам, т.е. для lowercase команд строка «omg that's — I don't know, cute? ehh.» это 14 «слов» а для uppercase — только 7.
еще есть очень полезная команда «%», переходит на matching parenthesis, т.е. прыгает по парным скобкам. вообще именно обилие всяких прикольных команд для перемещения курсора имхо одно из главных преимуществ ви — когда их осиливаешь даже на 30%, навигация по файлу и скорость редактирования ростут _неимоверно_.

Постараюсь запомнить. Но честно говоря пока даже в приведённом примере не понимаю как можно быстро соорентироваться и нажать нужную цифру для перехода. Я пока чуть-ли не пальцем по экрану вожу (и ведь водил!) чтобы сделать Ndd или Nyy.

а вообще надо нормально форматировать код, вот.

Это обязательно. Но увы. Так уж получилось что приходится чаще поправлять чем писать. Когда сам пишу что-то, то стараюсь делать побольше пробелов везде где можно: между арифметическими действиями, после запятых в перечислениях, и т. д. Но народ разный, у многих есть «очень веские» аргументы против. Спорить не могу, ибо и по всякому — правильно. И лишние пробелы и хорошо и плохо (и не хорошо и не плохо).

vIM
() автор топика

У меня четвёртое по счёту сильное желание использовать vim. Примерно каждый год обострение.

Это очень гут.

1. Если курсор в конце строки, как сделать переход на начало следующей при нажатии «l», и обратно при нажатии «h»?

Не скажу, ибо это неправильно. vim = hjkl.

В принципе, подвох в том, что «обратно» - это в середину строки. Нетрудно написать функцию, которая будет запоминать текущую позицию и двигать курсор в начало следующей строки, и другую, которая будет возвращать. Придумаете сочетания клавиш (и для какого ещё режима) - посмотрим. ;)

2. В файлах, которые приходится править, иногда встречаются очень длинные строки. В скайте есть киллер-фича (имхо, потому что больше нигде не встречал) под названием «wrap.aware.home.end.keys» (http://www.scintilla.org/SciTEDoc.html). Это когда при нажатии «End» курсор прыгает на конец отображаемой (виртуальной) строки, а при повторном нажатии - перемещается в конец реальной строки. (Обратное действие на «Home»). Можно ли замутить подобное поведение в vim'е?

Лехко.

В vimrc можете поместить следующее:

function GoToEnd()
    let oldcol = getpos(".")[2]
    normal! g$
    if getpos(".")[2] == oldcol
        normal! $
    endif
endfunction

nnoremap <silent> <End> :call GoToEnd()<CR>

Могу пояснить, если надо. Однако лучше добавлять это не в vimrc, а в плагин для соответствующего типа файлов.

Ещё вам надо подумать, как вы будете вообще по таким длинным строкам передвигаться, потому что по факту jk в пролёте. End - вообще неудобная клавиша. В принципе, можно переназначить

nnoremap j gj
nnoremap k gk
nnoremap $ g$
nnoremap 0 g0
чтобы клавиши работали с визуальными строками, однако это я тем более делал бы для конкретных типов файлов и добавил бы <buffer>, чтобы переназначалось для отдельных буферов.

2.1 Можно ли перемещаться по отображаемой (внутри одной физически) строке клавишами «j» и «k»?

Нельзя. Не невозможно, а не полагается.

(∞ - 1). Не нужно, но всё-таки, можно ли как-нибудь, в исключительных случаях, закончить файл без перевода строки в конце?

Гм. Никогда не думал о.

∞. По умолчанию пальцы правой руки находятся на клавишах «j, k, l, ;». Что делать в командном режиме. Перетаскивать всю руку на одну клавишу влево и привыкать жать «l» мизинцем? Или жать и «h» и «j» указательным?

Жать указательным. (Вообще, вим подразумевает слепой набор. Не верьте тем, кто говорит, что надо сдвигать пальцы, верьте пупырышкам на клаве.)

(поместил в development ибо в 99% случаев приходится править исходники).

А я настоящий ответ тоже в виме написал.

anonymous
()
Ответ на: комментарий от science

А я все время забываю, а копать лень. 11w и почти попал же.

anonymous
()

(∞ - 1). Не нужно, но всё-таки, можно ли как-нибудь, в исключительных случаях, закончить файл без перевода строки в конце?

Вроде как-то удалял '$': то ли virtualedit=onemore, но там еще что-то должно было быть, сейчас того конфига под рукой нема. А так: 1) :e ++bin, 2) :se noeol, 3) :w .

anonymous
()
Ответ на: комментарий от Carabas

Можешь что-нибудь подсказать, чтобы осилить средний уровень?

Не только средний, но и практический профессиональный: [Pragmatic Bookshelf] - Practical Vim - [Drew Neil] (он же некто nelstorm, автор vimcasts.com, предисловие к книге и бесценные комментарии написал легендарный Tim Pope :) )

// если не найдешь в междусетях - могу дать почитать.

science ★★☆
()

∞. По умолчанию пальцы правой руки находятся на клавишах «j, k, l, ;». Что делать в командном режиме. Перетаскивать всю руку на одну клавишу влево и привыкать жать «l» мизинцем? Или жать и «h» и «j» указательным?

Я обычно перетаскиваю, благо не так далеко, как до стрелок

BlackHawk
()
Ответ на: комментарий от vIM

Надеюсь со временем пройдёт, но хотелось бы узнать что делают прожжённые vim'еры?

Это пройдёт.

science ★★☆
()
Ответ на: комментарий от val-amart

дурацкие отговорки диванных евангелистов в стиле $это_не_нужно, поэтому и нет. или у евангелистов моск в буфер мапится и глоза с прочими чувствами им не нужны? при попытках использовать имакс, следую его «путям», создается именно такое впечатление.

перемещаться по «виртуальным» строкам удобно. точка. ничему это не противоречит. а префиксировать каждое нажатие g это для упоротых. один раз забудешь и курсор улетит куда-нибудь на два экрана вниз. зато православно, да.

anonymous
()
Ответ на: комментарий от vIM

как можно быстро соорентироваться и нажать нужную цифру для перехода

ну, если честно то когда цифра относительно большая, скажем, больше пяти, то я лично просто на глаз приблизительно тыкаю, потом проще на пару N вправо-влево сместиться чем сразу точно считать. как в гольфе ;)

Я пока чуть-ли не пальцем по экрану вожу (и ведь водил!) чтобы сделать Ndd или Nyy.

:set number

И лишние пробелы и хорошо и плохо (и не хорошо и не плохо).

главное — единообразие в пределах одной кодовой базы. договоритесь и примите coding standard. не важно какой он именно, важно что он есть и весь код одинаковый. старый код практически всегда можно подогнать под заданное форматирование автоматическими инструментами.

val-amart ★★★★★
()
Ответ на: комментарий от anonymous

ты сам себе противоречишь. сначала рассказываешь что перемещатся удобно, потом — насколько это упорото и неудобно.

факт — в виме это делать неудобно и неестественно.

один раз забудешь и курсор улетит куда-нибудь на два экрана вниз

:help ``
^O

val-amart ★★★★★
()
Ответ на: комментарий от coderage

после вима обычные редакторы кажутся неполноценными. что блокнот, что имакс.

anonymous
()
Ответ на: комментарий от val-amart

потом — насколько это упорото и неудобно.

у тебя синдром рассеянного внимания? я написал, что упорото - это как по дефолту в виме. т.е. не ходить по display lines без g перед каждым j и k.

а скакать по потенциально растянутым на неск. экранов строкам - конечно это так удобно без display lines. вот я и поинтересовался - евангелисты они может уберменьши какие и им неведомы проблемы смертных? хотя они на самом деле просто так решили и проповедуют (а с use-case'ами тупо не сталкивались, но хоть в тырнет бы посмотрели, сколько там про сиё. даже имакс умеет, лол), но я этого не говорил.

P.S. staunch vim advocate here

anonymous
()
Ответ на: комментарий от val-amart

^O

и попадешь в начало строки. которая может занимать видимых строк... wait, мы это уже проходили. но тебе пофиг.

anonymous
()
Ответ на: комментарий от val-amart

Аноним сверху вон «настоящий ответ тоже в виме написал», а в таком случае в 80 колонок явно не будешь влезать.

anonymous
()
Ответ на: комментарий от vIM

Постараюсь запомнить. Но честно говоря пока даже в приведённом примере не понимаю как можно быстро соорентироваться и нажать нужную цифру для перехода. Я пока чуть-ли не пальцем по экрану вожу (и ведь водил!) чтобы сделать Ndd или Nyy.

Вот это. https://github.com/myusuf3/numbers.vim

Вместо нумерации строк от начала файла, нумерует в две стороны от курсора (строка с курсором нулевая).

Kuzy ★★★
()
Ответ на: комментарий от anonymous

ну и что? я тоже ответы пишу с использованием vikeys. брат жив.

val-amart ★★★★★
()
Ответ на: комментарий от Kuzy

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

Есть же H, M, L и т.д. Не нужно ничего считать.

science ★★☆
()
Ответ на: комментарий от science

Идеология вима — точное и быстрое позиционирование. Это разжевывается во всех материалах, которые ты советуешь (!). Так что иди в жопу со своими HML.

anonymous
()
Ответ на: комментарий от anonymous

К нужному месту можно пройти быстрее - ничего не считая. Именно это разжевывается во всех материалах, которые я советую.

science ★★☆
()
Ответ на: комментарий от Kuzy

такое есть встроенное. но не показывает вместе с нормальными номерами.

anonymous
()
Ответ на: комментарий от vIM

Но честно говоря пока даже в приведённом примере не понимаю как можно быстро соорентироваться и нажать нужную цифру для перехода.

Не надо нажимать никакие цифры. Скорее цифры могут пригодиться в мапах, макросах или скриптах.

Можно вообще покурить справку по навигации :help navigation. Вместо стрелок используем hjkl - это удобнее и хорошо приспособлено для небольших передвижений. (Если постоянно длинные строки, никто не запрещает перебиндить их на gj и gk, но совсем рушить вимовскую интуицию не следует: она сама по себе культовая и поэтому проникла и в другой софт, например, вимператор или там mupdf). Если быстрее листать - C-f, C-b, C-d. Можно перемещаться по абзацам {, }, по предложениям (, ), по словам и «обобщённым словам» (w/b, W/B, e/E). Можно передвигаться по парным скобкам %. Можно передвигаться по меткам. Удобно передвигаться с помощью поиска - /, * (слово под курсором вперёд), # (слово под курсором назад), f/F, ;/, - поиск символа в строке. Чего я ещё забыл?

Здесь главное навык, автоматизм. Понятно, что не всё сразу, и нужно время. К тому же необязательно каждому пригодится весь набор команд - как там, каждый использует 10% вима, но у каждого это свои 10%.

anonymous
()
Ответ на: комментарий от anonymous

А, вот что точно забыл: можно передвигаться по местам правок g;

anonymous
()
Ответ на: комментарий от science

Отлично, сам придумал про счет, сам спорит, разупорись. relnum как раз и избавляет от счета.

anonymous
()
Ответ на: комментарий от science

Omg. ТС, фильтруй инфу от этого дурочка (science), он несколько фанатичен, предложение об использовании relnum, воспринимает как необходимость счета. Сейчас еще начнет вундль пропихивать.

anonymous
()

пройди vimtutor, тем более что он по-умолчанию присутствует

anonymous
()
Ответ на: комментарий от science

Есть же H, M, L и т.д. Не нужно ничего считать.

Если у тебя в буфере 7 строк, то согласен. Иначе нет. Или я чего-то не знаю?

Kuzy ★★★
()
Ответ на: комментарий от Carabas

осилить средний уровень?

«a byte of vim» мне понравилась, также vimtutor

IvanR ★★★
()
Ответ на: комментарий от Kuzy

Наоборот, работает лучше именно на полном буфере во весь экран.

Попадаешь в нужную часть экрана (High, Medium или Low), а дальше уже, находясь курсором на нужной 1/3 части буфера - легко попасть куда нужно.

Есть несколько вариантов, короткий счет строк в разумных рамках (до 3-4, но никак не больше), либо же быстрая центровка строки по курсору (попробуй, может понравится):

nnoremap <C-j>       4jzz
nnoremap <C-k>       4kzz
что лично я нахожу более быстрым и удобным, но возможно анонимусу это не понравится.

А далее, находясь на нужной строке (если раньше, не находясь на ней, нельзя было попасть в нужное место по f), можно уже f, w, e, t и так далее.

Кстати в середину строки (не экранной по gm, а текстовой) можно попасть так:

map gm :call cursor(0, virtcol('$')/2)<CR>

Находясь на нужной 1/3 экрана довольно легко можно попасть в любое место.

science ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.