web-dev-qa-db-ja.com

マッピング<Shift>-文字/行を選択するための矢印

最近vimを使い始めましたが、他のテキストエディタからの文字/行の選択方法が恋しいです。デフォルトでは、vimマップ<S-Up><S-Down> 1ページを上下にジャンプし、これらをテキスト選択に再マップしたいと思います。

それを行う方法はありますか?

24

私の意見では、Vimはそれほど簡単には曲がりません。私の場合、ターミナル1はシフトアップさえ認識しません! v(文字単位の選択)またはV(行単位の選択)は、vi/vimについて学ぶのが簡単な概念の1つだと思いました。

これが機能する場合(現在テストできない)、これはあなたが望むものです:

" activate visual mode in normal mode
nmap <S-Up> V
nmap <S-Down> V
" these are mapped in visual mode
vmap <S-Up> k
vmap <S-Down> j
" 
" etc...
" similarly <S-Left>, <S-Right> for v
13
nperson325681

@escraffordマッピングを挿入モードのもので完了しました:

" shift+arrow selection
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>

また、通常のコピー/カット/ペーストをこのようにマッピングすると、たとえば、選択+コピー後に挿入モードに戻ることができます。

vmap <C-c> y<Esc>i
vmap <C-x> d<Esc>i
map <C-v> pi
imap <C-v> <Esc>pi
imap <C-z> <Esc>ui

これで、任意のモードからShift +矢印の選択を開始し、次にC-cでコピー、次にC-vで貼り付けることができます。常に挿入モードで終了するため、元に戻すにはC-zも必要です。

これは、yuが求めているテキストエディタの「期待される標準」の動作にもっと近づくと思います。

20
RubenCaro

Progoの答えとは少し異なります-これは、Macアプリが通常持っているのと同じ感覚を与えます:

nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>

違いは、ビジュアルラインモードではなくビジュアルモードに切り替えられることと、最初の上下などのキーストロークが失われないことです。

17
escrafford

これには特定のオプションがあります: keymodel

'keymodel' 'km'     string  (default "")
            global
            {not in Vi}
    List of comma separated words, which enable special things that keys
    can do.  These values can be used:
       startsel Using a shifted special key starts selection (either
            Select mode or Visual mode, depending on "key" being
            present in 'selectmode').
       stopsel  Using a not-shifted special key stops selection.
    Special keys in this context are the cursor keys, <End>, <Home>,
    <PageUp> and <PageDown>.
    The 'keymodel' option is set by the |:behave| command.

TL; DR:必要な動作を有効にするには、次を使用します。

set keymodel=startsel

<Up>または<Down><Shift>を押さずに使用するときにもビジュアルモードを終了する場合は、次を使用できます。

set keymodel=startsel,stopsel
10
ericbn

実行しやすい別のソリューションを見つけました。コマンド ':behave mswin'は、Shiftキーとカーソルキーを使用してテキストを選択するために必要なすべてのことを実行します。どのモードからでも機能します。また、Cmd-c、Cmd-v、およびCmd-xもサポートしています。 MacVimで動作しますが、他のプラットフォームは試していません。

2
Gijs

この機能を再マップしないことを強くお勧めします。単にビジュアルモードに切り替えて、vと矢印キーを使用することをお勧めします。 Vは行全体を選択します。v$は行の終わりまで選択し、vwは次の単語を選択します。さまざまな行や単語を選択するために使用できるコマンドは他にもたくさんあります。これらのコマンドを学ぶことは、選択するのに役立つだけでなく、ファイルをより効率的に編集するのにも役立ちます。

1
trev9065

このマッピングは、選択中(ビジュアルモード)に挿入モードを維持し、正しい位置から開始します。 Ctrl-Shift-Left/Rightを使用して、左または右の単語を選択することもできます(端末でサポートされている場合)。

" Select with shift + arrows
inoremap    <S-Left>              <Left><C-o>v
inoremap    <S-Right>             <C-o>v
inoremap    <S-Up>                <Left><C-o>v<Up><Right>
inoremap    <S-Down>              <C-o>v<Down><Left>
imap        <C-S-Left>            <S-Left><C-Left>
imap        <C-S-Right>           <S-Right><C-Right>
vnoremap    <S-Left>              <Left>
vnoremap    <S-Right>             <Right>
vnoremap    <S-Up>                <Up>
vnoremap    <S-Down>              <Down>

" Auto unselect when not holding shift
vmap        <Left>                <Esc>
vmap        <Right>               <Esc><Right>
vmap        <Up>                  <Esc><Up>
vmap        <Down>                <Esc><Down>

これは、挿入モードのときに小さなパーツをすばやく選択するのに役立つ場合がありますが、大きなパーツを選択するにはデフォルトのコマンドを使用することをお勧めします。

0
elwint

これは、挿入モード、ビジュアルモード、通常モードの両方でAlt+hjkl(および友達)を使用してナビゲートし、Alt+HJLKを使用して選択できるように作成しました。

したがって、同じことが通常の矢印キーにも適用できます

let hjklfriends = ['h','j','k','l','w','e','b','W','E','B', 'n', 'N', 'y', 'Y', 'p', 'P']

" define if using alt (it works in neovim) or Escape key.
function! Meta(key)
  if has('nvim')
        return "<A-" . a:key . ">"
    else
        return "<Esc>" . a:key
    endif
endfunction

execute 'noremap! ' . Meta('h') . ' <left>'
execute 'noremap! ' . Meta('j') . ' <down>'
execute 'noremap! ' . Meta('k') . ' <up>'
execute 'noremap! ' . Meta('l') . ' <right>'
execute 'noremap! ' . Meta('b') . ' <C-Left>'
execute 'noremap! ' . Meta('w') . ' <C-Right>'
execute 'noremap! ' . Meta('e') . ' <C-Right>'

for k in hjklfriends
  execute 'imap ' . Meta(k) . ' <C-o>' . k

  if k =~ '[a-z]'
    execute 'imap ' . Meta(toupper(k)) . ' <C-o>v' . k
    execute 'vmap ' . Meta(toupper(k)) . ' ' . k
    execute 'nmap ' . Meta(toupper(k)) . ' v' . k
  endif
endfor
0
Treviño