Вырвите первое слово из каждой строки в VIM - PullRequest
1 голос
/ 01 июня 2019

Я использую vim и хочу скопировать первое слово для ряда последовательных строк.Единственное, о чем я мог подумать, это :4,32yw (для строк 4-32), но это не сработало.Любая помощь оценивается заранее, спасибо!

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Вы можете сделать это, но это может быть немного сложнее, чем использовать простую команду, как вы это делали.

То, что вы пытались запустить, это команды обычного режима как команды выполнения.Это не сработает, как вы это сделали.Команды в обычном режиме (например, нажатие yw) не будут работать в ex-командах.


Для запуска команд в обычном режиме в режиме ex-command вы должны использовать normalкоманда (для получения дополнительной информации, вы можете увидеть :help normal).Однако, даже если вы измените свою команду на использование команды нормального режима (что-то вроде :4,32 normal! yw), она все равно не будет работать, так как она будет выполняться для каждой строки, каждый раз, когда выполняется предыдущее значение.

Вы можете выполнить желаемое действие, используя регистр vim, который добавит слово в каждый цикл (для получения дополнительной информации о регистрах вы можете прочитать :help registers).


Чтобы сделать это, вы должны изменитькоманда должна быть чем-то вроде :3,32 normal! ^"Ayw.

Чтобы разбить эту команду:

  • : - войти в режим ex-command.
  • 3,32- Диапазон для запуска команды.
  • normal! - Фактическая команда для запуска.Запустите его без какого-либо пользовательского сопоставления, чтобы избежать сопоставлений, которые пересекают требуемое действие.
  • ^ - Перейти к началу строки.
  • "A - Запустить рывок врегистр, добавляющий данные к ранее сохраненным в нем данным.
  • yw - восстановить текущее слово.

Позже, чтобы распечатать скопированные значения, вы должны использовать "ap (в обычном режиме) в нужном месте.

Недостатки

Обратите внимание, что команда вставляет новое слово в регистры, игнорируя первое значение регистра.Это означает, что если регистр не был пустым после выполнения этой команды, все слова будут добавлены к текущему значению регистра.

Чтобы очистить предыдущее значение регистра, вы можете выполнить команду:

:let @a=''

перед запуском команды yank.

Автоматизация

Если вы хотите сделать это много раз, вы можете захотеть использовать простую функцию, которая сделает все за вас, вместо этого заставляя вас запускать обе команды каждый раз.


Простая функция, которая сделает это:

function! CopyFirst(register) range
    execute "let @" . a:register. "=''"
    execute a:firstline . "," . a:lastline . "normal! ^\"" . toupper(a:register) . "yw"
endfunction

Использование:

:3, 32 call Copyfirst('a')
"ap
1 голос
/ 02 июня 2019

Эта функция использует диапазон функций (подробнее об этой функции в :help func-range):

" Get the first word of the line for a given range of lines
function! GetFirstWord() range
    let @a=""
    execute a:firstline.",".a:lastline."g/.*/y A"
    echo split(substitute(@a," *\\(\\w\\+\\).\\{-}\\n","\\1 ","g"))
endfunction

Первая строка очищает регистр a .Вторая строка объединяет строки внутри диапазона в регистр a .В последней строке печатается список с первыми словами каждой строки.Пример входного файла:

some sample
   text abc
   123 456
function
yy xx

Пример вызова и вывода:

:2,4call GetFirstWord()
['text', '123', 'function']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...