Визуальные фильры в Vim
В Unix есть понятие filter, программа получающая поток данных и его возвращающая: awk, sed, tr, grep. Выделенные фрагменты текста из Vim пожно подавать на последоватеьность фильтров, и считывать результат обрабтно в Vim. Результат работы последовательности фильтров заменит выделенный текст.
Для этого следует.
- Перейти в Режим визуального выделения (Visual mode):
V
- Передать выделенный фрагмент фильтрам нажав
!
, или можно нажать:
и потом уже допечатать ! с коммандой. - В коммандной строке указать последовательность фильтров или интепретатор:
:'<,'>!sort | tr '1234' 'ABCD'
,:'<,'>!python
,:'<,'>!ruby
- Нажать
Enter
Таким образом можно не только фильтровать текст, но и использовать текстовые фрагменты как программынй код. Вводя в свои текстовые документы код на Ruby или Python для трансформации кода в текст:
puts %w{cherry banana apple qiwi}.sample
=> :'<,'>!ruby
=> cherry
Cправка
:help !
{Visual}!{filter} Filter the highlighted lines through the external
program {filter} (for {Visual} see Visual-mode).
Далее, примеры: сортировка или передача текста как код в интерпретатор.
Cортировка строк в Vim:
banana
apple
coco
grape
arbuz
gursha
banan
V - для перехода в select mode. ! - для ввода утитилиы, которой черз pipe line будте передаваться выделение. sort - название утилиты в коммантной строке.
apple
arbuz
banan
banana
coco
grape
gursha
Использование pipe line во внешних коммандах для Vim:
После сортировки замена arbuz
на арбуз
и gursha
на груша
.
banana
apple
coco
grape
arbuz
gursha
banan
Выделение через V
запуск через !
:
sort | sed -e 's/gursha/груша/g' -e 's/arbuz/арбуз/g'
Результат
apple
арбуз
banan
banana
coco
grape
груша
Текст как код для Ruby:
А можно и в тексте взывать интерптератор.
puts 2+3*5-7
`V` => `!` => `ruby`
10
Или же заполнение случайными строками:
5.times { print rand(10).to_s + "\n"}
`V` => `!` => `ruby`
5
4
4
7
4
Гистограммы в Vim через Nushell
Неполучиось. Vim говорит ошибку E485. Далее по тексту решил через файл - «буфер».
Для начала в ~/.config/nvim/init.vim
shell меняется на Nushell.
" ~/.config/nvim/init.vim
set shell=/usr/bin/nu
Потом в тексте выделяется столбец данных через V
.
apple
banana
apple
...
И через !
фильтр вызывается код на Nushell.
Не работает. Vim говорит ошибку E485.
Ладно, поробую через файлы:
- Пишу код чтоб заполнить файл случайным образом.
Ruby:
10.times{ puts %w{apple banana qiwi}.sample + "\n"}
Python:
import random; print('\n'.join(random.choice(["apple", "banana", "qiwi"]) for _ in range(10)))
- Выделяю через
V
и запускаю через!ruby
или!python
.
apple
apple
qiwi
qiwi
qiwi
banana
banana
apple
banana
apple
- Cохраняю
:wq tmp.txt
запускаюnu
.
Nushell:
~/tmp/nu> open tmp.txt | split row "\n" | histogram | table -t none | save out.txt
Файл out.txt:
# value count quantile percentage frequency
0 apple 4 0.40 40.00% ****************************************
1 banana 3 0.30 30.00% ******************************
2 qiwi 3 0.30 30.00% ******************************
Истпользование комманд w r и w! для постоения гистограммы не выходя из Vim
- Генерация последовательности:
V
!
ruby
илиpython
Ruby:
10.times{ puts %w{apple banana qiwi}.sample + "\n"}
Python:
import random; print('\n'.join(random.choice(["apple", "banana", "qiwi"]) for _ in range(10)))
Vim:
:'<,'>!ruby
- Выделение и сохранение последовательности в
tmp.txt
V
Visual mode:'<,'>w! tmp.txt
- если надо перезаписать tmp.txt:'<,'>w tmp.txt
- если НЕ надо перезаписать tmp.txt
- сохранение кода Nu script.
V
потом:'<,'>w script.nu
open tmp.txt | split row "\n" | histogram | table -t none
- запуск и считывание в буфер результатов работы
:r !nu script.nu
# value count quantile percentage frequency
0 apple 5 0.50 50.00% *********************************
*****************
1 qiwi 3 0.30 30.00% ******************************
2 banana 2 0.20 20.00% ********************
Вывод: Выделяется фрагмент текста через V
, сохраняется в файл :'<,'>w file.name
или :'<,'>w! file.name
для перезаписи. Файл считать в текст :r file.name
, можно считать результат работы скрипта :r !nu file.nu
.