gvim: заставить ‹S-Up›, ‹S-Down› перемещаться по строкам экрана

Я решил использовать gvim в качестве основного текстового редактора, но все же хотел бы, чтобы он вел себя как другие визуальные редакторы, к которым я привык. Одним из аспектов этого является то, что когда я включил перенос (set linebreak) и использую клавиши со стрелками <Up> и <Down> в режиме вставки, я хотел бы переместить курсор на предыдущую/следующую строку экрана, а не логическая линия. Это может быть достигнуто с помощью отображений:

inoremap <Up>   <C-O>gk
inoremap <Down> <C-O>gj

... и все в порядке.

За исключением режима выбора. При использовании <S-Right> <S-Left> работает как положено, <S-Up> и <S-Down> по-прежнему перемещаются с точки зрения логических строк. На http://vim.wikia.com я нашел следующее предложение по дополнительным сопоставлениям:

noremap  <S-Up>     vgk
noremap  <S-Down>   vgj
inoremap <S-Up>     <C-O>vgk
inoremap <S-Down>   <C-O>vgj

Два последних сопоставления теперь позволяют, когда я начинаю выделение, нажимая <S-Down> в режиме вставки, я получаю выделение из предыдущей позиции в ту же позицию в следующей строке экрана. Но когда у меня уже есть выделение (уже нахожусь в режиме выбора), нажатие <S-Down> перемещает на одну строку вниз, но теряет выделение.

Я ожидал, что для этого потребуется специальное сопоставление для режима выбора (snoremap), но я не смог понять, как это сделать.


Из-за дискуссии с glts о том, бесполезен ли режим выбора или нет, возможно, некоторая справочная информация уместна: режим выбора, по-видимому, является попыткой vim обеспечить что-то близкое к поведению выбора, используемому в большинстве других визуальных редакторов в MS Windows, Mac OS, и даже Linux, который, в свою очередь, основан на CUA от IBM. Поскольку он действительно полезен только с сопутствующими раскладками клавиатуры ^C, ^X, ^V, он предназначен для использования в сочетании с mswin.vim, который обеспечивает эти сопоставления. Мой вопрос мотивирован попыткой дополнить эти сопоставления таким образом, чтобы режим выбора работал должным образом и для обернутого текста.


person A. Donda    schedule 07.09.2013    source источник
comment
Теоретически этот вопрос относится к суперпользователю. Тем не менее, большинство вопросов о vim на stackexchange, по-видимому, относятся к stackoverflow, поэтому я тоже разместил здесь свой.   -  person A. Donda    schedule 08.09.2013
comment
В Vim режим выделения называется Визуальный режим. (У Vim есть кое-что еще, называемое режимом выбора, но вы можете сразу же забыть о нем, так как на практике он практически бесполезен.) Вы можете создавать сопоставления визуального режима, используя :xnoremap.   -  person glts    schedule 08.09.2013
comment
@glts есть ли причина использовать xnoremap вместо vnoremap?   -  person FDinoff    schedule 08.09.2013
comment
@FDinoff Принцип наименьшего удивления? :xnoremap предназначен специально для визуального режима, :vnoremap предназначен как для визуального режима, так и для режима выбора, что вряд ли когда-либо подходит. :h mapmode-x имеет предупреждение о возможной путанице.   -  person glts    schedule 08.09.2013
comment
Уважаемый @glts, я уверен, что имею в виду режим Select. :-)   -  person A. Donda    schedule 08.09.2013
comment
Труднее заставить Vim вести себя как другие редакторы, чем приспособиться к тому, как он работает. Большая часть его силы проистекает непосредственно из его другой конструкции: отказ от этой разницы ни к чему не приведет.   -  person romainl    schedule 08.09.2013
comment
@romainl — Почему вимерам всегда приходится читать лекции другим о том, как правильно поступать? Это чрезвычайно раздражающее поведение, которого я раньше не видел ни в одном другом программном обеспечении. У меня есть мои причины для выбора vim, и у меня есть мои причины, по которым я не хочу использовать его так, как vim. Сила vim заключается в том, что он чрезвычайно настраиваемый и программируемый, а не в том, что он не использует режим вставки. И моя сила проистекает из того, что мне не всегда приходится перезагружать двигательную систему при переключении между разными программами. Серьезно, что это?!   -  person A. Donda    schedule 30.09.2013
comment
Вы можете ошибаться сколько угодно, это не помешает людям, которые знают лучше (потому что они были так же неправы, как и вы когда-то), сказать вам, что вы ошибаетесь.   -  person romainl    schedule 30.09.2013


Ответы (2)


