2012-07-03 2 views
6

Я часто работаю над файлами CSS или другими файлами, которые требуют спрятать числа. Мне очень хотелось бы иметь ключ, который ссылается на целые числа в том смысле, что w относится к слову, или ( относится к предложению. Например, в файле css я мог бы перейти к началу объявления высоты и изменить его значение, не перепечатывая «px» в конец, что и происходит, если я использую w.Есть ли способ получить целые движения объектов в vim?

Есть ли такая вещь, но мне не хватает ее в документации, или есть способ добавить эту функцию в мой .vimrc?

Бонусные баллы, если есть способ использовать его как ci", где я мог бы быть в начале строки и использовать команду «изменить внутреннюю», чтобы перейти к И изменить следующее целое число.

Больше бонусных очков, если бы я мог делать простые арифметические операции. Мне очень хотелось бы дать краткую команду, которая была бы короткой для «Добавить тоже, внутренняя, целая, 5» и иметь следующее целое число в текущей строке - пять террей, тогда это было, когда я начал.

Edit:

Некоторых действительно большие предложения всем, некоторые большие идеи, которые уверены, чтобы улучшить свою работу. Благодаря! Ответ Хассека, вероятно, скорее всего, окажется в моем рабочем потоке, но никто из других, похоже, не ответил (полностью) на мой внутренний вопрос: движение, которое работает на целые числа. Предложение, найденное romainl, похоже, имеет эту цель , но я не могу заставить его работать надежно.

Для себя (и других, возможно) я уточню мои желания ниже:

ключа, который действует много на пути w актов для слов, но на целых числах, так что я могу просто добавить его в моем психическом vim и использовать его без проблем. Это включает в себя следующие сценарии. (Я буду использовать d как мой пример ключ):

  1. Нормальный режим d: Переход к следующему целому числу
  2. Нормальный режим cd: Изменение к концу целых под курсором (Обратите внимание, что cw специальные случай, который ДОЛЖЕН сменить на слово NEXT. cw действительно действует как ce.) Я ожидал бы, что этот специальный случай будет реализован с целыми числами также
  3. Визуальный режим id: Выберите [count] целые числа.
  4. Визуальный режим ad: Выберите [count] целые числа. Включено бегущее или бегущее пространство.

У меня отсутствует какое-либо поведение, которое может ожидать w для нового движения? Есть ли даже ключ, доступный как в нормальном, так и в визуальном режимах?

+3

'^ A' увеличивает целое число,'^Z' уменьшает целое число. 'f0' перейдет к следующей' 0' в текущей строке. – sarnold

+4

вы ошибочно указали '^ X', а не'^Z'. – Benoit

ответ

4

Смотрите this proposal. Выглядит хорошо.

редактировать

Действительно, что один очень приятно. Это заставило меня подумать, что моя привычка делать /<number><Esc> была не очень эффективной, поэтому я добавил эти сопоставления (и немного изменил сопоставления выше для согласованности) на мой ~/.vimrc. Давайте посмотрим, если они полезны в долгосрочной перспективе:

nnoremap è /\v\d+<CR> 
nnoremap é ?\v\d+<CR> 

На первый взгляд, èciè132<Esc>, кажется, немного лучше, чем /2<Esc>{count}s132<Esc> с точки зрения нажатиями, но значительно лучше, если это позволяет мне пропустить. проверяя первую цифру значения, которое я хочу изменить, и b. считая символы для замены.

Время покажет.

повторно редактировать

Вот функция и ее отображения:

onoremap N :<c-u>call <SID>NumberTextObject(0)<cr> 
xnoremap N :<c-u>call <SID>NumberTextObject(0)<cr> 
onoremap aN :<c-u>call <SID>NumberTextObject(1)<cr> 
xnoremap aN :<c-u>call <SID>NumberTextObject(1)<cr> 
onoremap iN :<c-u>call <SID>NumberTextObject(1)<cr> 
xnoremap iN :<c-u>call <SID>NumberTextObject(1)<cr> 

function! s:NumberTextObject(whole) 
    normal! v 

    while getline('.')[col('.')] =~# '\v[0-9]' 
     normal! l 
    endwhile 

    if a:whole 
     normal! o 

     while col('.') > 1 && getline('.')[col('.') - 2] =~# '\v[0-9]' 
      normal! h 
     endwhile 
    endif 
endfunction 

С этим, я могу:

  • vcdy часть числа от курсор до конца с <command>N. Как-то аналогично <command>e или <command>w.

    Here are some random numbers: 24 7635 1000018 
                 ^---> 
    

    Это не работает, если курсор еще не находится на номере, и он не возвращается назад.

  • vcdy целое число с <command>iN.

    Here are some random numbers: 24 7635 1000018 
                 <-^---> 
    

    Опять же, это не работает, если курсор еще не находится на номере.

Все это может быть улучшено, конечно, но это начало!

EndEdit

Я много работаю с CSS, тоже.

Я использую две стратегии для изменения числовых значений:

  • {count}<C-a> и {count}<C-x>, как в ответ Hassek, в когда я знаю, сколько я хочу увеличения/уменьшения числа. Скажем, я хочу превратить 20px в 25px, простой 5<C-a> делает трюк, не требуя от меня переместить курсор на номер. Это чрезвычайно классно.

  • /<number><CR>{count}s<new number>, когда новое значение сильно отличается от текущего значения, и я чувствую себя ленивым, чтобы вычислить дельту. /2<CR>2s67<Esc> позволит мне изменить 23px на 67px. /2<CR>R67<Esc> - это еще один способ, но это только хорошо, если новое значение имеет ту же длину, что и текущее значение. Используйте f<number>, если вы находитесь на одной линии.

Обратите внимание, что вы можете вставить результат выражения с <C-r>=137-42<CR>, которые я использую его очень часто, как хорошо.

+0

очень приятно '/ {count} s ' trick :) – Hassek

