О каких темных углах Вима твоя мама никогда не говорила? [закрыто]

Существует множество вопросов, где люди говорят о распространенных уловках, а именно: « Vim + ctags tips and tricks ».

Тем не менее, я не имею в виду часто используемые ярлыки, которые новичок в Vim посчитал бы крутыми. Я имею в виду опытного пользователя Unix (будь то разработчик, администратор и т. Д.), Который думает, что знает что-то, о чем 99% из нас никогда не слышали и не мечтали. То, что не только облегчает их работу, но и делает COOL и хакерским . В конце концов, Vim находится в самой богатой темными углами ОС в мире, поэтому у него должны быть тонкости, о которых только немногие привилегированные знают и хотят поделиться с нами.

782
задан 22 revs, 6 users 60%Sasha 23 May 2017 в 12:34
поделиться

52 ответа

Не мог бы быть тот, о котором не знают 99% пользователей Vim, но это - что-то, что я ежедневно использую и что любой Linux+Vim poweruser должен знать.

Основная команда, все же чрезвычайно полезная.

:w !sudo tee %

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

Очевидно, необходимо быть в системе с установленным sudo и иметь sudo права.

776
ответ дан 22 November 2019 в 21:19
поделиться

Это - хороший прием для повторного открытия текущего файла с другим кодированием:

:e ++enc=cp1250 %:p

Полезный, когда необходимо работать с кодировкой прежней версии. Поддерживаемая кодировка перечислена в таблице под encoding-values (см. help encoding-values). Подобная вещь также работает на ++ff, так, чтобы можно было вновь открыть файл с концами строки Windows/Unix, если Вы понимаете его превратно впервые (см. help ff).

47
ответ дан 22 November 2019 в 21:19
поделиться

Принятию Вас скомпилировали Perl и/или поддержку Ruby в, :rubydo и :perldo выполнит Ruby или остроту Perl на каждой строке в диапазоне (значения по умолчанию ко всему буферу), с $_ связанный с текстом текущей строки (минус новая строка). Управление $_ изменит текст той строки.

Можно использовать это, чтобы сделать определенные вещи, которые легко сделать в языке сценариев, но не так очевидный Vim использования builtins. Например, инвертировать порядок слов в строке:

:perldo $_ = join ' ', reverse split

Вставить случайную строку 8 символов (A-Z) в конце каждой строки:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

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

55
ответ дан 22 November 2019 в 21:19
поделиться

Хотите посмотреть свою историю команд?

q:

Затем просмотрите, отредактируйте и, наконец, выполните команду.

Когда-нибудь вносить подобные изменения в два файла и переключаться между ними? (Скажите, файлы источника и заголовка?)

:set hidden
:map <TAB> :e#<CR>

Затем переходите туда-сюда между этими файлами.

92
ответ дан 22 November 2019 в 21:19
поделиться

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

:g/match/y A

восстановит (скопирует) все строки, содержащие «match», в регистр a / @a (заглавная буква A делает vim добавьте янки вместо замены предыдущего содержимого регистра.) В последнее время я часто использовал его при создании таблиц стилей Internet Explorer.

98
ответ дан 22 November 2019 в 21:19
поделиться
:%!xxd

Превратите энергию в Hex-редактор.

:%!xxd -r

Вернуться.

Предупреждение: Если Вы не редактируете с двоичным файлом (-b), Вы могли бы повредить файл. – Josh Lee в комментариях.

185
ответ дан 22 November 2019 в 21:19
поделиться

