Vim: конвертировать карту в команду - PullRequest
2 голосов
/ 14 сентября 2011

Я хотел бы преобразовать это map в command. Я попробовал «очевидное» копирование командной части строки map в строку command:

command SortWords d:execute 'normal i' . join(sort(split(getreg('"'))), ' ')<CR>

Тем не менее, при использовании этого с выделенным текстом это просто не с "E481: No range allowed". Мой гугл-фу недостаточно силен, и руководство ... можно, например, разобрать на компьютере.

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011
command! -nargs=0 -range SortWords exe 'norm! gvd'|call setreg('"', join(sort(split(@")), ' '), visualmode()[0])|norm! P

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

Чтобы избежать этого, вы должны сохранить регистр и восстановить его, когда закончите.Лучший способ сделать это - использовать функцию.

command! -nargs=0 -range SortWords call VisualSortWords()

function! VisualSortWords()
  let rv = @"
  let rt = getregtype('"')
  try
    norm! gvy
    call setreg('"', join(sort(split(@")), ' '), visualmode()[0])
    norm! `>pgvd
  finally
    call setreg('"', rv, rt)
  endtry
endfunction
3 голосов
/ 14 сентября 2011

Вот другой подход, который использует только 2 команды (: вызов и : удаление ).Процесс описан ниже.

command! -range -nargs=0 Sort
  \ call append(<line2>,join(sort(split(join(getline(<line1>,<line2>)))), ' ')) |
  \ <line1>,<line2>d _

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

Сама команда

Команда определена как «Сортировка» и имеет две специальные характеристики:

  • -range, очевидно, позволяет получать диапазон.Кроме того, он устанавливает диапазон по умолчанию для текущей строки (см. Справку для : диапазон команд ).
  • -nargs=0 может быть опущен, поскольку он гарантирует только вас или будущих пользователейвашей команды не будет передавать ей никаких аргументов.

Перед обработкой команды текст, помеченный как <line1>, будет заменен номером строки начала диапазона.Аналогично, <line2> будет заменен номером строки конца диапазона.Проверьте справку по и последующие строки, чтобы узнать больше о замене текста в командах.

Что она делает

Команда выполнит свою задачу в два раза.Первый - это цепочка функций, которые можно прочитать изнутри.Давайте рассмотрим, что команда была вызвана с диапазоном визуального выбора ('<, '>), который переводится как (1,3).Функции будут выполняться следующим образом:

append(3, join(sort(split(join(getline(1,3)))), ' '))

С другой точки зрения:

#1 getline(1,3)  " the result is a list with text from lines 1 to 3
#2 join(#1)      " joins that list into a string
#3 split(#2)     " splits the string on whitespace, resulting in a list
#4 sort(#3)      " sorts that list
#5 join(#4, ' ') " joins the elements into a string separated by single space
#6 append(3, #5) " insert that string after line 3

Если вы начали с этого текста:

f e
d c
b a

Теперь выдолжно иметь следующее:

f e
d c
b a
a b c d e f

Это просто вопрос удаления этих строк.Это именно то, что делает следующая часть команды:

1,3d _

d является сокращением для команды ex : delete , а _ является регистром для помещенияудаленный текст. В данном случае это регистр черная дыра .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...