Обрабатывать выбор vim Ruby и заменять содержимое - PullRequest
4 голосов
/ 09 января 2020

Как мне выполнить выделение через скрипт Ruby и заменить его последним возвращаемым значением этого скрипта?

Например, у меня есть эти строки

12|22|33

, и я хочу удвоить цифры

24|44|66

Я не знаю vim way (но я хотел бы знать, может ли кто-нибудь помочь) но я ' Я знаю Ruby way

# assuming the text is in variable "line"
line.split("|").map(&:to_i).map { |no| no*2 }.join("|")

Конечно, я мог бы написать Ruby скрипт, который принимает аргументы и вызывает его с помощью :!my_script.rb %, но я бы хотел предоставить код Ruby напрямую в действ.

Ответы [ 2 ]

4 голосов
/ 09 января 2020

Вы можете использовать :h s/\\=, что позволит вам делать вычисления на совпадение:

:s/\d\+/\=submatch(0)*2/g
2 голосов
/ 09 января 2020

Ruby имеет параметр -e, который полезен при предоставлении коротких кодов:

:!ruby -e 'puts $_.split("|").map(&:to_i).map { |no| no*2 }.join("|") while gets'

Если вы хотите выполнить код только для одной строки, вы можете пропустить while -l oop:

:!ruby -e 'puts gets.split("|").map(&:to_i).map { |no| no*2 }.join("|")'

При выполнении команды терминала выбранные строки отправляются на него в качестве стандартного ввода. gets будет читать из стандартного ввода.

Документация Kernel#gets:

получает (sep = $ / [, getline_args]) → строка или ноль клик, чтобы переключить источник Возвращает ( и присваивает $_) следующую строку из списка файлов в ARGV (или $*), или из стандартного ввода, если в командной строке нет файлов . Возвращает nil в конце файла. Необязательный аргумент указывает разделитель записей. Разделитель включен с содержанием каждой записи. Разделитель nil считывает все содержимое, а разделитель нулевой длины - вводит один абзац за раз, когда абзацы разделяются двумя последовательными символами новой строки. Если первый аргумент является целым числом или задан необязательный второй аргумент, возвращаемая строка не будет длиннее заданного значения в байтах. Если в ARGV присутствует несколько имен файлов, gets(nil) будет считывать содержимое по одному файлу за раз. ARGV << "testfile" print while gets создает: This is line one This is line two This is line three And so on... стиль программирования с использованием $_ в качестве неявного параметра постепенно теряет популярность в сообществе Ruby.

Вы можете сократить вышеприведенное, используя флаг -p или -n, который переносит код внутри while gets l oop:

:!ruby -ne 'puts $_.split("|").map(&:to_i).map { |no| no*2 }.join("|")'

или

:!ruby -pe '$_ = $_.split("|").map(&:to_i).map { |no| no*2 }.join("|")'

со страницы man ruby:

     -n             Causes Ruby to assume the following loop around your
                    script, which makes it iterate over file name arguments
                    somewhat like sed -n or awk.

                          while gets
                            ...
                          end

     -p             Acts mostly same as -n switch, but print the value of
                    variable $_ at the each end of the loop.  For example:

                          % echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"'
                          MATZ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...