2012-02-02 12 views
17

vimが提供する優れたモーションやテキストオブジェクトを頻繁に使用しないので(そして、"Holding down 'j' is a vim anti-pattern,"以降)、私はvimにトレーニングの援助をしてhjkl複数回続けて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のコマンドラインを使用して状態を変更する他の例トンに想像してみてください。もっと複雑な動きを使わなければならないのはどうしたらいいですか?

編集:質問は、明確にするために最初の2つの回答の後に編集され、段落は並べ替えられています。私はvimがromainlの "レベル0"を超えて動いていくことを願っています。今のところ答えは私に時間を無駄にしないよう助言しますが、私がインセンティブを変えるために自分の環境を変えて自分の習慣を変える学習テクニックのファンだとすればどうでしょうか?このモデルでは、ページをスクロールするなどのタスクを実行したいと思います。そのタスクを達成するまで、多かれ少なかれランダムにキーの組み合わせを試みます。私の脳内のドーパミンシグナル伝達などは、最終的にこの結果を達成する行動を強化するでしょう。私はhjklを使わないことを覚えていることに焦点を当てることができました。あるいは、もともとやっていた作業に焦点を当てて、テキストを編集して、より効率的な編集テクニックを使って自分自身を見つけ出すことなく、

+0

'mouse = a'レコード設定では、Up/Downをにマッピングできます。まだスクロールホイールが動作しています(必要な場合はマウスを選択することもできます)。 – Holloway

答えて

2

OPの考え方に一層合った解決策を提案したいと思います。

私もあまりにも特定の動きをブロックすることは、カウントが先行していない場合、良い考えであると決めました。here。私はあまりにも単純な直接再マッピングを試みましたが、これはOPで説明されているように、多くのコンテキストでは機能しませんでした。

しかし、私はは最終的にkey maps that returned an expressionを使用して働いていたアプローチを思い付いた:

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に確認することを更新/修正されています。

あなたがキーのリストを設定することにより、他のモーションを削除/水平の動きのための制約を緩和、または 追加することができます/あなたの~/.vimrcで、行われる 、g:keys_to_disable_if_not_preceded_by_countコマンド。 gistに述べたように、あなたはそれが本当に役に立つあなたの~/.vimrcにこのような何かを追加するために見つけるかもしれない、また

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

: はたとえば、次のように唯一の「J」と「K」のためのカウント接頭辞の動きを強制します同様に上記のコードのように:

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をインストールします。

この質問はOPの満足度が他のアプローチに満足していると長い間回答していますが、誰かが違うものを探している場合に備えて私の解決策を追加しています。

+0

これは素晴らしいです、私はそれを追加しました!ここにコードを含めるといいですが、私は要点に満足しています。ありがとう! – Thomas

+1

コードを追加しましたが、機能強化/修正で要点を更新するので、要点へのリンクを維持しました。 – Jeet

9

あなたは他の人たちをあまりにも聴いています。あなたが一番好きなキーを動かして、他のキーだけを残しておいてください。 hjklのキーを再マッピングすることは、歴史的な理由からvimにhardcodedであるため、多少面倒であり、最良ではありません。

+0

私は結論に至りました。誰かがなぜこのような気がするのか興味があった場合に備えて、リンクを提供しました。私は頻繁に深い潜在的な潜在的な本能のために文書の別の部分になるのを待っている間、私は自分自身をjキーを押し続けていると私はこの習慣を押しつぶすしたいと思います。しかし、再マッピングするhjklキーが特に難しいことを聞くと便利です。難しい方法を習得し、練習し、それについて考える気になるかもしれません。 – Thomas

+0

@トーマス - 待っている気がしない場合は、画面全体をダウンさせるために、いくつかの修飾キーをhjklキーで再マップしてください。または類似のもの。 Vimには実際に移動するためのオプションがたくさんあります。 – Rook

+0

私は(ちょっとひどい)問題は、ちょうどjを抱き続けて待つことができるので、他のことを試してみるのに十分な動機がないということです。私はいくつかの(非生産的な)日だけhjklを無効にするかもしれないと思う。 – Thomas

