Как я могу вставить (перезапись) с энергией?

Я сталкиваюсь с подобными проблемами. Мой подход должен был записать псевдонимы оболочки или функции для наиболее распространенных мер, которые я принимаю. Для ссылки это функции оболочки ZSH. Сами функции должны работать в ударе также, но материал завершения оболочки отличался бы.

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

Для этого для работы Вы вставили бы код Ваш ~/.zshrc файл (или ~/.bashrc для удара).

Вот основная функция, которую я использую (каждый день):

function svnlist () {
    if [ -z "$2" ]; then
        case $1 in
            clobered)
                svn status | grep '^~' | cut -c9-
                ;;
            missing)
                svn status | grep '^\!' | cut -c0-
                ;;
            unknown)
                svn status | grep '^\?' | cut -c9-
                ;;
            conflicted)
                svn status | grep '^C' | cut -c9-
                ;;
        esac
    else
        case $2 in
            add)
                $0 unknown | xargs -iX svn add "X"
                ;;
            del)
                $0 missing | xargs -iX svn del "X"
                ;;
            revert) $0 conflicted | xargs -iX svn revert "X"
                ;;
            resolved) $0 conflicted | xargs -iX svn resolved "X"
                ;;
            unclober)
                mkdir _tmp
                $0 clobered | while read item; do
                    mv "$item" _tmp
                    svn del "$item"
                done
                svn ci -m "Unclobering files. (removing old)"
                mv _tmp/* .
                rmdir _tmp
                $0 unknown add
                svn ci -m "Unclobering files. (adding new)"
                ;;
        esac
    fi
}

alias svndiff="svn diff -x -b | colordiff"
compctl -x 'p[1]' -k '(missing unknown conflicted clobered)' - 'p[2]' -k '(add del revert resolved)' -- svnlist

Это должно позволить Вам выполнять что-то как svnlist unknown найти все файлы в текущем каталоге, которые являются неимеющими версию и svnlist unknown add дополнительно добавить их всех. svnlist clobered revert нашел бы все файлы, которые были clobered после обновления и возвращаются их. svnlist conflicted resolved отметил бы все конфликты, как разрешено. svnlist missing del отметил бы любые файлы, пропавшие без вести как удаляемый в репозитории.

Также, если Вы сталкиваетесь с ним, вот один для редактирования сообщения журнала определенного пересмотра. Я не использую это так больше, но я сделал много ошибок вначале, и предпочтите сохранять сообщения журнала опрятными:

function svneditlog () {
    rev=$1
    if ! echo $rev | pcregrep '^[0-9]+$'; then
        echo "Invalid usage. svneditlog REV"
        return
    fi
    svn info | grep ^URL: | awk '{print $2}' | read url
    svn propedit -r $rev --revprop svn:log $url
}

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

32
18.04.2019, 15:08
5 ответов

По умолчанию команды вставки используют " регистр (“без имени”). Эффективно, любая команда, которая пишет в регистр также, пишет в регистр без имени, так рывки, удаляет и изменяет все влияние он. Поэтому Ваша последовательность yank-delete-paste вставляет удаленный текст вместо дергавшего текста.

0 регистр может помочь здесь. Любые команды рывка, которые не указывают регистр, помещают дергавший текст в регистр 0 (в дополнение к "). Это не затронуто, удаляют или изменяют операции, таким образом, можно использовать его для вставки дергавшей строки многократно, даже если Вы действительно посредничаете, удаляет или изменяется.

  1. yy: Регистры 0 и " у обоих теперь есть дергавшая строка.
  2. Переместитесь в строку для замены.
  3. dd:Зарегистрироваться " теперь имеет удаленную строку, но регистр 0 все еще имеет дергавшую строку.
    "0P: Вставьте первоначально дергавшую строку от регистра 0.
  4. Переместитесь в следующую строку для замены.
  5. dd"0P (то же как выше)

(Из-за пути расположение курсора работает при замене последней строки буфера, Вы захотите использовать "0p вместо "0P.)

Это очень близко к ответу Bruce Ediger, за исключением того, что Вы не должны указывать регистр при начальном дергании. Используя один или несколько именованных регистров может быть очень удобным хотя, если необходимо (например), заменить некоторые строки AAA, но другие строки с BBB (помещенный AAA в регистре a, и BBB в регистре b (или оставьте одного из них в регистре 0), затем вставьте их соответственно).

Можно также вставить от 0 в мудром строкой визуальном режиме (V) сохранить нажатие клавиши: V"0p.

Если Вам не нравится иметь необходимость ввести "0, Вы могли бы найти отображение более удобным:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Альтернативный подход должен удалить к _ (“черная дыра”) регистр. Когда Вы удаляете к нему, " регистр не затронут, таким образом, Ваша последовательность yank-delete-paste может все еще вставить дергавший текст от регистра без имени.

  1. yy:Зарегистрироваться 0 и " у обоих теперь есть дергавшая строка.
  2. "_dd: Никакое изменение в регистрах.
    P: Вставьте первоначально дергавший текст от регистра ".

Снова, Вы могли бы найти отображение более удобным:

noremap <Leader>d "_d
29
27.01.2020, 19:37
  • 1
    Или, tl; доктор, просто используйте yy (переместитесь в строку, которая будет заменена), S<C-r>0<Esc>. Имеет преимущество того, чтобы быть повторяемым с . команда. –  Wildcard 26.04.2016, 04:53

Похож на Kevin, имеет довольно хороший ответ, но если Вы хотите увидеть каждую строку, Вы удаляете, затем заменяете, немного отличающееся решение существует.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Этот вид рецепта позволяет Вам использовать сопоставление с образцом, чтобы найти, что строки удаляют и заменяют, и можно вернуться к запуску файла (1G) и искать вперед так часто, как Вам нравится. Если у меня есть 2 или больше строки, чтобы собраться и неоднократно помещать, я использую "ayy для первой строки, "byy для второго, "cyy для третьего, и т.д. Я сделал привычку (который уменьшает общность рецепта) уменьшить умственную нагрузку на меня.

11
27.01.2020, 19:37
  • 1
    . Таким образом, если я использую "ayy и затем dd, dd не заменит то, что находится в a, но если я ввожу p это вставит то, что было просто удалено с помощью dd. И если я хотел заменить то, что находится в "ayy с тем, что я удаляю, затем я использовал бы "add - это правильно? –  cwd 15.12.2011, 06:42
  • 2
    "ayy копирует строку в регистр 'a'. "dd" сокращает строку в регистр по умолчанию, не 'a'. 'p' вставляет регистр по умолчанию, корректный. И да, "добавьте, сокращает строку в регистр, который заменил бы содержание от "ayy команда. –  Bruce Ediger 17.12.2011, 00:02

Существует пара способов сделать это с :sВ зависимости от того, сколько ввода Вас хотят сделать. Самым легким путем является простой поиск и замена:

:%s/find this line/replace with this/

% будет искать целый файл и заменять все случаи.

Если это очень вводит для Вас, можно дергать целевую строку (yy) и используйте " регистр (по умолчанию), вставляя его с Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Или, если у Вас есть копия замещающей строки, можно дергать два в отдельные регистры с "ayy и "byy дергать в a и b регистры, соответственно (можно использовать любую букву для регистров). Затем используйте Ctrl+r a и Ctrl+r b для вставки их в поля замены и поиск.

Для не переигрывания Bruce но если Вы хотите проверить строки перед заменой их, просто добавьте c опция:

:%s/find this line/replace with this/c
5
27.01.2020, 19:37

Вы могли использовать V для выделения строки, Вы хотите заменить в Визуальном Режиме и затем совершить нападки pp вставлять по той строке.

Это только добавляет одно нажатие клавиши, таким образом, оно походит на довольно хорошее решение.

2
27.01.2020, 19:37
  • 1
    Это не работает: после вставки буфер обмена содержит текст, который был отмечен V –  daniel kullmann 12.12.2011, 22:43
  • 2
    Просто сингл p. –  Aaron Thoma 04.06.2015, 22:26

Я использую C , «Изменить», команду довольно часто для такого рода вещей, в сочетании с регулярным поиском. Вы можете искать файл для каждой строки / листа, который вы заинтересованы, а затем используете подряд n. команды ( п на следующую, а затем , чтобы повторить последнее изменение..)

/ ^ Привет - находка линия, начиная с приветом;
гр $ woodbye - изменить линию до свидания;
n. - Повторите находку, повторите изменение

Если вы хотите изменить строку на один уже в файл, вы можете просто скопировать его на свой входной буфер (при условии, что ваш GUI разрешает его), а затем вставьте, чтобы получить содержимое Первая команда изменений.

Как и во всем VI, это хорошая идея, чтобы иметь много вариантов в вашем кармане, в зависимости от того, что за редактирование вы хотите сделать.

2
27.01.2020, 19:37

Теги

Похожие вопросы