Чи можу я з'єднати рядки з комою (чи іншим символом)?


19

Я знаю, що можу з'єднати рядки у Vim з Jкількома його варіантами ( gJтощо); Jбуде "Видалити відступ і вставити до двох пробілів" .

Але чи існує також прямий спосіб вставити інший символ замість двох пробілів? Наприклад, кома ( ,) або кома та пробіл ( ,)?

Подано:

8
9
10
32

Я хотів би закінчити:

8, 9, 10, 32

або:

8,9,10,32

Також вам може сподобатися github.com/sk1418/Join (не перевірено).
VanLaser

Відповіді:


5

Я написав плагін Join, може робити все, що завгодно, і багато іншого.

За винятком усіх функцій, що надаються командою вбудованого вступу: приєднатись, приєднатись можна:

  • Об’єднати лінії з роздільником (рядок)
  • Об'єднайте лінії з обрізкою провідних / кінцевих пробілів або без них
  • Приєднати лінії з від’ємним рахунком (назад приєднатися)
  • Об'єднайте лінії в зворотньому напрямку
  • Об’єднайте лінії та зберігайте з'єднані лінії (не видаляючи з'єднані лінії)
  • Об'єднайте лінії з будь-якими комбінаціями вищезазначених варіантів

більше деталей та знімків екрана:

https://github.com/sk1418/Join


23

Простий спосіб такий: просто виберіть рядки (усі, крім останнього) - або використовуйте %- та запустіть:

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

або

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

(де, звичайно, '<,'>частина була вже вставлена ​​після :Vim, щоб націлити вибір)


(2-е) Оновлення:

Спираючись на вищезазначене (та коментар Сато Кацури ), ось можлива реалізація "інтерактивного приєднання", з кількістю та необов'язковою повторною підтримкою:

" ================ script ===============================================
" interactive 'J', 'gJ' replacement with optional 'vim-repeat' support
" The last used separator is automatically reused as:
" a. default choice
" b. when repeating (=> non-interactive repeats: same range, same separator)
let g:last_join_separator = " "
function! s:interactiveJoin(use_last_sep,...) range
    if (a:use_last_sep == 0) "interactive, ask for separator to use
        call inputsave()
        echohl Question
        let l:sep = input("Separator:", g:last_join_separator)
        echohl None
        call inputrestore()
        redraw!
        let g:last_join_separator = l:sep "update last separator value
    else "non-interactive (when repeating with '.')
        let l:sep = g:last_join_separator
    endif
    if (a:0 == 0) "with no argument, remove indentation *and trailing spaces*
        let l:subst = 's/\s*\n\+\s*/\=' . "'" . l:sep . "'/"
    else " don't remove indentation or trailing spaces (act like 'gJ')
        let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
    endif
    if a:firstline < a:lastline "join given range
        execute a:firstline . ',' . (a:lastline - 1) . l:subst
        let l:count = a:lastline - a:firstline + 1 "default count for repeat
    else "or join only with next line
        execute l:subst
        let l:count = 1 "default count for repeat
    endif
    "make command repeatable
    "(with the tpope/vim-repeat plugin: optional, recommended)
    if (a:0 == 0)
        silent! call repeat#set("\<Plug>(repeatJoin)", l:count)
    else
        silent! call repeat#set("\<Plug>(repeatGJoin)", l:count)
    endif
endfunction

noremap <silent> <Plug>(interactiveJoin)  :call <SID>interactiveJoin(0)<CR>
noremap <silent> <Plug>(interactiveGJoin) :call <SID>interactiveJoin(0,'g')<CR>
noremap <silent> <Plug>(repeatJoin)       :call <SID>interactiveJoin(1)<CR>
noremap <silent> <Plug>(repeatGJoin)      :call <SID>interactiveJoin(1,'g')<CR>

І власне відображення:

"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)

Це щось на зразок (*) J, але інтерактивне - воно підкаже для рядка роздільника. Рядок за замовчуванням - це пробіл - так, наприклад, об'єднати рядки без роздільника, натиснути, Backspaceколи буде запропоновано, видалити символ пробілу за замовчуванням та Enterприйняти (зараз) порожній роздільник. Підрахунок, наприклад 3J, також працює. Якщо tpope/vim-repeatплагін встановлено, повторюючи з «.» також буде працювати, повторно використовуючи останній роздільник і (якщо не змінено - наприклад 10.) останній відлік або візуальний діапазон рядків.


(*) Це не зовсім так J: хоча він видалить відступи, він не перевірить .!?(кінець фрази), щоб вставити 2 пробіли замість одного, або вставити пробіл, лише якщо його немає (важко зробити щось на кшталт це, оскільки розділовий рядок зараз може бути будь-яким). Це також прибере пробіли (має більше сенсу).

Я думаю, що це може бути хорошим способом перевантажити обмежений простір листів :)

Ну, технічно Jце не зовсім оператор, але близький до одного - наприклад, ви не можете зробити це Jaw, щоб приєднатися до "слова".

(пропозиції вітаються)

введіть тут опис зображення


