2014-01-07 7 views
5

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

Я бы хотел использовать VIM для написания документов для некоторых классов, в которых я участвую. Проблема, с которой я сталкиваюсь, - это форматирование строк в редакторе. Если я не явным образом нарушаю конец строки с помощью клавиши ввода, когда я пытаюсь переместить курсор через текст, он пропускает несколько строк, если у меня есть предложение, которое охватывает более одной строки. Есть ли способ сделать это так, чтобы курсор мог перемещаться по тексту, близкому к тому, как он работает в большинстве текстовых процессоров?

+1

Дополнительная информация здесь в дополнение к ответам: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping –

ответ

3

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

:set nowrap 
+0

Приятно, вот и все. Благодарю. –

+1

Я также рекомендую ': установить textwidth = 80' для автоматической обертки строк. – Max

+0

Эта команда, похоже, ничего не делает, но я понимаю, почему вам нужно что-то подобное. Любая идея, почему это может не работать для меня? –

6

Это потому, что по умолчанию j и k движения двигаться по физическим линиям, не видимая, мягкая обернутым экран линии (когда вы есть :set wrap). Вы можете использовать команды gj и gk.

Если вы хотите по умолчанию это поведение, вы можете переназначить кнопки по умолчанию, помещая это в ваш ~/.vimrc:

noremap j gj 
noremap k gk 
+0

Спасибо. Я это сделаю. –

25

Проблема с часто используемой опцией

noremap j gj 
noremap k gk 

в том, что он разбивает функциональность <vcount>, если у вас есть строки в тексте, которые охватывают несколько строк.
Пример: вы хотите 10k (перейдите на 10 строк), потому что вы используете относительные числа на боковой панели, но это многострочный с высотой 4 строки. Поэтому вы оказываетесь эффективно на 6 линиях (6k) над вашей желаемой строкой, которую вы читаете из ваших относительных чисел. Вам придется вычислять вручную! Раздражающе ... Особенно, если у вас несколько многострочных между вашим текущим положением и вашим желаемым положением - не Vim- istic!

Мне нравится моя <vcount> функция вместе с моим :relativenumber, поэтому я написал следующие функции: & отображение, чтобы решить все проблемы, связанные с этим.
Эти функции позволяют использовать такие команды, как 10j или 10k, как и ожидалось, несмотря на наличие мультилиний со всеми преимуществами использования gj и gk как ваши отображения движения по умолчанию:

Edit: Я просто нашел следующее на reddit, что намного лучше, чем мое собственное решение.Это кратчайший возможный вариант:

nnoremap <expr> j v:count ? 'j' : 'gj' 
nnoremap <expr> k v:count ? 'k' : 'gk' 

"Longer" версия для лучшего понимания и полноты:

nnoremap <expr> k (v:count == 0 ? 'gk' : 'k') 
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j') 

Источник:http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/


Мой старый раствор:

nnoremap <silent> j :<C-U>call Down(v:count)<CR> 
vnoremap <silent> j gj 

nnoremap <silent> k :<C-U>call Up(v:count)<CR> 
vnoremap <silent> k gk 

function! Down(vcount) 
    if a:vcount == 0 
    exe "normal! gj" 
    else 
    exe "normal! ". a:vcount ."j" 
    endif 
endfunction 

function! Up(vcount) 
    if a:vcount == 0 
    exe "normal! gk" 
    else 
    exe "normal! ". a:vcount ."k" 
    endif 
endfunction 
+0

Есть ли способ сделать это горизонтально? – f1lt3r

Смежные вопросы