Предотвращение повторного использования клавиш движения hjkl в vim - PullRequest
19 голосов
/ 02 февраля 2012

Поскольку я часто не использую отличные движения и текстовые объекты, которые предоставляет vim, (а поскольку «Удерживание 'j' - это анти-шаблон vim," ), я бы хотел, чтобы vim помогите мне в обучении использовать их вместо использования hjkl несколько раз подряд.

Когда я начал использовать vim, меня раздражало, что я не использовал hjkl для перемещения, а вместо этого использовал клавиши со стрелками. В качестве напоминания не делать этого я переназначил клавиши со стрелками, чтобы не использовать их - я знал, что использование домашнего ряда для навигации будет лучшим долгосрочным планом, поэтому я вырезал положительное подкрепление, которое получу, имея рабочую стрелку ключи.

map <left> <nop>   
map <right> <nop>  
# I quickly removed nop's for up and down because using 
#  the mouse wheel to scroll is sometimes useful

Мне больше не нужны эти сопоставления в моем .vimrc, потому что это работало очень хорошо, и я быстро переключился, не делая сознательных усилий для этого. Аналогичным образом, теперь я хотел бы также отключить повторное использование клавиш базового движения hjkl. Я предполагал что-то вроде этого:

let g:last_mov_key = 'none'
let g:times_mov_key_repeated = 0
function! MovementKey(key)
    if (g:last_mov_key == a:key)
        let g:times_mov_key_repeated = g:times_mov_key_repeated + 1
    else
        let g:last_mov_key = a:key
        let g:times_mov_key_repeated = 0
    endif
    if g:times_mov_key_repeated > 3
        echo "Negative Reinforcement!"                             
    endif
endfunction

noremap j :call MovementKey('j')<CR>gj
noremap k :call MovementKey('k')<CR>gk
noremap h :call MovementKey('h')<CR>h
noremap l :call MovementKey('l')<CR>l

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

Редактировать: Вопрос отредактирован после первых двух ответов для ясности, пункты переупорядочены. Мне нужна помощь от Вима, выходящего за пределы "уровня 0" Роменля. До сих пор ответы советуют мне не тратить свое время, но что если мы предположим, что я поклонник техники обучения, где я меняю свои привычки, меняя свое окружение, чтобы менять стимулы? В этой модели я хочу выполнить задачу, скажем, прокрутить страницу вниз, и я буду более или менее произвольно пытаться сочетать клавиши до тех пор, пока не выполню эту задачу. Передача сигналов допамина и т. Д. В моем мозгу усилит действие, которое в конечном итоге достигает этого результата. Я мог бы сосредоточиться на том, чтобы не помнить hjkl, или я мог сосредоточиться на задаче, которую я изначально пытался выполнить, редактировать текст, и, не задумываясь об этом, найти себе более эффективные методы редактирования.

Ответы [ 4 ]

9 голосов
/ 02 февраля 2012

Ты слишком много слушаешь других людей.Просто используйте для перемещения те клавиши, которые вам больше нравятся, и оставьте другие клавиши в покое.Переназначение hjkl ключей несколько хлопотно, и лучше не делать этого, потому что они в жестком коде в vim по историческим причинам.

6 голосов
/ 02 февраля 2012

РЕДАКТИРОВАТЬ

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

nnoremap h $
nnoremap l 0
nnoremap j gg
nnoremap k G
" and so on for other modes

hjkl сопоставлены с предельной противоположностью их первоначальному поведению, что делает их совершенно непригодными для использования.Вы должны сделать то же самое для их синонимов (:h h, :h j, :h k, :h l) тоже для полноты, но есть случаи, когда полезно посимвольное / построчное перемещение.В таких случаях вы будете рады иметь + или - или <Space>.

Хотя мне не очень нравится такой тип павловского метода.Я нахожу это слишком жестоким, и риск того, что вы действительно привыкнете к этим странным сопоставлениям, кажется довольно высоким.

END EDIT

Короткая версия:

Ни клавиши со стрелками, ни hjkl не стоят того, чтобы их переназначение было бесполезным.Через некоторое время вы привыкнете к движениям и текстовым объектам Vim.Используйте то, что кажется вам более естественным.Не торопись.Он придет.Естественно.

Длинная версия:

Вы печатник?Или вы планируете изучать сенсорный набор текста?

Я не сенсорный машинистка и никогда не планирую им заниматься: я использую hjkl только для фактического ввода hjkl в режиме INSERT.

Когда мне нужно переместить 1 или 2 строки выше или ниже без определенной «цели», я использую клавиши со стрелками, когда мне нужно переместить пару букв влево или вправо, я использую клавиши со стрелками,В этом нет ничего постыдного.

Однако есть проблема, когда вы набираете jjjjjjjjjj или нажимаете клавишу со стрелкой вниз 10 раз, чтобы переместиться на 10 строк: jjjjjjjjjjj, очевидно, так же плохо, как и

Эта глупая мантра "не используйте клавиши со стрелками" - это просто дерево, которое скрывает лес: оно повторяетсянастолько часто, что это заставляет вас сосредоточиться на бесполезных шаблонах / антипаттернах вместо того, чтобы на самом деле учиться более мощным способам.

Я не хочу перефразировать прекрасное Ваша проблема с Vim в том, что вы не впадаете в vi. но вы можете видеть это как "уровни просветления":

  • Уровень 0 будет

    jjjjjjjjjjj или затем все необходимые горизонтальные перемещенияпытается достичь вашей цели.

    Читая строку выше, разве не очевидно, что hjkl Vs дебаты абсолютно глупы?

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

  • Уровень 1 будет

    10j22l, чтобы пройти 10 строк вниз и достичь своей цели на 22 символа справа.Хотя печатать стало намного меньше, теперь вам нужно считать строки и символы, что не особенно хорошо.

  • Уровень 2 будет

    10jwww чтобы спуститься на 10 строк и достичь цели на 3 слова вправо или 10jf#, чтобы спуститься на 10 строк и перейти к первой букве вашей цели (шестнадцатеричное значение цвета).

    Хмм, этонамного лучше.

  • Уровень 3 будет

    /#<CR>, чтобы прыгнуть прямо к вашей цели (шестнадцатеричное значение цвета, как и раньше),Если она выше вашей текущей позиции, вы должны сделать ?#<CR>.

Если вы печатаете на сенсорном компьютере или тренируетесьчтобы стать единым целым, дебаты исчерпаны: hjkl (или jkl;, как некоторые любят их переназначать), быстрые и естественные, и вам вообще не нужны клавиши со стрелками, а если нет, то преимущества использования hjkl более в лучшем случае минимально.

Сосредоточьтесь на eEbBwWfFtT/?} и Ко,Один бит за раз.Не заставляйте себя.