6

EDIT

ここにあなたの編集、あなたのコメントを読んだ後、私が提案する根本的な解決である:超迷惑な事をする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行移動する必要があるときは、矢印キーを使用します。カップル文字を左または右に移動する必要があるときは、矢印キーを使用します。それには恥ずかしがり屋ではありません。

あなたは10行下に移動し、キーを10回jjjjjjjjjjを入力するか、下向き矢印を打ったときの問題は、しかし、があります:jjjjjjjjjjjは明らかに↓と同じくらい悪いですが

「矢印キーを使用しない」というこの馬鹿げた言葉は、森を隠すツリーにすぎません。実際にはもっと強力な方法を学習するのではなく、無駄なパターン/反パターンに集中するように頻繁に繰り返されます。

私は美しいYour problem with Vim is that you don't grok vi.を言い換えする必要はありませんが、あなたは "悟りのレベル" として、それを見ることができる:0は

jjjjjjjjjjjまたは↓だろう

  • レベルは、すべての必要な水平方向の動きは、あなたの目標を達成します。上記の行を読む

    は、それがhjkl↑議論が全く愚かであることを?かなり明白ではありませんか

    いずれかの方法を使用する場合でも、キーボードを縦横に移動して編集したい値に達することになります。どのような無駄。そして、両方が同じように悪いので、自分自身に強制的に1つの方法を使用する時間とエネルギーの無駄はどれほどですか。

  • レベル1は、10行下に移動して、右にターゲット22文字に到達するために

    10j22lだろう。それは入力がはるかに少ないが、今や特に良くない行や文字を数えなければならない。

  • は10行下に移動して、10行下に移動して、あなたのターゲットの最初の文字にジャンプする権利 または10jf#にターゲット3の言葉に到達するための

    10jwww(16進数になりますレベルカラー値)。

    うーん、それははるかに良いです。

  • レベル3は、(以前のように、進カラー値)ターゲットに直接ジャンプする

    /#<CR>だろう。現在のポジションを上回っている場合は?#<CR>となります。

あなたがタッチタイピストている、または1つになるために訓練されている場合は、議論を決着さ:hjkl(またはjkl;いくつかは、それらを再マップするために好きなようには)迅速かつ自然であり、あなたはで、矢印キーを必要としませんすべてのあなたがいない場合、hjklオーバー↓を使用する利点は、せいぜい最小限です。

代わりにeEbBwWfFtT/?}とCo.に注目してください。一度に1ビット。自分自身を "強制"しないでください。

+0

この質問の私の目的は、レベル0を超えて移動することです - 私は絶対に矢印キー上のhjklはポイントではないことに絶対合意しています - 私は技術を使用しないようにリマインダの一般的な例として矢印キーをオフに言及何年も前に私がvimを使い始めた時に使われました。私は今、jを繰り返し押すのではない同様のリマインダが好きですが、残念ながら矢印キーよりもhjklを再バインドすることは難しいようです。 – Thomas

+0

OK、あなたのプロセスの説明が好きです。私たちの脳は同じように動作していないようです;)。とにかく、私は提案で私の答えを編集しました。ちなみに、私は "レベル0"は敬虔に聞こえないようにしたい、あなたはそれを間違っていないことを願っています。 – romainl

+0

ニース、ありがとう。私はまだいくつかのhjklを使用する必要があると思っていましたが、移動するための検索にまっすぐにスキップすると、少なくとも短いトレーニング期間では、私はそうしないと思います。心配しないで、私は「レベル0」のことを否定的に取っていませんでした。「啓蒙のレベル」は非常に役立ちます。 – Thomas

2

私が見つけたことの1つは:noremap jj <nop>です。 Vimはあなたがそれを拡張している可能性があると考えているので、jの動きを遅らせるでしょう。 jキーをもう押し下げることもできません。なぜなら、代わりにnopをトリガーするだけだからです。緊急時にはこのボタンを使用することはできますが、日々の編集ではボタンを使用しないようにするのは難しいです。

関連する問題