LINUX.ORG.RU

Vim выделенный текст в ИНТЕРПРЕТАТОР и обратно в Vim

 , , , ,


0

1

Визуальные фильры в 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.

Ладно, поробую через файлы:

  1. Пишу код чтоб заполнить файл случайным образом.

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)))

  1. Выделяю через V и запускаю через !ruby или !python.
apple
apple
qiwi
qiwi
qiwi
banana
banana
apple
banana
apple
  1. 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

  1. Генерация последовательности: 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 
  1. Выделение и сохранение последовательности в tmp.txt
  • V Visual mode
  • :'<,'>w! tmp.txt - если надо перезаписать tmp.txt
  • :'<,'>w tmp.txt - если НЕ надо перезаписать tmp.txt
  1. сохранение кода Nu script. V потом :'<,'>w script.nu
open tmp.txt | split row "\n" | histogram | table -t none  
  1. запуск и считывание в буфер результатов работы :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.



Последнее исправление: lbvf50txt (всего исправлений: 19)

Забыл отключить anonymous. Бывает.

@bread, для тебя писал. Отдельно создал тему чтоб не офтопить. Хотел показать как можно делать гистограммы в Vim через Nushell. А оно не заелось. Не работает Nushell с Vim.

Но все равно. Зафиксировал приемы работы с Vim.

lbvf50txt
() автор топика
Ответ на: комментарий от andreyu

Символ ! позволяет запустить внешнюю команду. Для чтения выхлопа внешней команды используется r.

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

lbvf50txt
() автор топика
Ответ на: комментарий от andreyu

Выделить текст, вызвать команду.

С sort работает. С кодом для Python/Ruby без ! не работает даже в bash.

Если передать вот этот код из буфера в интепретатор Ruby через :ruby. Или что-то подобное в Python или :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)))

Не работает без !. Пишет:

E471: Argument required

Все работает если передвавать через !: :'<,'>!ruby или :'<,'>!python. Код заменяется 10 строками со случайным выбором из массива фруктов.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 8)
Ответ на: комментарий от andreyu

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

Выделить текст, вызвать команду.

Дак правильно, это комманда не внешнаяя. По этому пример с sort работает, а с ruby и python не работает.

lbvf50txt
() автор топика
Ответ на: комментарий от gagarin0

А можно попросить записать asciinema? А то проект не особо популярный, найти демо не получилось, а посмотреть как оно реализует свои фичи интересно, раз уж есть сильная рекомендация.

kaldeon
()
Ответ на: комментарий от lbvf50txt

Если честно, то не пользуюсь этой фичей. Есть более удобные инструменты для общения с внешним миром: dispatch, asyncrun. Или более специализированные: ale, ack, fzf, slime и т.п. Но если плагины недоступны, то и такая интеграция лучше чем никакой.

bread
()
Ответ на: комментарий от kaldeon

asciicast

у меня есть файл repl.sh в котором хранится куча shell снипетов

визуально выделяю сниппет и нажимаю <localleader>, буфер отправляется в repl, в моем случае tmux (есть еще python,ruby,r,zsh и еще парочка)

gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 2)
Ответ на: комментарий от lbvf50txt

Расскажите, что за плагины и сочетания клавиш исползуете.

habamax ★★★
()
Ответ на: комментарий от andreyu

Символ ! позволяет запустить внешнюю команду. Для чтения выхлопа внешней команды используется r.

В своем исходном сообщении я так и написал.

Неточности формулировок сбивают читателя с толку. ! не просто запустить, но и передать и считать.

! - из Visual Mode позволяет передать во вреншюю программу фрагмент выделенного текста, и считать вывод этой программы обратно.

r - позволяет считать либо содержимое файла, либо вывод внешней программы. Без передачи выделенного фрагмента.

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 2)
Ответ на: комментарий от andreyu

Благодаря вашему комменту, я расширил исходный пост примером про r и w.

Вывод: Выделяется фрагмент текста через V, сохраняется в файл :‘<,’>w file.name или :‘<,’>w! file.name для перезаписи. Файл считать в текст :r file.name, можно считать результат работы скрипта :r !nu file.nu.

lbvf50txt
() автор топика
Ответ на: комментарий от lbvf50txt

Реализовано решение для использования Vim с движком Godot.

Изначально был (и есть) плагин, потом я чуть упрощенный синтаксис добавил в вим https://github.com/vim/vim/blob/master/runtime/syntax/gdscript.vim#L1-L5 а в свой конфиг обвес по запуску и прочее.

В целом, от написания плагинов ушел в просто написание чего-нить для себя. Иногда оно попадает в сам вим.

habamax ★★★
()