2013-04-24 2 views
0

Я пытаюсь сопоставить Ctrl-j, чтобы объединить две строки, используя запятую. У меня есть следующие строки в моем файле .vimrcЗапуск пользовательской виртуальной карты keybinding один раз работает, но ее запуск x количество раз не работает

:map <C-j> A<space>,<ESC>J 

Это прекрасно работает, когда я нажимаю Ctrl-J раз

Before   After 
test    test , test 
test    test 
test 

Но когда я пытаюсь объединить несколько строк сразу, нажав «2Ctrl-J «Я получаю следующие

Before   After 
test    test , , test 
test    test 
test 

Что я делаю неправильно? Как я могу объединить несколько строк в одну запятую? Я попытался заменить <Esc> на <C-[>, но это не сработало.

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

+0

Ходатайства не работает так. 2 заставляют вас повторять A , дважды, но J выполняется только один раз. Однако я не уверен, как сделать эту работу движением. – fotanus

+0

'J' по умолчанию принимает минимальное количество 2. Как и в этом случае, следующие две строки. Если вы набрали 3 буквы, вы получите три строки, соединенные – FDinoff

+0

@FDinoff Nope. Ввод 3 просто дает мне 3 запятые. 'test,,, test' – Chaitanya

ответ

2

Ваш подход является ошибочным, потому что 2<C-j>:

  • говорит Vim для добавления запятой в 2 раза в текущей строке (2A<space>,)
  • и J не принимают счет и, следовательно, работают только один раз (даже если это так, J - это то же самое, что и 2J ...).

Также командные последовательности, такие как A<space>,<ESC>J, лучше подходят для макросов. Если вы хотите, чтобы ваши сопоставления работали с подсчетом, вы должны использовать только одну команду (лучше всего использовать команду Ex) в правой части вашего сопоставления и, если возможно, менее «пешеходный» метод.

Вот лучший подход:

:nnoremap <C-j> :s/\n/ , <CR> 
:xnoremap <C-j> :s/\n/ , <CR> 

С помощью этих отображений, вы можете сделать <C-j> и 3<C-j> в нормальном режиме и <C-j> без проблем. Вот что Vim делает в трех scenarii выше:

  • нормальный режим <C-j> заменяет EOL с , на текущей строке

    :s/\n/ , <CR> 
    
  • нормальный режим 3<C-j> заменяет EOL с , на этой линии и два ниже

    :.,.+2s/\n/ , <CR> 
    
  • визуальный режим <C-j> заменяет EOL с , на каждой линии в визуальном выборе

    :'<,'>s/\n/ , <CR> 
    

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

редактировать

В основном, когда вы используете счетчик перед командой Ex или при выдаче команды Ex в визуальном режиме Vim автоматически вставляет диапазон, соответствующий этому количеству или этого визуального выделения до сама команда, чтобы сэкономить вам некоторую типизацию.

3<C-j> 

делает:

3:s/\n/ , 

, который превращается в:

:.    " from this line 
:.,   " to 
:.,.+2   " two lines below this line 
:.,.+2s/\n/ , " do this substitution 
+0

Спасибо. Чтобы уточнить, когда вы говорите «команда Ex», вы подразумеваете ввод команды, нажимая «:» правильно? Я не уверен, что понимаю ваш второй пункт. Я бы подумал, что он просто запускал команду 3 раза в цикле, не уверен, где '.,. + 2' вставляется в':.,. + 2s/\ n /, '. Решение работает отлично, я просто прошу свое понимание. – Chaitanya

+0

Да, «Команды Ex» - это команды, которые вы вводите в приглашении ':'. Вы можете видеть, что делает Vim, если вы удаляете '' в конце отображения, это довольно интересно. См. Мое редактирование. – romainl

2

Если вы не против использовать один из своих регистров, вы можете сохранить команду в регистре.

Например, вы можете добавить следующую строку в ваш vimrc

let @j = "A,\eJ" 
nnoremap <C-j> @j 

@j использует j регистр для хранения команды. Когда вы вводите число, за которым следуют @j или <C-j>, вы запустите команду n раз, которая присоединится к следующим n строкам, разделенным запятыми.


Другой способ объединить несколько строк вместе, чтобы использовать функцию ниже.

function! CustomJoinLines(delim) range 
    for i in range(a:firstline, a:lastline) 
     exec "normal A" . a:delim . "\eJ" 
    endfor 
endfunction 

Эта функция объединения нескольких строк вместе, используя то, что когда-либо разделителем вы передадите. Это также будет держать пространство, которое J обычно добавляет.

Чтобы отобразить эту команду добавить функцию к вашему vimrc и следующие nnoremaps

nnoremap <C-j> :call CustomJoinLines(" ,")<CR> 
nnoremap <C-k> :call CustomJoinLines("!")<CR> 
+0

Оба ваши предложения отлично работали. Очень трудно выбрать, какой ответ принять, но Romainl кажется более простым. – Chaitanya

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