Для режима выбора, если вы на самом деле имеете в виду это, будут работать следующие сопоставления:

vnoremap <S-Up>   gk
vnoremap <S-Down> gj
imap     <S-Up>   <Esc>gh<S-Up>
imap     <S-Down> <Esc><Right>gh<S-Down>
nmap     <S-Up>   gh<S-Up>
nmap     <S-Down> gh<S-Down>

Обратите внимание на команду gh (режим выбора) вместо v (визуальный режим).

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

Визуальный режим гораздо мощнее, так как помимо замены текста, вы также можете вставить его в регистр, сделать его прописным или строчным, изменить степень визуального выделения и т.д. и т.п. Взгляните на :h vim-modes.

person glts    schedule 08.09.2013
comment
Большое спасибо, gls! Я не уверен, что понял все детали, но ваше решение работает. После того, как я разместил вопрос, я придумал собственное решение, см. Мой собственный ответ. Если у вас есть минутка, я был бы заинтересован в ваших комментариях относительно достоинств вашего и моего подхода. - person A. Donda; 08.09.2013
comment
Что касается серьезного пользователя, я могу заверить вас, что я совершенно серьезен. :) Но я должен отметить, что (в комментариях к SO и в других местах) я обнаружил тревожную тенденцию среди экспертов по vim: они, кажется, воображают, что есть только один способ правильно использовать редактор, и все иначе заблуждается. Хотя это может быть глубоко прочувствовано, я бы призвал экспертов vim быть менее откровенными по этому поводу, потому что, честно говоря, это немного снисходительно, а также просто неправильно. Я могу настроить пользовательский интерфейс, чтобы он соответствовал привычкам, сформированным в другом месте, и по-прежнему использовать возможности vim, в данном случае просто используя визуальный режим, если он лучше подходит. - person A. Donda; 08.09.2013
comment
@A.Donda Конечно, каждый поступает так, как ему удобно. Некоторым людям нравится использовать операторы для редактирования, в то время как другие делают то же самое в визуальном режиме, потому что они предпочитают визуальную обратную связь визуального режима. Оба метода, конечно, прекрасно! Однако в случае с режимом выбора я остаюсь при своем утверждении: режим выбора имеет просто только недостатки и никаких преимуществ по сравнению с визуальным режимом; Визуальный режим может делать то же самое, что и режим выбора, и намного больше. - person glts; 08.09.2013
comment
Практически в любом другом редакторе (хорошо, кроме vi, Emacs, joe) я делаю выделение либо мышью, либо с помощью клавиш Shift-стрелка. Насколько я знаю, это известно как поведение, соответствующее CUA. Соответствующий режим в vim — это режим выбора, а не визуальный режим. – У моих рук около 20 лет практики выполнения этих движений, и я использую их каждый день в других местах, например. встроенный редактор MATLAB или окно создания Gmail в Chrome. Конечно, визуальный режим мощнее, но в большинстве случаев мне эта мощь не нужна. Почему я всегда должен переключаться? - person A. Donda; 08.09.2013
comment
@A.Donda Хорошо, это справедливо. Я так пренебрегал режимом выбора, что даже не знал, что его можно использовать с Ctrl-C, Ctrl-X, Ctrl-V... спасибо! - person glts; 08.09.2013
comment
Пришлось пересмотреть комментарий, потому что не хватило места... Спасибо за рассмотрение проблемы, которая, по вашему мнению, не имеет смысла! - person A. Donda; 08.09.2013

Вот что я придумал сам:

Сделайте так, чтобы <Up> и <Down> перемещались на предыдущую/следующую строку экрана. (В режиме вставки <C-O> переключается в обычный режим для одной команды. В обычном режиме gj и gk — это команды «перемещение по строке экрана».)

inoremap <Up>       <C-O>gk
inoremap <Down>     <C-O>gj

То же самое для <S-Up> и <S-Down> в режиме вставки, переходя в режим выбора. (В обычном режиме v входит в визуальный режим. gj и gk также работают в визуальном режиме. В визуальном режиме <C-G> входит в режим выбора.)

inoremap <S-Up>     <C-O>vgk<C-G>
inoremap <S-Down>   <C-O>vgj<C-G>

То же самое для <S-Up> и <S-Down> в режиме выбора. (В режиме выбора <C-O> переключается в визуальный режим для одной команды.)

snoremap <S-Up>     <C-O>gk
snoremap <S-Down>   <C-O>gj
person A. Donda    schedule 08.09.2013
comment
Теперь я вижу! Узнал здесь что-то новое, я не знал, что вы можете использовать <C-O> в режиме выбора. - person glts; 08.09.2013