+0

Спасибо за отслеживание этого предложения. Это очень похоже на то, что я изначально искал. Во-первых, чтобы получить фактический код в скопированном формате, мне пришлось использовать этот URL-адрес: http://sprunge.us/QTPL Во-вторых, я не мог заставить его работать надежно. По какой-то причине он работает только в любое время (или там что-то вроде). Может быть, что-то связано с нативной функцией 'N'? –

+0

@JordanEldredge, см. Мое редактирование. Кажется, это работает для меня, но это далеко не полное решение. – romainl

8

вы можете добавить или вычесть из целых чисел с помощью этой команды:

<num>Ctrl-a (to add) 
<num>Ctrl-x (to substract) 

, и он будет идти прямо к следующему номеру в строке и выполнить команду

+1

Жаль, что я получил только один голос. Это круто. Благодаря! – sarnold

+0

Ну, это отвечает на вопрос о бонусе и, вероятно, выполнит свою работу. Это решает мой самый распространенный случай: «Мне нужно вымыть этот ящик более чем на 5 пикселей». Мне все равно хотелось бы знать, как изменить (переписать) целое число, если это вообще возможно. Если такая функция не существует (или появляется здесь в ближайшее время), у вас есть мой ответ. Спасибо! –

+1

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

3

я нашел что-то в глубинах internetz here и модифицировали его, как этот

nnoremap ,n /\v\d+/b<cr>mah/\v\d+/e<cr>mb`av`b 
vnoremap ,n <esc>/\v\d+/b<cr>mah/\v\d+/e<cr>mb`av`b 
  • \v\d+ море rches для группы цифр
  • /b + mah идет к своему b eginning, устанавливает метку и идет один символ назад, чтобы мы могли снова
  • \v\d+ поиск той же группы цифр
  • /e + mb переходит к его конец и устанавливает другую метку и наконец
  • `av`b визуально выбирает от первого до второго знака
+0

черт возьми, это действительно так, как будто я катил головой по клавиатуре. – epsilonhalbe

+0

Кто знает? Может быть, можно было бы найти полезное регулярное выражение. Кто-то с очень заостренной/колючей головой. – romainl

+0

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

Смежные вопросы