Отображение <Shift>-Стрелки для выбора символов / линий - PullRequest
21 голосов
/ 15 марта 2012

Я недавно начал использовать vim, но мне не хватает методов выделения символов / строк в других текстовых редакторах. По умолчанию vim отображает <S-Up>, <S-Down> на переход на одну страницу вверх / вниз, и я хочу переназначить их на выделение текста.

Есть ли способ сделать это?

Ответы [ 7 ]

19 голосов
/ 06 августа 2014

Я завершил отображение @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 для отмены.

Я думаю, это больше подходит к «ожидаемому стандартному» поведению текстового редактора, о котором вы просите.

16 голосов
/ 17 марта 2014

Немного отличается от ответа 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>

Различия заключаются в переключении в визуальный режим вместо визуального линейного режима, а также в том, что не теряются начальные нажатия вверх / вниз и т. Д.

11 голосов
/ 15 марта 2012

На мой взгляд, Вим не так легко сдается. Терминал даже не распознает Shift-Up в моем случае! Я думал, что v (посимвольный отбор) или V (посерединный отбор) были одними из самых простых понятий для изучения vi / vim.

Если это сработает (сейчас не могу проверить), вам нужно:

" 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
6 голосов
/ 08 ноября 2017

Для этого есть особая опция: 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
2 голосов
/ 02 января 2015

Я нашел другое решение, которое проще выполнить.Команда «: ведомый mswin» делает все, что нужно, чтобы использовать клавиши Shift и курсора для выделения текста.Работает из любого режима.Он также поддерживает Cmd-c, Cmd-v и Cmd-x.Он работает в MacVim, но я не пробовал другие платформы.

1 голос
/ 15 марта 2012

Настоятельно рекомендуется не переназначать эту функцию.Лучше всего просто переключиться в визуальный режим и использовать v и клавиши со стрелками.V выберет всю строку, v$ выберет до конца строки и vw выберет следующее слово.Есть много других команд, которые вы можете использовать для выбора различных строк и слов.Изучение этих команд будет полезно не только для выбора, но и для более эффективного редактирования ваших файлов.

0 голосов
/ 09 ноября 2018

Это отображение сохраняет режим вставки во время выбора (визуальный режим) и начинается в правильном положении.Вы также можете выбрать слово влево или вправо, используя 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>

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

...