Не точно неясный, но существуют, несколько "удаляют в" командах, которые чрезвычайно полезны, как..

  • diw удалить текущее слово
  • di( удалить в текущем parens
  • di" удалить текст между кавычками

Другие могут быть найдены на :help text-objects

310
ответ дан 22 November 2019 в 21:19
поделиться

:! [команда] выполняет внешнюю команду, пока вы находитесь в Vim.

Но добавьте точку после двоеточия, :.! [команда] , и она выведет вывод команды в ваше текущее окно. Это : !

Например:

:.! ls

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

:.! date
406
ответ дан 22 November 2019 в 21:19
поделиться

Что-то я просто недавно обнаружил, что думал, было очень прохладно:

:earlier 15m

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

609
ответ дан 22 November 2019 в 21:19
поделиться
imap jj <esc>
42
ответ дан 22 November 2019 в 21:19
поделиться

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

map + <C-W>+
map - <C-W>-

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

24
ответ дан 22 November 2019 в 21:19
поделиться

Часто, мне нравится изменять текущие каталоги при редактировании - таким образом, я должен указать пути меньше.

cd %:h
26
ответ дан 22 November 2019 в 21:19
поделиться

Not exactly a dark secret, but I like to put the following mapping into my .vimrc file, so I can hit "-" (minus) anytime to open the file explorer to show files adjacent to the one I just edit. In the file explorer, I can hit another "-" to move up one directory, providing seamless browsing of a complex directory structures (like the ones used by the MVC frameworks nowadays):

map - :Explore<cr>

These may be also useful for somebody. I like to scroll the screen and advance the cursor at the same time:

map <c-j> j<c-e>
map <c-k> k<c-y>

Tab navigation - I love tabs and I need to move easily between them:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Only on Mac OS X: Safari-like tab navigation:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
30
ответ дан 22 November 2019 в 21:19
поделиться

Давайте посмотрим, что некоторый симпатичный маленький редактор IDE делает перемещение столбца.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Объяснение

\( и \) то, как помнить материал на regex-земле. И \1, \2 и т.д. то, как получить помнивший материал.

>>> \(.*\)^I\(.*\)

Помните все сопровождаемое ^I (вкладка) сопровождается всем.

>>> \2^I\1

Замените вышеупомянутый материал "2-м материалом, который Вы помнили" сопровождаемый "1-м материалом, который Вы помнили" - по существу выполнение транспонирования.

37
ответ дан 22 November 2019 в 21:19
поделиться

Иногда настройка в вашем .vimrc будет переопределена плагином или автокомандой. Для отладки этого полезного трюка является использование команды: verbose в сочетании с: set. Например, чтобы выяснить, где Cindent получил установлен / не установлен:

:verbose set cindent?

Это выведет что-то вроде:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Это также работает с картами и бликами. (Спасибо joeytwiddle за указание на это.) Например:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim
118
ответ дан 22 November 2019 в 21:19
поделиться

de Удалить все до конца слова, нажав. по желанию вашего сердца.

ci (xyz [Esc] - Это странное. Здесь 'i' не означает режим вставки. Вместо этого он означает внутри скобок. Таким образом, эта последовательность вырезает текст в круглых скобках вы стоите и заменяете его на «xyz». Он также работает внутри квадратных и фигурных скобок - просто сделайте ci [или ci {соответственно. Естественно, вы можете сделать di (если вы просто хотите удалить весь текст без введите что-нибудь. Вы также можете сделать a вместо i , если вы хотите удалить также скобки, а не только текст внутри них.

ci " - вырезает текст в текущих кавычках

ciw - вырезает текущее слово. Ctrl + Y и Ctrl + E прокручивают вниз или вверх по одной строке за раз.

Сумасшедшая, но очень полезная команда - это zz - она ​​прокручивает экран, чтобы эта строка появилась посередине. Это отлично подходит для помещения фрагмента кода, над которым вы работаете, в центр вашего внимания. Сестринские команды - zt и zb - делают эту строку верхней или нижней на экране, что не так полезно.

% находит и переходит к соответствующей круглой скобке.

de - удалить от курсора до конца слова (вы можете также сделать dE , чтобы удалить до следующего пробела)

bde - удалить текущее слово, слева направо, разделитель

df [пробел] - удалять до следующего пробела включительно

dt. - удалять до следующей точки

dd - удалять всю эту строку

ye (или yE) - переносить текст отсюда до конца слова

ce - прорезает конец слова

пока - копирует текущее слово (меня интересует, что делает «привет»!)

уу - копирует текущую строку

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

viwy или viwc . Снять или изменить текущее слово. Нажмите w несколько раз, чтобы выбрать каждое последующее слово, используйте b для перемещения назад

vi { - выделите весь текст в квадратных скобках.

236
ответ дан 22 November 2019 в 21:19
поделиться

Я использую vim практически для любого редактирования текста, поэтому часто использую функции копирования и вставки. Проблема в том, что vim по умолчанию часто искажает импортированный текст с помощью вставки. Чтобы остановить это, используйте

:set paste

перед вставкой ваших данных. Это предотвратит появление ошибок.

Обратите внимание, что вам придется выполнить команду : установите nopaste для восстановления автоиндентирования. Альтернативными способами вставки предварительно отформатированного текста являются регистры буфера обмена ( * и + ) и : r! Cat (вам придется завершить вставленный фрагмент с ^ D).

Иногда полезно включить высококонтрастную цветовую схему. Это можно сделать с помощью

:color blue

. Я заметил, что он работает не на всех версиях vim, которые я использую, а на большинстве.

17
ответ дан 22 November 2019 в 21:19
поделиться
:r! <command>

вставляет вывод внешней команды в буфер.

Выполните некоторые вычисления и получите результат прямо в тексте:

:r! echo $((3 + 5 + 8))

Получите список файлов для компиляции при записи Makefile :

:r! ls *.c

Не ищите тот факт, который вы читаете в Википедии, просто вставьте его прямо в документ, который вы пишете:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
22
ответ дан 22 November 2019 в 21:19
поделиться

I just found this one today via NSFAQ:

Comment blocks of code.

Enter Blockwise Visual mode by hitting CTRL-V.

Mark the block you wish to comment.

Hit I (capital I) and enter your comment string at the beginning of the line. (// for C++)

Hit ESC and all lines selected will have // prepended to the front of the line.

19
ответ дан 22 November 2019 в 21:19
поделиться

Тот, который я редко нахожу в большинстве руководств по Vim, но он НЕВЕРОЯТНО полезен (по крайней мере, для меня), это

g; и g,

для перемещения (вперед, назад) по списку изменений.

Позвольте мне показать, как я его использую. Иногда мне нужно скопировать и вставить фрагмент кода или строку, скажем, шестнадцатеричный цветовой код в файл CSS, поэтому я ищу, прыгаю (не заботясь о том, где находится совпадение), копирую его, а затем возвращаюсь (g;) туда, где Я редактировал код, чтобы наконец вставить его. Не нужно создавать отметки. Проще.

Только мои 2 цента.

202
ответ дан 22 November 2019 в 21:19
поделиться

Мне нравится использовать sudo bash, а моему системному администратору это не нравится. Он заблокировал sudo, поэтому его можно было использовать только с несколькими командами (ls, chmod, chown, vi и т. Д.), Но я все равно смог использовать vim для получения оболочки root:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#
27
ответ дан 22 November 2019 в 21:19
поделиться

Сопоставьте F5 для быстрого ROT13 вашего буфера:

map <F5> ggg?G``

Вы можете использовать его как ключ босса :).

21
ответ дан 22 November 2019 в 21:19
поделиться

^ O и ^ I

Перейти к старому / новому положению. Когда вы перемещаетесь по файлу (путем поиска, перемещения команд и т. Д.) Vim запоминает эти «прыжки», чтобы вы могли повторять эти прыжки назад (^ O - O для старого) и вперед (^ I - рядом с I на клавиатуре. ). Я считаю это очень полезным при написании кода и выполнении большого количества поисков.

gi

Перейти в позицию, где режим вставки был остановлен последним. Я часто редактирую, а потом что-то ищу. Чтобы вернуться к месту редактирования, нажмите gi.

gf

поместите курсор на имя файла (например, включить файл заголовка), нажмите gf, и файл откроется

gF

аналогично gf, но распознает формат "[файл имя]: [номер строки] ". Нажатие gF откроет [имя файла] и установит курсор на [номер строки].

^ P и ^ N

Автозаполнение текста при редактировании (^ P - предыдущее совпадение и ^ N следующее совпадение)

^ X ^ L

При редактировании завершается в той же строке (полезно для программирования). Вы пишете код, а затем вспоминаете, что у вас есть тот же код где-то в файле. Просто нажмите ^ X ^ L, и вся строка будет заполнена

^ X ^ F

Полные имена файлов. Вы пишете "/ etc / pass" Хм. Вы забыли имя файла. Просто нажмите ^ X ^ F, и имя файла будет завершено

^ Z или: sh

Временное перемещение в оболочку. Если вам нужен быстрый удар:

  • нажмите ^ Z (чтобы поместить vi в фоновый режим), чтобы вернуться к исходной оболочке, и нажмите fg, чтобы вернуться в vim назад
  • нажмите: sh, чтобы перейти к дополнительной оболочке, и нажмите ^ D / exit чтобы вернуться в vi назад
54
ответ дан 22 November 2019 в 21:19
поделиться
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
47
ответ дан 22 November 2019 в 21:19
поделиться

Macros can call other macros, and can also call itself.

eg:

qq0dwj@qq@q

...will delete the first word from every line until the end of the file.

This is quite a simple example but it demonstrates a very powerful feature of vim

68
ответ дан 22 November 2019 в 21:19
поделиться

Я люблю: команду ls.

3
ответ дан 22 November 2019 в 21:19
поделиться

Put this in your .vimrc to have a command to pretty-print xml:

function FormatXml()
    %s:\(\S\)\(<[^/]\)\|\(>\)\(</\):\1\3\r\2\4:g
    set filetype=xml
    normal gg=G
endfunction

command FormatXml :call FormatXml()
6
ответ дан 22 November 2019 в 21:19
поделиться

Введите символ из его шестнадцатеричного значения (режим вставки):

<C-Q>x[type the hexadecimal byte]
6
ответ дан 22 November 2019 в 21:19
поделиться

% также хорош, если вы хотите разнести файлы между двумя разными копиями проекта, не изнашив мизинцы (из корень проекта 1):

:vert diffs /project2/root/%
7
ответ дан 22 November 2019 в 21:19
поделиться

ПРАКТИЧЕСКОЕ РУКОВОДСТВО: автоматически заполните Ctags при использовании Vim в Bash. Для кого-либо еще, кто использует Vim и Ctags, я записал небольшую функцию auto-completer для Bash. Добавьте следующее в свой ~/.bash_completion, файл (создайте его, если это не существует):

Спасибо переходит к stylishpants для его многих мер и улучшений.

_vim_ctags() {
    local cur prev

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    case "${prev}" in
        -t)
            # Avoid the complaint message when no tags file exists
            if [ ! -r ./tags ]
            then
                return
            fi

            # Escape slashes to avoid confusing awk
            cur=${cur////\\/}

            COMPREPLY=( $(compgen -W "`awk -vORS=" "  "/^${cur}/ { print \\$1 }" tags`" ) )
            ;;
        *)
            _filedir_xspec
            ;;
    esac
}

# Files matching this pattern are excluded
excludelist='*.@(o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'

complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview

После того как Вы перезапускаете свою сессию Bash (или создаете новую), можно ввести:

Код:

~$ vim -t MyC<tab key>

и это автоматически заполнит тег тем же путем, это делает для файлов и каталогов:

Код:

MyClass MyClassFactory
~$ vim -t MyC

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

8
ответ дан 22 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

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