Создание списка или кортежа из одного слова в строке в vim - PullRequest
0 голосов
/ 28 мая 2020

Я довольно часто сталкиваюсь со следующим шаблоном, когда мне нужно скопировать и вставить кучу элементов (обычно в Excel) в нечто вроде запроса SQL, и часто самый простой способ сделать это - скопировать и вставить данные в vim, а затем запустите на нем макрос / команду, чтобы отформатировать его. Вот пример входных данных:

enter image description here

Для меня это включает три шага:

  • Удалить пустые строки: :g!/\S/d
  • Добавьте кавычки и разделитель ,: :% s/\v(\S+)/"\1",
  • Поместите его в одну строку и добавьте обертку [...] или (...): ggVG (выберите all), J (condense-all), 0i(CTRL-o$)

Есть ли способ, которым я могу поместить все это в функцию или макрос, или как лучше всего использовать вышеперечисленное введите и введите какое-либо сочетание клавиш, например s , и он форматирует все указанным выше способом?

Хотя это может показаться излишним, это то, что я могу делать это довольно легко и быстро (не задумываясь) в редакторе, таком как TextMate, где я могу использовать мульти-курсор.

Ответы [ 3 ]

3 голосов
/ 28 мая 2020

Мой первоначальный рефлекс - начать с

echo '['.join(map(filter(getline(1, '$'), '!empty(v:val)'), 'string(v:val)'),', ').']'

, которое можно превратить в

%d
call append(line('.')-1, '['.join(map(filter(getreg('"', 1, 1), '!empty(v:val)'), '"\"".v:val."\""'),', ').']')

И, таким образом, в команду

command! -range=% ToTuple 
\ <line1>,<line2>d
\|call append(<line1>-1, '['.join(map(filter(getreg('"', 1, 1), '!empty(v:val)'), '"\"".v:val."\""'),', ').']')

Обратите внимание, что

echo string(filter(getreg('"', 1, 1), '!empty(v:val)')

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

2 голосов
/ 28 мая 2020

Так в чем проблема? Поместите это в свой vimr c, и все готово.

function s:do_stuff() abort
    %join
    s/\S\+/"&",/g
    s/^/(
    s/$/)
endfunction

nnoremap <silent><leader>s :call <SID>do_stuff()<CR>
0 голосов
/ 01 июня 2020

Я придумал другой вариант:

:%s/\v(\w+)\n+/"\1",/g | norm $x | exec "norm! I(\<Esc>A)"

В качестве параметра командной строки:

vim -c ':%s/\v(\w+)\n+/"\1",/g | norm $x | s/.*/(&)/g' -c wq target.txt

-c ........... vim command line (interactive shell)
\v ........... very magic (simple regex system)
\w+ .......... one or more words per line
\n+ .......... one or more line breaks 
() ........... regex group
\1 ........... repeat the first regex group
normal $x .... deletes the last character of the remaining single line

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

...