4 голосов
/ 06 мая 2014

Одна вещь, которую я нашел, это работает :noremap jj <nop>.Vim задержит движение j, потому что думает, что вы можете его расширить, что замедляет вас настолько, чтобы попробовать что-то еще.Вы также не можете больше удерживать клавишу j, потому что вместо этого просто запускается nop.Вы все еще можете использовать кнопку в чрезвычайных ситуациях, но она достаточно разочаровывает, чтобы вы избегали ее при повседневном редактировании.

2 голосов
/ 03 марта 2015

Я хотел бы предложить решение, которое больше соответствует образу мышления ОП.

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

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

function! DisableIfNonCounted(move) range
    if v:count
        return a:move
    else
        " You can make this do something annoying like:
        " echoerr "Count required!"
        " sleep 2
        return ""
    endif
endfunction

function! SetDisablingOfBasicMotionsIfNonCounted(on)
    let keys_to_disable = get(g:, "keys_to_disable_if_not_preceded_by_count", ["j", "k", "l", "h", "gj", "gk"])
    if a:on
        for key in keys_to_disable
            execute "noremap <expr> <silent> " . key . " DisableIfNonCounted('" . key . "')"
        endfor
        let g:keys_to_disable_if_not_preceded_by_count = keys_to_disable
        let g:is_non_counted_basic_motions_disabled = 1
    else
        for key in keys_to_disable
            try
                execute "unmap " . key
            catch /E31:/
            endtry
        endfor
        let g:is_non_counted_basic_motions_disabled = 0
    endif
endfunction

function! ToggleDisablingOfBasicMotionsIfNonCounted()
    let is_disabled = get(g:, "is_non_counted_basic_motions_disabled", 0)
    if is_disabled
        call SetDisablingOfBasicMotionsIfNonCounted(0)
    else
        call SetDisablingOfBasicMotionsIfNonCounted(1)
    endif
endfunction

command! ToggleDisablingOfNonCountedBasicMotions :call ToggleDisablingOfBasicMotionsIfNonCounted()
command! DisableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(1)
command! EnableNonCountedBasicMotions :call SetDisablingOfBasicMotionsIfNonCounted(0)

DisableNonCountedBasicMotions

Обратите внимание, что код включен сюда для удобства, но я бы также проверил с gist , чтобы увидеть, были ли ониОбновления / исправления.

Вы можете ослабить ограничение для горизонтальных движений или добавить / удалить другие движения, установив список задействованных клавиш / команд, g:keys_to_disable_if_not_preceded_by_count, в ~/.vimrc.Например, следующее обеспечивает только движения с префиксом «j» и «k»:

let g:keys_to_disable_if_not_preceded_by_count = ["j", "k"]

Кроме того, как отмечено в gist , вы можете найти, что это действительно полезно длядобавьте что-то подобное в ваш ~/.vimrc, а также код, приведенный выше:

set number
if has('autocmd')
augroup vimrc_linenumbering
    autocmd!
    autocmd WinLeave *
                \ if &number |
                \   set norelativenumber |
                \ endif
    autocmd BufWinEnter *
                \ if &number |
                \   set relativenumber |
                \ endif
    autocmd VimEnter *
                \ if &number |
                \   set relativenumber |
                \ endif
augroup END

Или установите строку плагина vim-numbers .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...