2
Ще краще: :'<,'>-1s/\n/, /для позначених рядків або :1,$-1s/\n/, /для всього файлу.
Сато Кацура

Справді, це ще краще :)
VanLaser

@SatoKatsura ви можете пояснити -1?
alxndr

1
@alxndr - використовується для пропускання останнього рядка в діапазоні / файлі: наприклад, в прикладі OP, ви не хочете кома після 32, а також не хочете приєднати її до наступного рядка, якщо він існує . Ви навіть можете використовувати '<,'>-s/\n/, /або 1,$-s/\n/, /як -те саме, що і -1.
VanLaser

1
Якщо l:sepце так &, то ваша заміна буде працювати неправильно, оскільки &це магія в заміні. Можливо, краще використовувати \=для використання прямої рядка - let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"- замість того, щоб намагатися обробляти втечу.
Jamessan

3

Ось приклад використання зовнішньої команди:

:%!paste -sd,

де %!замінює поточний буфер (вміст файлу) командою: paste -sd,(параметри -sвикористовуються для об'єднання декількох рядків і -dвстановлює символ роздільника на ,).


3

Про всяк випадок, якщо комусь не сподобається набрати Regex та запам'ятати більше команд Plugin Ex:

Візуальний блок Доп

Visual-block Додаток доступний у режимі Visual Block ( <C-v>) і може робити блок A ppend (і блок I nsert для prepend). (Посилання: :help v_b_A, :help v_b_I)

І якщо останній рух у візуальному режимі блокувати $, додавання буде зроблено в кінці всіх виділених елементів; інакше перед текстом, який ви додали, буде вставлено пробіли (уявіть, що вирівнювання закриється )наприкінці декількох викликів методів у коді).

З наведеним нижче зразком тексту та курсором 8:

8
9
10
12

<C-v>}$A,<C-c>. Повернувшись до звичайного режиму, ми можемо побачити ,, що додається до всіх вибраних рядків. (Спробуйте без $)

Потім зробіть gvдля повторного вибору області та Jабо gJ. У нас є крок ,: 8,9,10,12,і $xми закінчили.

Використовуйте Insert для відсутності трейлінгу ,

Скасуємо наш текст (будь то uu..uфантазії :ea 1d<cr>:lat 1) та спробуємо Visual Insert:

j<C-v>}I, <C-c>і тоді ми можемо приєднуватися до рядків gJбез пробілів.

Зачекайте, почекайте, чекайте, чогось не вистачає. Як повторно вибрати весь «масив»? Цього разу ми не вибрали перший рядок ... тому gvне допомагає.

- Або це може допомогти gvok- повторний вибір ( gv), oпідвісний кут та kвгору.

PS Мій мізинець не швидкий і точний досить набрати /\для /\n, так що я , як об'єднання Vim вбудовані операцій і руху , щоб уникнути використання Regex. Однак якщо я роблю це досить часто, використовуючи картографування - можливо, ті, які відображають плагіни, повинні бути кращими.


1

Набагато простіший спосіб без плагінів чи зовнішніх команд перенастроїти приєднання ( J) з пробілу до будь-якого символу, який вам подобається. Наприклад, для з'єднання з комою та пробілом:

:nmap J :s/\n/, /^M

Для нового рядка спеціального символу в кінці ( ^M) натисніть, Ctrl-Vа потім поверніть / введіть. Те саме стосується, якщо ви хочете замінити вкладку ( ^I), введіть Ctrl-Iтоді Tab.

:nmap J :s/\n/^I/^M

Це робиться, це замінити новий рядок табуляцією на поточному рядку та переставити цю поведінку символу J.

Це також працює з комбінаціями, як 4Jдля приєднання наступних 4 рядків.


0

Ви можете записати макрос для з'єднання рядків із комою. Це корисно, якщо це рідкісне або разове завдання, і ви не можете згадати, як написати команду-заміну і регулярний вираз для виконання завдання, але ви пам'ятаєте, як записати і запустити макрос.

Щоб з'єднати рядки з комою, введіть qjgJi,Escqдля запису макрос в регістр j. Потім ви можете запустити макрос за допомогою @j. Ви можете повторно запустити макрос @@, який заощаджує при наборі тексту під час його запуску кілька разів поспіль - ви навіть можете просто утримувати, @поки не наблизитеся до кінця рядків, до яких потрібно приєднатися. Ви також можете використовувати числовий префікс @jабо @@повторити його встановлену кількість разів. Це залишає провідний і кінцевий простір недоторканим, тому перед комою або після неї буде пробіл, якщо у вашому оригінальному тексті було пробіли.

Щоб з'єднатись із комою та пробілом, вставте Spaceміж ,та Escпід час запису макросу.

Ви також можете використовувати Jзамість gJзапису макросу, який зазвичай з'єднує рядки з комою та пробілом. Однак, якщо в поточному рядку є пробіли пробілів, кома з’явиться після пробілу без пробілу після нього. Крім того , вона не включає в себе простір , якщо наступний рядок починається з ), і це ставить два пробілу після коми , якщо joinspacesвстановлено і поточні кінці лінії з ., !або ?. Ці застереження описані нижче :help J.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.