Выход vim: Как выйти из Vim? Несколько способов закрыть редактор VIM

Содержание

Как выйти из Vim? Несколько способов закрыть редактор VIM

Как выйти из VIM? Как закрыть VIM? Как вы выходите из редактора Vi? Как сохранится и выйти из Vim?

Это часть наиболее вводимых в google запросов, связанных с редактором Vim. Vim, один из самых лучших редакторов, основанных на терминале, известен из-за своих мощных возможностей. За «необычные горячие клавиши» особо рьяные пользователи умудряются его ругать, а «новички» из-за «таких стандартов» впадают в ступор. Все это даже приводит к тому, что иногда не понятно как из Vim вообще выйти.

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

Как выйти из Vim

Есть несколько способов это провернуть. Позвольте выписать их для вас один за одним.

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

  • :q
    (да, вместе с двоеточием, так как это часть команды) — это завершит работу в редакторе
  • :q! — закрыть Vim без сохранения файла c данными
  • :wq — сохранить файл и выйти из Vim

После того, как введете что нужно, жмите Enter.

Заметьте, что, когда вы жмете «:», редактор отобразит следующий набор знаков в левом нижнем углу терминала.

Иные способы выхода из терминала

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

  • Esc + 😡 + Enter (сохранить и выйти)
  • Esc + :qa + Enter (закрыть все открытые фалы)
  • Esc + Shift ZZ (сохранить и выйти)
  • Esc + Shift ZQ (выйти без сохранения)

Теперь все зависит от вас; выход из Vim выбирать вам.

Как по мне, то разумнее отдавать предпочтение первому способу.

Так как вы сохраняетесь (без выхода) с :w и затем вы можете использовать :wq для выхода с сохранением («w» для сохранения и «q» для выхода). Легче запомнить, что «q» — это завершить (quite).

Немного о выходе из Vim

Если вы чувствуете себя немного расстроенным по причине незнания того, как выходить из Vim, то, скажу я, зря. Вы такой не один. Согласно Stack Overflow около миллиона разработчиков искали выход из него.

Вообще-то, выход из Vim стал темой для обсуждений в популярной культуре. Вот вам твит например. Одна из популярнейших острот на тему «сложности» выхода из Vim:

I’ve been using Vim for about 2 years now, mostly because I can’t figure out how to exit it.

— I Am Devloper (@iamdevloper) 17 февраля 2014 г.

(Уже как два года использую Vim по большей части из-за того, что не могу понять как из него выйти. )

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

Иногда очевидные вещи не столь очевидны. Забавно, мы так привыкли к Ctrl+S/Ctrl+X, что иной стандарт где бы то ни было горячих классов приводит нас в недоумение.

Vim отличный редактор. Если у вас получится овладеть им, то вам уже больше ничего подобного нужно не будет. Сисадмины по большей части проводят время в командной строке. Навык работы в Vim может быть большим преимуществом.

Настроены серьезно? Могу порекомендовать данный видеокурс по Vim на английском языке.

Надеюсь, инструкция помогла вам с выходом из Vim. Поделитесь своим мнением, мыслями по этому поводу. Спасибо за внимание!

Как выйти из редактора Vi или Vim?

Добро пожаловать в Vim!

Прежде чем ввести команду, нажмите Esc. Чтобы потом подтвердить команду, нажмите Enter.

Клавиша Esc переключает Vim в нормальный режим. Если в этом режиме нажать : (проверьте, что установлена английская раскладка и снят CapsLock, затем одновременно нажмите

Shift и ;), то символ : появится в нижней части экрана, и редактор перейдёт в режим командной строки. Это гарантирует, что вы сейчас именно вводите команду, а не редактируете файл. Помните, что регистр вводимых команд важен.

У большинства команд есть укороченные версии. Необязательная часть дается в квадратных скобках: к[оманда].

Команды, данные курсивом, подходят только для Vim (не реализованы в Vi).

Выйти безопасно (не срабатывает, если есть не сохраненные изменения)

  • :q[uit] Выйти из текущего окна Vim. Если это окно — последнее, то выйти из Vim. Если в текущем буфере есть не сохраненные изменения, команда не сработает.
  • :qa[ll] Закрыть все окна и выйти из Vim.
    Не сработает, если хотя бы в одном буфере есть не сохраненные изменения.

Выйти с подтверждением (запрашивает подтверждение, если есть не сохраненные изменения)

  • :conf[irm] q[uit] Закрыть все окна и выйти из Vim. Запрашивает подтверждение, если есть буферы с не сохраненными изменениями.
  • :conf[irm] xa[ll] Сохранить все изменения, закрыть все окна и выйти из Vim. Запрашивает подтверждение, если какие–либо буферы не могут быть сохранены.

Записать (сохранить) изменения и выйти

  • :wq Записать текущий буфер в соответствующий ему файл (даже если изменений не было) и закрыть окно. :wqa[ll] для всех окон.
  • :wq! То же самое, но записывает даже файлы, отмеченные только для чтения (read-only).
    :wqa[ll]!
    для всех окон.
  • :x[it], ZZ(но с некоторыми особенностями). Сохранить файл только если в нем есть изменения и выйти, :xa[ll] для всех окон.

Отменить (и потерять) изменения и выйти

  • :q[uit]! ZQ Выйти без сохранения, в том числе когда есть изменения в видимых буферах. Не сработает, если изменения есть также и в скрытых буферах.
  • :qa[ll]!, :quita[ll][!] Выйти без сохранения, отменяя все изменения как в видимых, так и в скрытых буферах.

Нажмите Enter чтобы выполнить введенную команду.

Этот ответ все-таки не охватывает все возможные способы выйти из Vim. Полный список можно найти в документации Vim.

На момент публикации все ссылки верны и ведут на англоязычную версию документации, но сайт временно недоступен. Когда он поднимется, я добавлю ссылки на русскоязычную версию.

Vim также имеет встроенную документацию. Чтобы ее открыть: Esc:helpEnter. Чтобы использовать русскоязычную встроенную документацию, необходимо включить русскую локализацию в настройках Vim.

Это перевод собственного ответа на EN.SO. При написании использовалась документация Vim и, в качестве ориентира и источника вдохновения, ответы других пользователей, особенно @dirvine.

Как отсюда выйти: шпаргалка по Vim

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

ESC? Ничего не произошло. CTRL + C? Нет. ESC ESC ESC? Неа. Вы в тупике.

Ну вот, опять. Склонив голову от стыда, вы запускаете очередной терминал, чтобы исполнить команду killall vim и продолжить заниматься своими делами.

С вами бывало такое? Конечно, бывало. Что ж, потратив несколько минут на эту статью, вы познакомитесь с основами редактора Vim (и научитесь быстро выходить из него).

Vim по умолчанию установлен во многих операционных системах (включая большинство дистрибутивов Linux и macOS), поэтому хотя бы поверхностные знания о нём лишними не будут. Откройте терминал и введите vim.

В умелых руках Vim может стать мощнее многих IDE. И, разумеется, он не ест сотни мегабайт памяти лишь для отображения пустого файла (да, Eclipse, это о тебе).

Основы

Некоторые из нижеописанных команд начинаются с двоеточия: нажав его, появится подсказка, в которой будет указана полная команда. Команды без двоеточий — это скорее горячие клавиши, которые можно использовать в режиме по умолчанию (в нём запускается Vim). Команды, написанные ЗАГЛАВНЫМИ БУКВАМИ — это отдельные клавиши: например, ESC — это клавиша Esc на вашей клавиатуре.

Все команды чувствительны к регистру и должны выполняться вне режима insert.

Выход из Vim

Выход без сохранения изменений:

:q!

Как запомнить: quit dammit! (закройся, чёрт возьми!)

Выход с сохранением изменений:

:wq

Как запомнить: write to disk and q

uit

Навигация

Для перемещения по открытому файлу используйте стрелки.

Перемещение на строку 285:

:285

Поиск слова «import»:

/import

Изменение текста

Вставка текста там, где стоит курсор:

i

Как запомнить: insert

Вставка текста в конце текущей строки:

A

Как запомнить: Append

Выход из режима редактирования (возврат в стандартный режим):

ESC

Выделение текста

Переход в визуальный режим:

v

Как запомнить: visual

Для выделения текста используйте стрелки.

Выход из визуального режима:

ESC

Копирование, удаление, вставка

Копирование выделенного текста в буфер:

y

Как запомнить: yank

Удаление выделенного текста:

d

Как запомнить: delete

Копирование текущей строки в буфер:

yy

Как запомнить: yank yank

Копирование трёх строк, включая текущую, в буфер:

3yy

Удаление текущей строки и помещение её в буфер:

dd

Как запомнить: delete delete

Удаление 5 строк, включая текущую:

5dd

Вставка из буфера перед текущей строкой:

P

Примечание: заглавная P

Вставка из буфера после текущей строки:

p

Отмена и восстановление последнего изменения

Отмена последнего изменения:

u

Как запомнить: uh-oh 🙂

Восстановление последнего отменённого изменения:

CTRL + R

Вывод изменений:

:undolist

Отмена двух последних изменений:

2u

Многоуровневое дерево отката изменений Vim очень мощное, подробнее о нём можно почитать в документации.

Работа с файлом

Открытие файла index.html вместо текущего:

:edit index.html

Сохранение текущего файла:

:w

Как запомнить: write to disk

Сохранение файла с изменённым именем, например, changes.txt:

:w changes.txt

Поиск и замена

Поиск и замена всех вхождений строки в файле:

:%s/typo/corrected/g

Поиск и замена с запросом подтверждения замены:

:%s/typo/corrected/gc

Как запомнить: confirm

Подсветка синтаксиса и отступы

Включение подсветки синтаксиса:

:syntax on

Включение автоматических отступов:

:set autoindent

Увеличение отступов нескольких строк при выделении их в визуальном режиме:

>

Вкладки

Открытие server. py в новой вкладке:

:tabe server.py

Как запомнить: tab edit

Переход на вкладку справа:

:tabn

Как запомнить: tab next

Переход на предыдущую вкладку слева:

:tabp

Как запомнить: tab previous

Для закрытия вкладки переключитесь на неё и используйте команду :q или :wq.

Разделённый экран

Открытие templates/base.html в режиме вертикального разделения экрана:

:vs templates/base.html

Как запомнить: vertical split

Открытие shared.js в режиме горизонтального разделения экрана:

:sp shared.js

Как запомнить: the ’default’ horizontal split

Перемещение между «частями» экрана:

CTRL + W + ARROW KEYS

Для закрытия экрана переключитесь на него и используйте команду :q или :wq.

Настройка Vim: файл .vimrc

Многие команды, используемые для изменения вида и поведения Vim, можно сделать включёнными по умолчанию, поместив их в .vimrc — файл конфигурации Vim, который расположен в домашнем каталоге.

Например, добавление этих строк в ~/.vimrc сделает подсветку синтаксиса и автоматическую корректировку отступов включёнными по умолчанию:

syntax on
set autoindent

Идеи для кастомизации Vim можно почерпнуть в этом GitHub-репозитории.

Полезные ресурсы

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

А какая команда Vim — ваша любимая? Может, вы знаете удобные приёмчики? Делитесь ими в комментариях!

Перевод статьи «How the hell do I exit: A beginner’s guide to Vim»

VIM: выход из режима вставки с помощью команды: normal



Например, когда я перехожу в режим вставки с помощью команды :normal ( :normal i), как мне выйти из режима вставки?

Если я нажму <Esc>, или <c-c>, или <c-[>, VIM, то выйду из командного режима и не смогу выполнить команду: normal.

Я вставляю imap <c-e> <Esc> в свой .vimrc, но когда я набираю <c-e> в командном режиме, ничего не вставляется. Я не могу понять, как ввести «control e» в командном режиме.

<c-o> работает, например :normal Ihello<c-o>Aworld , но иногда я хочу сделать больше одной команды в обычном режиме.

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

vim macvim
Поделиться Источник Jay     24 октября 2010 в 22:51

3 ответа


  • Выход из режима вставки vim в Редакторе стилей Mozilla Firefox

    Внутри редактора стилей для Mozilla Firefox web dev у меня есть привязки клавиш, установленные в ‘Vim’ (предпочтительно). Проблема заключается в том, что внутри редактора стилей я не могу выйти из режима вставки; я обычно нажимаю escape, чтобы сделать это в любом редакторе Vim, однако в Mozilla. ..

  • В Vim, почему временный нормальный режим (Ctrl-O из режима вставки) выполняет команды намного медленнее?

    Обычно, когда я хочу отменить изменения при редактировании текста в Vim, я должен: Выйдите из режима вставки с Esc Нажмите u , чтобы отменить изменения Войдите в режим вставки с помощью различных команд ( i , o и др…) Теперь я просто новичок, но я понимаю, что в режиме вставки вы можете временно…



16

Чтобы добавить в команду литерал <ESC> , нажмите CTRL+V , а затем <ESC> .

Смотрите :help i_CTRL-V .

Поделиться too much php     24 октября 2010 в 22:59



5

Ремонтопригодным решением было бы:

exe "normal! Ihello\<c-o>Aaworld\<esc>"
. ..

:h :normal

Поделиться Luc Hermitte     25 октября 2010 в 16:08



0

:imap не сработает в командном режиме. Используйте :cmap или лучше, :cnoremap .

И как уже было сказано слишком много php, CTRL-V позволяет вставлять необработанные символы в режиме вставки или редактирования командной строки.

Поделиться Benoit     25 октября 2010 в 07:40


  • Двойное нажатие j в режиме вставки выход из режима вставки

    Мне удалось сломать свой vim так, что если я дважды нажму j в режиме вставки, то он выйдет из режима вставки, не набрав ни одного из j С. Я сделал полный перезапуск, и никакой радости не последовало. Что же мне удалось сделать?

  • прямо перед выходом из режима вставки Vim

    Мне нужно сделать кое-что прямо перед тем, как Vim выйдет из режима вставки. Есть ли какой-нибудь способ сделать это? Событие InsertLeave , по-видимому, происходит после того, как Vim вышел из режима вставки. Я использую gVim 8.0. Надеюсь, это неуместно. function! Insert_leave() echo mode()…


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


В Vim есть ли более одного способа выйти из режима вставки?

Есть несколько команд, которые делают что-то, а затем входят в режим вставки. Есть ли также команды, которые выходят из режима вставки и делают что-то? Например, я часто так делаю… control [ : w…


Выход из режима вставки Vim при вставке

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


Vim-сделать щелчок выхода из режима вставки

Нет ничего, что я ненавижу больше, чем фантомные щелчки сенсорной панели, заставляющие мой текст вводиться где-то случайным образом. Я бы почти предпочел, чтобы типирование интерпретировалось как…


Выход из режима вставки vim в Редакторе стилей Mozilla Firefox

Внутри редактора стилей для Mozilla Firefox web dev у меня есть привязки клавиш, установленные в ‘Vim’ (предпочтительно). Проблема заключается в том, что внутри редактора стилей я не могу выйти из…


В Vim, почему временный нормальный режим (Ctrl-O из режима вставки) выполняет команды намного медленнее?

Обычно, когда я хочу отменить изменения при редактировании текста в Vim, я должен: Выйдите из режима вставки с Esc Нажмите u , чтобы отменить изменения Войдите в режим вставки с помощью различных…


Двойное нажатие j в режиме вставки выход из режима вставки

Мне удалось сломать свой vim так, что если я дважды нажму j в режиме вставки, то он выйдет из режима вставки, не набрав ни одного из j С. Я сделал полный перезапуск, и никакой радости не…


прямо перед выходом из режима вставки Vim

Мне нужно сделать кое-что прямо перед тем, как Vim выйдет из режима вставки. Есть ли какой-нибудь способ сделать это? Событие InsertLeave , по-видимому, происходит после того, как Vim вышел из…


Выйдите из режима вставки в JupyterLab с помощью vim Привязок клавиш

Я использую как консоль, так и текстовый редактор в JupyterLab, и я установил клавиатуру текстового редактора на ‘vim’, и я могу редактировать текст просто отлично, когда в режиме вставки. Но при…


Как использовать команды VIM normal mode в режиме INSERT (обход текста)

Есть ли способ оставаться в режиме — (insert) — в режиме VIM, чтобы ввести несколько команд нормального режима при использовании режима INSERT? Я понимаю , что мы можем включить режим — (insert)…


Как я могу предотвратить дублирование Vim моего текста при выходе из режима вставки?

Я использую Vim в zsh shell на OSX. На изображении вы можете видеть, что я создал тестовый текст с левой стороны. Когда я выхожу из режима вставки (используя Esc ), Vim дублирует мой текст несколько. ..

Как выйти из VIM: 10 способов выхода из VI

Хорошо, это не идеально, но мы все были там. С этого момента мы избегаем этого, потому что даже если вы не хотите использовать vi, вы можете хотя бы знать, как правильно его выйти. Этот учебник покажет вам, как правильно выйти из VIM / VI, на самом деле он покажет вам несколько разных способов выхода из VI!

10 способов как выйти из VIM / VI

Это вопрос, который довольно часто появляется в наших комментариях в статьях в командной строке … как на самом деле выйти из VIM? Оказывается, есть буквально 10+ способов выйти из VIM, что, возможно, свидетельствует о том, почему VI озадачивает так много пользователей. Давайте сначала рассмотрим самые простые методы:

Выход из VIM без сохранения с помощью ZQ

Нажмите клавишу ESCAPE, затем нажмите SHIFT + ZQ

Это мгновенно выйдет из VIM без сохранения, в основном так же, как: q! команда.

Быстро покинуть VIM с помощью записи и сохранения в файл

Нажмите клавишу ESCAPE, затем SHIFT + ZZ

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

Выйти из VIM с помощью: q

Нажмите клавишу ESCAPE, затем введите: q и нажмите RETURN

Чтобы быть совершенно ясным, нажатие клавиши «Escape» переходит в командный режим. Затем набираем: q является буквальным, так как в двоеточии не является двоеточием, поэтому это будет Shift +; после чего q и нажатие клавиши Return переходит к команде для выхода.

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

Нажмите клавишу ESCAPE, затем введите: q! и нажмите RETURN

Выйти из VIM и записать изменения с помощью: wq

Хит ESCAPE и введите: wq и нажмите RETURN

Это сохраняет (записывает) изменения в активный файл и завершает работу. Вы можете это сделать, добавив при необходимости:

Хит ESCAPE и введите: wq! за которым следует клавиша RETURN

Это должно помочь избежать этой ситуации:

Мы можем быть немного более тщательными, хотя и охватывать все возможные способы выхода из VIM (по крайней мере, я знаю, что я любезно предоставил справочную страницу, перезвоните в комментариях больше способов, если есть другие, которые мы пропустили здесь), которые мы будем перейти к следующему:

Каждый возможный способ выйти из VIM

Нажмите клавишу ESC ESCE, чтобы сначала войти в командный режим, затем используйте любое из следующих действий:

  • : q — выйти
  • : Д! — выйти без сохранения, даже если модифицировано
  • : cq — всегда оставлять без записи
  • : wq — записать / сохранить текущий файл и выйти
  • : WQ! — записывать текущий файл и всегда выходить
  • : wq (имя) — записать в файл (имя) и выйти
  • : WQ! (имя) — пишите в файл (имя) и выходите всегда, даже если он изменен
  • ZZ — сохранить текущий файл, если он изменен, а затем выйти
  • ZQ — выйти и выйти без сохранения
  • Запустите новый терминал и наберите «killall vim» — это шутка, которую многие поймут, и хотя это не правильный способ выйти из vim, она работает

Так вот, как избежать VIM, менее запутанным? Возможно, нет, и все в порядке, мы обычно будем использовать nano здесь для прохождений, потому что он более удобен для пользователя. И в этом нет ничего плохого, хотя со временем я стал более комфортным с VIM, но я все же предпочитаю нано непринужденности и, возможно, старые упрямые привычки.

Для тех, кто интересуется изучением VIM или, по крайней мере, с ним становится более комфортным, вы всегда можете попробовать команду vimtutor, использовать этот отличный интерактивный учебник VIM и просто получить больше практики, часто используя его на любом терминале. Вы даже можете получить vim на своем iPad или iPhone, если вы действительно привержены. И, по крайней мере, вы знаете, как выйти из игры сейчас, верно?

Vim известен как невероятно мощный текстовый редактор, но он также известен своей крутой кривой обучения.

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

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

Обычные сочетания клавиш здесь вам не помогут.

Фактически, ничто из того, чему вы научились за всю свою вычислительную жизнь, не поможет.

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

Случайно запустили Vim? Вот как быстро выйти из него

Если вы хотели запустить другую команду, но вместо этого случайно запустили Vim, выход довольно прост.

Vim запускается в так называемом «обычном режиме», что означает, что вы на самом деле не редактируете файл.

Все, что вы введете, будет интерпретировано как команда.

Сначала вам нужно будет ввести ключ:, а затем букву q, чтобы выйти. Чтобы выйти из Vim, введите следующее:

:q

Если вы получили сообщение об ошибке «No write since last change (add ! to override)», вы случайно ввели текст или изменили файл.

Вместо этого введите следующее:

:q!

Застряли в режиме вставки?

Возможно, вы пытались выйти, набрав несколько разных букв, и случайно оказались в режиме вставки Vim.

Здесь вы фактически вводите новый текст в файл.

Когда вы находитесь в этом режиме, вы можете не знать, как выйти.

В этом случае приведенные выше советы вам не помогут.

К счастью, ключ к выходу из режима вставки прост.

Просто нажмите клавишу Escape.

Это вернет вас в обычный режим и позволит вам использовать приведенные выше инструкции для выхода из редактора.

Как выйти без сохранения

Возможно, вы специально запустили Vim, начали редактировать файл.

Если вы внесли изменения в файл и не хотите их сохранять, выйти без сохранения просто.

Мы уже упоминали один вариант выхода без сохранения выше:

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

Просто введите следующее:

Как сохранить ваши файлы и выйти

Возможно, вы внесли изменения и хотите сохранить их.

К счастью, это так же просто, как выйти без сохранения.

Вам просто нужно добавить w к вашей команде. Попробуйте следующее:

:wq

Если вы предпочитаете более короткие команды, следующее также сохранит и завершит работу:

:x

Другие методы выхода из Vim

Есть несколько других способов быстро выйти из Vim.

Сначала нажмите клавишу Escape, чтобы убедиться, что вы не находитесь в режиме вставки.

Удерживая клавишу Shift и нажав ZZ, вы сохраните и выйдете.

Удерживая Shift и нажав ZQ, вы выйдете без сохранения.

Хотите узнать, как использовать Vim?

Как мы уже упоминали в начале статьи, Vim – мощный инструмент, который стоит знать.

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

Тем не менее, вы можете быть не уверены, с чего начать.

К счастью, мы можем помочь вам в вашем пути к обучению и, в конечном итоге, овладению Vim.

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

Это первая из серии, состоящей из нескольких частей, которая поможет вам получить максимальную отдачу от редактора Vim.

 

Поделитесь статьей:

Stack Overflow вывел из Vim уже больше миллиона пользователей

На днях один популярный вопрос на Stack Overflow отпраздновал свой юбилейный миллионный просмотр.

Ты не одинок, jclancy. За пять лет, которые прошли, с тех пор как был опубликован этот пост, больше миллиона других разработчиков постигла та же участь — они застряли в Vim и не могли выбраться без посторонней помощи. Не зря в IT сообществе столько шуток о том, как трудно найти выход из этого редактора.

От опытных пользователей Vim я слышал, что редактор не заслуживает такой репутации, и они, пожалуй, правы (даже сам я разобрался с этой проблемой за последние пару лет). Думаю, есть две причины, по которым люди постоянно забывают, как выйти из Vim. Во-первых, разработчиков, как правило, перебрасывает в Vim из консоли или в результате еще какой-нибудь непредвиденной ситуации; во-вторых, это случается не слишком часто, так что они успевают забыть, как вышли из положения в прошлый раз.

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

У какого количества людей возникают проблемы с выходом из Vim?

В прошлом году около 0.05% от общего числа просмотров приходилось на вопросы типа «Как выйти из редактора Vim?»; это значит, что каждый 20 000-й посетитель приходил на сайт именно с этой проблемой. Иными словами, по будням в часы, когда трафик достигает пика, примерно 80 человек в час нуждаются в помощи с выходом из Vim.

Менялся ли этот процент со временем? То есть можно ли сказать, что разработчики постепенно осваивают эту функцию собственными силами?

Что-то не похоже. Вопрос появился на сайте в августе 2012 года, первые несколько месяцев число просмотров у него было очень низкое. Затем трафик стал стабильно расти и в течение двух лет оставался на подъеме — вероятно, страница поднялась на первые строки поисковой выдачи и на нее стали ссылаться сторонние ресурсы. В следующие два года прирост был достаточно стабильным. Конечно, из этого не следует, что одни и те же люди заходят на страницу раз за разом — возможно, это программисты-новички, которые попали в такую ситуацию впервые.

Статистика по странам

Как мы уже упоминали в одном из предыдущих постов, анализ трафика Stack Overflow позволяет многое узнать о географическом распределении разработчиков. Давайте посмотрим, какой процент составляют вопросы именно о выходе от общего числа постов, связанных с Vim, для каждой страны. Мы предполагаем, что в странах, где много опытных пользователей Vim, процент будет низким. Большие значения, напротив, свидетельствуют о том, что многие разработчики попадают в Vim неожиданно для себя.

Как видим, программисты из Украины, Турции и Индонезии довольно часто застревают в этом редакторе: доля вопросов о Vim, связанных непосредственно с выходом из программы, у них больше, чем у всех остальных государств. На противоположном конце спектра находятся Китай, Корея и Япония — у них процент таких запросов меньше в добрые десять раз. Из этого, по всей видимости, следует заключить, что разработчики из этих стран заходят в Vim не по случайности и хорошо представляют себе, что делать, чтобы выйти.

На каких языках пишут те, кто не может сладить с Vim?

Логичным также представляется, что на опыт работы с Vim будет влиять и тот язык, на котором программист пишет код. Эту гипотезу мы можем проверить так: разобьем пользователей на группы по основной технологии программирования и посмотрим на среднее процентное соотношение «вопросы по выходу из Vim» / «вопросы по Vim» у каждой из групп.

Основную технологию программирования мы будем определять на базе того, какой тэг на Stack Overflow пользователь посещает чаще всего (скажем, в моем случае самый популярный тэг — R, на него приходится 52% просмотров). Способ не идеальный, но достаточно надежный, чтобы в общих чертах представить распределение по языкам. Для этой части анализа в выборку мы включали только зарегистрированных пользователей, у которых более 100 просмотров сайта.

Чаще всего сложности с тем, чтобы покинуть Vim, возникают у фронт-енд разработчиков — то есть тех, которые преимущественно просматривают тэги JQuery, CSS и AngularJS. За ними следом идут разработчики на Microsoft (C# и SQL Server) и мобильные разработчики (Android и iOS). Они работают по большей части с интегрированными средами разработки (Visual Studio, Eclipse, Xcode и так далее), а не простыми текстовыми редакторами, поэтому неудивительно, что они более склонны угодить в Vim случайно, чем открыть его умышленно.

Разработчики, которые реже всего заходят в тупик, пишут на C, C++, Python и Ruby. Этот список, на мой взгляд, вполне закономерен: он представляет собой смесь низкоуровневых и скриптовых языков, которые обычно предполагают простой текстовый редактор без графической оболочки. Соответственно, у тех, кто работает с этими языками, достаточно опыта, чтобы выйти из Vim, не прибегая к помощи Google.

Заключение

Когда я увидел, что число просмотров вопроса подходит к отметке в миллион, меня это позабавило, но вместе с тем, я испытал гордость за то, что работаю (и, среди прочего, отвечаю на вопросы) над сайтом, который оказался полезен такому огромному количеству разработчиков. Подумать только: ответ, который предлагаешь, может помочь миллионам людей, о чем бы ни шла речь — об отмене команды в git или использовании ключевого слова yield в Python.

Если вы тоже хотите внести свой вклад, мы приглашаем вас присоединиться к крупнейшему сообществу разработчиков в мире в любой роли, которая вам подходит — задавайте вопросы и предлагайте ответы, устройтесь на работу или сделайте себе имя онлайн, опубликовав свою историю. Также вы можете использовать наши инструменты, например, Stack Overflow Trends, которые позволют узнать много нового о разработчиках ПО.

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

Внешних команд / Изучите Vimscript на сложном пути

Vim следует философии UNIX «делать что-то хорошо». Вместо того, чтобы пытаться втисните всю функциональность, которую вы когда-либо хотели, в сам редактор, Правильный способ использования Vim — при необходимости делегировать внешние команды.

Давайте добавим в наш плагин взаимодействие с компилятором Potion, чтобы ноги мокрые от внешних команд в Vim.

Компиляция

Сначала мы добавим команду для компиляции и запуска текущего файла Potion.Есть Есть несколько способов сделать это, но пока мы просто воспользуемся внешней командой.

Создайте файл зелья / ftplugin / potion / running.vim в репозитории вашего плагина. Эта здесь мы создадим сопоставления для компиляции и запуска файлов Potion.

  если! Существует ("g: potion_command")
    пусть g: potion_command = "potion"
endif

функция! PotionCompileAndRunFile ()
    тихо! ясно
    выполнить "!" . g: potion_command. "". bufname ("%")
конечная функция

nnoremap <буфер>  r: вызвать PotionCompileAndRunFile ()   

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

Это позволит пользователям переопределить его, если зелье отсутствует в их $ PATH путем поместив строку вида let g: potion_command = "/ Users / sjl / src / potion / potion" в их файл ~ / . vimrc .

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

Реальная функциональность заключается в функции PotionCompileAndRunFile () . Преуспевать и сохраните этот файл, откройте factorial.pn и нажмите r , чтобы запустить отображение и посмотрим, что произойдет.

Если зелье находится в вашем $ PATH , файл должен быть запущен, и вы должны увидеть его вывод в вашем терминале (или внизу окна, если вы используете графический интерфейс Vim). Если вы получите сообщение об отсутствии команды potion , вы необходимо установить g: potion_command в вашем ~ /.vimrc , как упоминалось выше.

Давайте посмотрим, как работает функция PotionCompileAndRunFile () .

Bang!

Модель :! Команда (произносится как «взрыв») в Vim запускает внешние команды и отображает их вывод на экран. Попробуйте, выполнив следующую команду:

 :! Ls  

Vim должен показать вам вывод команды ls , а также сообщение «Нажмите ENTER или введите команду для продолжения ».

Vim не передает никаких вводных данных команде при выполнении таким образом. Подтвердите это работает:

 :! Кошка  

Введите несколько строк, и вы увидите, что команда cat выплевывает их обратно, просто как это обычно бывает, если вы запускаете cat вне Vim. Для завершения используйте Ctrl-D.

Чтобы запустить внешнюю команду без Нажмите ENTER или введите команду для продолжения Подскажите, используйте : silent! . Выполните следующую команду:

 : тихо! Эхо Привет, мир.  

Если вы запустите это в графическом интерфейсе Vim, например MacVim или gVim, вы не увидите Hello, Мир. вывод команды.

Если вы запустите его в терминальном Vim, ваши результаты могут отличаться в зависимости от вашего конфигурация. Возможно, вам потребуется запустить : redraw! , чтобы исправить ваш экран после запуска голый : тихо! .

Обратите внимание, что это команда : silent! , а не : тихо! (видите пробел?)! Это две разные команды, и нам нужна первая! Это не Vimscript отличный?

Давайте вернемся к функции PotionCompileAndRun () :

  функция! PotionCompileAndRunFile ()
    тихо! ясно
    выполнить "!" .g: potion_command. "". bufname ("%")
конечная функция  

Сначала мы запускаем команду silent! Clear , которая должна очистить экран без a Нажмите ENTER ... приглашение. Это гарантирует, что мы увидим только результат этого run, что полезно, когда вы запускаете одни и те же команды снова и снова.

В следующей строке используется наш старый друг execute для динамического построения команды. В Команда, которую он создает, будет выглядеть примерно так:

 ! Зелье факториал.pn  

Обратите внимание, что здесь нет silent , поэтому пользователь увидит вывод , и вам нужно будет нажать Enter, чтобы вернуться в Vim. Это то что мы хотим для этого конкретного отображения, так что все готово.

Отображение байт-кода

У компилятора Potion есть опция, которая позволит вам просмотреть его байт-код. генерируется при компиляции. Это может быть удобно, если вы пытаетесь отладить свой программа на очень низком уровне. Попробуйте, выполнив следующую команду на приглашение оболочки:

  зелье -c -V factorial.pn  

Вы должны увидеть много результатов, которые выглядят так:

  - проанализировано -
код ...
- составлено -
; определение функции: 0x109d6e9c8; 108 байт
; () 3 регистра
. local факториал; 0
.local print_line; 1
.local print_factorial; 2
...
[2] ход 1 0
[3] loadk 0 0; строка
[4] привязать 0 1
[5] loadpn 2 0; ноль
[6] вызов 0 2
...  

Давайте добавим отображение, которое позволит пользователю просматривать байт-код, сгенерированный для текущий файл Potion в разделе Vim, чтобы они могли легко перемещаться по нему и исследовать его.

Сначала добавьте следующую строку в конец файла ftplugin / potion / running.vim :

  nnoremap   b: вызвать PotionShowBytecode ()   

Ничего особенного — просто маппинг. Теперь давайте набросаем функция, которая сделает эту работу:

  функция! PotionShowBytecode ()
    "Получите байт-код.

    "Откройте новый раскол и настройте его.

    "Вставьте байт-код.

конечная функция  

Теперь, когда у нас есть небольшой скелет, давайте поговорим о том, как его сделать. случиться.

Система

()

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

Выполните следующую команду:

 : система echom ("ls")  

Вы должны увидеть результат выполнения команды ls внизу экрана. Если вы запускаете : сообщения вы тоже увидите это там. Функция system () Vim принимает командную строку в качестве параметра и возвращает вывод этой команды как строка.

Вы можете передать вторую строку в качестве аргумента функции system () . Выполните следующее команда:

 : система echom («wc -c», «abcdefg»)  

Vim отобразит 7 (с некоторыми отступами). Если вы передадите второй аргумент, например это, Vim запишет его во временный файл и передаст его команде на стандартный ввод. Для наших целей нам это не понадобится, но это полезно знать.

Вернемся к нашей функции. Отредактируйте PotionShowBytecode () , чтобы заполнить первую часть скелет такой:

  функция! PotionShowBytecode ()
    "Получите байт-код. let bytecode = system (g: potion_command. "-c -V". bufname ("%"))
    байт-код echom

    "Откройте новый раскол и настройте его.

    "Вставьте байт-код.

конечная функция  

Продолжайте и попробуйте, сохранив файл, запустив : set ft = potion в factorial.pn , чтобы перезагрузить его, и используя отображение b . Vim должен отобразите байт-код внизу экрана. Как только вы увидите, что это работает можно удалить строку echom .

Царапины

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

Для этого мы собираемся создать «нулевой» разбиение: разбиение, содержащее буфер это никогда не будет сохранено и будет перезаписано каждый раз, когда мы запускаем отображение. Измените функцию PotionShowBytecode () , чтобы она выглядела так:

  функция! PotionShowBytecode ()
    "Получите байт-код. let bytecode = system (g: potion_command. "-c -V". bufname ("%"))

    "Откройте новый раскол и настройте его.
    vsplit __Potion_Bytecode__
    нормальный! ggdG
    setlocal filetype = potionbytecode
    setlocal buftype = nofile

    "Вставьте байт-код.

конечная функция  

Этой новой команде должно быть довольно легко следовать.

vsplit создает новое вертикальное разделение для буфера с именем __Potion_Bytecode__ . Мы заключили имя в нижнее подчеркивание, чтобы пользователю было понятнее, что это не является обычным файлом (это буфер только для хранения вывода).Подчеркивания не особенные, это просто условность.

Далее мы удаляем все в этом буфере с помощью нормально! ggdG . Первый раз отображение запущено, это ничего не даст, но в последующие разы мы будем повторно использовать буфер __Potion_Bytecode__ , поэтому он очищается.

Затем мы подготавливаем буфер, задав две локальные настройки. Сначала мы устанавливаем его filetype на potionbytecode , просто чтобы было понятно, что он содержит. Мы также измените параметр buftype на nofile , который сообщает Vim, что этот буфер не связаны с файлом на диске, поэтому никогда не следует пытаться его записать.

Все, что осталось, это сбросить байт-код, который мы сохранили, в байт-код в этот буфер. Завершите функцию, сделав ее так:

  функция! PotionShowBytecode ()
    "Получите байт-код.
    let bytecode = system (g: potion_command. "-c -V". bufname ("%"). "2> & 1")

    "Откройте новый раскол и настройте его.
    vsplit __Potion_Bytecode__
    нормальный! ggdG
    setlocal filetype = potionbytecode
    setlocal buftype = nofile

    "Вставьте байт-код.call append (0, split (байт-код, '\ v \ n'))
конечная функция  

Функция append () Vim принимает два аргумента: номер строки, которую нужно добавить после, и список строк, которые нужно добавить как строки. Например, попробуйте запустить следующая команда:

 : вызов append (3, ["foo", "bar"])  

Это добавит две строки, foo и bar , под строкой 3 в вашем текущем буфер. В этом случае мы добавляем под строкой 0, что означает «вверху файл».

Нам нужен список строк для добавления, но у нас есть только одна строка с символы новой строки, встроенные в него, когда мы использовали system () . Мы используем Vim’s split () функция для разделения этого гигантского фрагмента текста на список строк. split () принимает строку для разделения и регулярное выражение, чтобы найти разделение точки. Все очень просто.

Теперь, когда функция завершена, попробуйте сопоставление. Когда ты запустите b в факториале .pn buffer Vim откроет новый буфер содержащий байт-код зелья. Поиграйте с этим, изменив источник, сохранение файла и повторный запуск сопоставления, чтобы увидеть изменение байт-кода.

Упражнения

Прочтите : help bufname .

Прочтите : help buftype .

Прочтите : help append () .

Прочтите : справка split () .

Прочтите : help:! .

Прочтите : справку: прочтите и : справку: прочтите! (мы не рассматривали эти команды, но они чрезвычайно полезны).

Прочитать : справочная система () .

Прочтите : помогите спроектировать - не .

В настоящее время наши сопоставления требуют, чтобы пользователь сам сохранял файл перед запуск сопоставления, чтобы их изменения вступили в силу. Отменить дешево в наши дни, поэтому отредактируйте написанные нами функции, чтобы сохранить для них текущий файл.

Что происходит, когда вы запускаете отображение байт-кода в файле Potion с синтаксисом ошибка? Почему так случилось?

Измените функцию PotionShowBytecode () , чтобы обнаруживать, когда компилятор Potion возвращает ошибку и показывает пользователю сообщение об ошибке.

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

Изменить PotionShowBytecode () для обнаружения с окном уже открыто для __Potion_Bytecode__ буфер, и в этом случае переключитесь на него вместо создание нового раскола.

Вы, вероятно, захотите прочитать : help bufwinnr () для этого.

Помните, как мы установили filetype временного буфера на potionbytecode ? Создайте файл syntax / potionbytecode.vim и определите подсветку синтаксиса для Буферы байт-кода зелья, чтобы их было легче читать.

Отладка Vim — в терминах Lehman

Хотя документация в Vim довольно обширна, иногда бывает трудно найти информацию, которую вы ищете. Другая серьезная проблема заключается в том, что Vimscript — сложный язык для изучения / использования. Если вы просто копируете фрагменты, которые нашли в Интернете, или стремитесь написать собственный код на Vimscript, вы неизбежно столкнетесь с проблемами, которые не сможете понять. Google и StackOverflow могут вас подвести. Для подобных проблем полезно понять, как отлаживать в Vim.

Этот пост будет служить в основном справочником и учебником по встроенным параметрам отладки в Vim. Первое, о чем я расскажу, — это встроенный отладчик Vimscript, который вы можете использовать с помощью команды debug .

Обновления
  • 15.09.2016 : Подробная команда обновлена ​​до -V [n] благодаря Марку Кэмпбеллу.

Отладчик Vimscript

Вы можете запустить Vim в режиме отладки с аргументом -D .

  "открывает vim в режиме отладки
vim -D somefile.txt
  

Это полезно для просмотра того, что запускается при инициализации Vim, и может помочь вам лучше понять все, что происходит, когда вы открываете Vim. Вы можете использовать это, чтобы пройтись по Vimscript в вашем vimrc , который запускается при инициализации экземпляра Vim. Я сейчас объясню, как использовать отладчик.

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

  "информация о запуске будет записана в файл: vim.log
vim --startuptime vim.log
  

Как использовать отладчик

Прежде чем мы перейдем к использованию отладчика, вы также должны знать, что вы можете сделать больше, чем просто запустить Vim в режиме отладки, поскольку это не будет очень полезно. Вы также можете вызвать команду debug из Vim для отладки функций или команд Vimscript, которые уже были получены.

  "отладить команду
отладка CommandName

"отладить функцию
отладочный вызов FunctionName (arg)
  

Когда вы войдете в режим отладки, вы увидите приглашение (> ) в строке состояния.Здесь вы можете управлять отладчиком и взаимодействовать с ним.

  • cont : продолжить выполнение до следующей точки останова (если она существует)
  • выйти : остановить текущее выполнение, но все еще останавливается на следующей точке останова
  • шаг : выполнить текущую команду и вернуться в режим отладки по ее завершении
  • следующий : как этап , за исключением того, что он также переходит через вызовы функций и исходные файлы
  • прерывание : похоже на выход, но возвращается в режим отладки для следующей команды
  • завершить : завершает текущий сценарий или функцию и возвращается в режим отладки для следующей команды

Обратите внимание, что каждая из этих команд отладки имеет сокращение первой буквы слова [c, q, s, n, i, f], и нажатие Enter ( ) снова выполнит предыдущую команду. .

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

Добавление точек останова

  "аргументы в квадратных скобках [] необязательны

"добавить точку останова в функцию
breakadd func [номер строки] имя функции
"добавить точку останова в файл
breakadd file [lineNumber] fileName
"добавить точку останова в текущую строку текущего файла
breakadd здесь
  

Удаление точек останова

  "аргументы в квадратных скобках [] необязательны

"удалить номер точки останова из вывода списка останова
номер брейкделя
"удалить все точки останова
брейкдел *
"удалить точку останова на функции
функция breakdel [номер строки] имя функции
"удалить точку останова в файле
breakdel файл [номер строки] имя файла
"удалить точку останова в текущей строке текущего файла
Брейкдел здесь
  

Прочтите документацию по отладке

Общая отладка с подробным описанием

Помимо команды debug , Vim также имеет команду verbose , которая обеспечивает протоколирование, когда действия происходят в Vim, что также может быть полезно для отладки, особенно таких вещей, как автокоманды. Недавно я использовал подробное описание, чтобы определить, какие автокоманды я могу использовать для подключения к netrw (см. Сообщение). Использовать подробный текст так же просто, как:

  "установить подробную команду
установить подробный = 9

"установить подробный при запуске
vim -V9 file.text
  

Вы можете установить для подробного вывода любое значение от 0 до 15, где 0 — это не дополнительный вывод, а 15 — вывод для всего, что делает Vim. С каждым числом постепенно увеличивается вывод и понимание того, что делает Vim:

  "> = 1 При чтении или записи файла viminfo."> = 2 Когда файл является": source "'ed.
"> = 5 Каждый найденный файл тегов и включаемый файл.
"> = 8 Файлы, для которых выполняется группа автокоманд.
"> = 9 Каждая выполненная автокоманда.
"> = 12 Каждая выполняемая функция.
"> = 13 Когда исключение генерируется, перехватывается, завершается или отбрасывается.
"> = 14 Все, что ожидается в предложении": finally ". 
"> = 15 Каждая выполненная команда Ex (усеченная до 200 символов).
  

Не нужно много экспериментировать с подробным описанием, чтобы вас поразило количество выводимых данных, отображаемых в строке состояния.Каждое сообщение прерывает работу Vim и может затруднить выполнение каких-либо действий. Чтобы обойти это, вы можете отправить подробный вывод в файл:

  установить verbosefile = filename.txt
  

Наконец, вы можете выполнить подробный анализ только для одной команды, используя [count] verbose , что полезно, если вы хотите увидеть, что Vim делает за кулисами для одного небольшого действия.

 : 12 вербальный вызов MyFunction ()
  

Прочтите документацию по verbose

Теперь у вас должно быть хорошее представление о том, с чего начать отладку и регистрацию вывода в Vim.Хотя Vimscript может быть не самым приятным языком для работы, он поставляется с такими инструментами, как verbose и debug , которые помогут вам бороться с проклятием существования каждого разработчика Vim, Vimscript.

Как передать текущий буфер команде оболочки и сохранить результат в переменной? : vim

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

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

 : execute 'w! тройник | wc -l | tr -d "\ n" '
  

Но я хочу сохранить этот вывод в переменной, например:

  "Следующий пример не работает.
let myvar = execute 'w! тройник | wc -l | tr -d "\ n" '
  

Кто-то в irc-канале #vim очень помог мне указать на эту функцию: http: // vim.:] \ +: ‘,’ ‘,’ ‘) Ну наконец то redir END пусть & shortmess = _shortmess если v: errmsg! = » пусть вывод = » endif Endtry возвратный вывод конечная функция

К сожалению, это работает успешно только с такими командами vim:

  let x = GetVimCmdOutput ('ls')
эхо х
  1 "structured-haskell-mode. cabal" строка 1
  3 линия "элисп / шм.эл" 1926 г.
  4 a + "src / Main.hs" строка 162
 16% a "~ / dotrc / dotvim / plugin / shm.vim "строка 28
Нажмите ENTER или введите команду, чтобы продолжить
  

И некорректно работает с командами командной оболочки:

  let x = GetVimCmdOutput ('w! Tee | wc -l | tr -d "\ n"')
эхо х

Нажмите ENTER или введите команду, чтобы продолжить
"Приведенный выше echo x должен показывать количество строк текущего буфера, но вместо этого он просто пустой
  

Итак, мой вопрос: как сохранить вывод такой команды оболочки в переменной в vimscript?

Вывод внешней команды Vim в новый буфер

Еще 10 дискуссий, которые могут вас заинтересовать

1.Программирование и сценарии оболочки

Я хочу выполнить внешнюю команду и вставить ее в определенную область файла, который я редактирую. Обратите внимание, что у меня есть ОРИГИНАЛЬНЫЙ учебный документ AT&T vi, датированный 1987 годом. Не объясняет. Например, в редакторе vi у меня есть Хотелось бы результата: После выполнения следующего … (1 ответ)

Обсуждение начато: popeye

1 ответов

2. Программирование оболочки и сценарии

В качестве примера я использую следующее.Я всегда так делаю и считаю, что мои скрипты будут работать намного быстрее, если я помещу результаты sed в место в памяти, а не буду писать в файлы. Опять же, дело не в sed, а в перенаправлении на место в памяти, а не во внешний файл. … (5 ответов)

Обсуждение начато: popeye

5 ответов

3. Программирование оболочки и сценарии

У меня такой код: установить ipv6_acl_max_chars test_acl_max_chars123456a789% s% d2345678ww134rt789qa234567845% c89012% a56789012x4r67890test_acl_max_chars1234567890.01234aabcdob34567aBC0 создать telnet $ myip ожидать "Login:" {send "admin \ r"} ожидайте "Пароль:" {send "admin \ r"} ... (0 ответов)

Обсуждение начато: ylucki

0 ответов

4.

Программирование оболочки и сценарии

как я могу искать в каждой строке ROCT и ROCT 1. ROCT1 всегда будет через 1 строку после ROCT. Оба шаблона будут находиться в конце строки (в чередующихся строках). <файл шаблона> (триггер, срабатывающий по переднему фронту, синхронизируется ROCT) Конечная точка :... (2 ответов)

Обсуждение начато: dll_fpga

2 ответов

5. Программирование оболочки и сценарии

Привет всем! Я использую внешний двоичный файл для просмотра памяти, начиная с определенного адреса, и я хочу автоматизировать это через PERL, но есть проблемы. Надеюсь, ты сможешь мне помочь .. thx Результат работы программы показан ниже: Баш-3.2 $ mem_disp 12B21D20 100 Открытие файла памяти данных RO scp.ro ... (4 ответа)

Обсуждение начато: ekckabatop

4 ответов

6.Solaris

Я загрузил vim.7.2 и скомпилировал исходный код vim. Добавлен двоичный путь vim в PATH (потому что я не корень окна) когда я загружаю файл с помощью vim, он выдает ошибку Обнаружена ошибка при обработке /home2/e3003091/. vimrc: строка 2: E185: Не удается найти цветовую схему темно-синий. line ... (0 ответов)

Обсуждение начато: girija

0 ответов

7. Программирование оболочки и сценарии

Приведенный ниже код работает с клиентом.журнальный файл. но я хочу скопировать вывод во внешний файл /home/tail.txt Может ли кто-нибудь помочь. #! / opt / bin / perl -w открыть мой $ pipe, "- |", "/ usr / bin / tail", "/var/log/client.log" или die "не удалось запустить tail на /var/log/client.log: $!"; print while ... (2 ответов)

Обсуждение начато: sureshcisco

2 ответов

8. UNIX для чайников. Вопросы и ответы

Я использую Debian, подключаюсь через SSH с помощью Putty и пытаюсь выполнить команду: dpkg --configure -ato запустить пакет, который не был завершен из-за того, что мне пришлось отключиться во время его работы.Он дает это сообщение: dpkg: проблемы с зависимостями мешают настройке php5-dev: php5-dev . .. (3 ответов)

Обсуждение начато: stulancs

3 ответов

9. Программирование и сценарии оболочки

Привет, Мне было интересно, есть ли способ перенаправить вывод команды в буфер, чтобы, если я сделаю Ctrl + v или Alt + v, он должен вставить данные. Пример: cat myfile.txt | grep привет. Привет там 1 Привет там 2 Вывод файла должен идти в буфер (информация о буфере обмена), поэтому... (1 ответ)

Обсуждение начато: preethgideon

1 ответов

10. Программирование

Hai Friends Я пишу программу cgi на C. Программа CGI имеет ссылку для запуска моего сервера чата tcp ... Сервер чата tcp печатает некоторую информацию при запуске ... Я получил информацию и отправил ее клиентскому браузеру через программа cgi ... Но выводится все ... (6 ответов)

Обсуждение начато: collins

6 ответов

VIM и Python - союз, заключенный на небесах - настоящий Python

Я обратил внимание на то, что кто-то «в этих местах» проповедовал евангелие Sublime Text 3. Как постоянный старший разработчик (эээ, старый туман), я считаю своим долгом рассказать вам о единственной ИСТИННОЙ среде разработки Python, которая вам когда-либо понадобится: VIM.

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

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

Установка

Поскольку VIM предустановлен в ряде систем * nix, давайте сначала проверим, установлен ли он:

Если он установлен, вы должны увидеть что-то вроде:

  VIM - Vi IMproved 7.3 (15 августа 2010 г., скомпилировано 5 ноября 2014 г. 21:00:28)
Составлено [email protected]
Обычная версия без GUI. Возможности включены (+) или нет (-):
-arabic + autocmd -balloon_eval -browse + builtin_terms + byte_offset + cindent
-clientserver -clipboard + cmdline_compl + cmdline_hist + cmdline_info + комментарии
-conceal + cryptv + cscope + cursorbind + cursorshape + dialog_con + diff + орграфы
-dnd -ebcdic -emacs_tags + eval + ex_extra + extra_search -farsi + file_in_path
+ find_in_path + float + сворачивание -footer + fork () -gettext -hangul_input + iconv
+ insert_expand + jumplist -keymap -langmap + libcall + разрыв строки + lispindent
+ listcmds + localmap -lua + menu + mksession + modify_fname + mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+ mouse_xterm + multi_byte + multi_lang -mzscheme + netbeans_intg -osfiletype
+ path_extra -perl + persistent_undo + postscript + принтер -profile + python / dyn
-python3 + quickfix + reltime -rightleft + ruby ​​/ dyn + scrollbind + знаки
+ smartindent -sniff + startuptime + statusline -sun_workshop + синтаксис + tag_binary
+ tag_old_static -tag_any_white -tcl + terminfo + termresponse + textobjects + title
 -toolbar + user_commands + vertsplit + virtualedit + visual + visualextra + viminfo
+ vreplace + wildignore + wildmenu + windows + резервная копия -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save
   системный файл vimrc: "$ VIM / vimrc"
     пользовательский файл vimrc: "$ HOME /. vimrc "
      пользовательский exrc файл: "$ HOME / .exrc"
  запасной вариант для $ VIM: "/ usr / share / vim"
Компиляция: gcc -c -I. -D_FORTIFY_SOURCE = 0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Связывание: gcc -arch i386 -arch x86_64 -o vim -lncurses
  

На этом этапе вы хотите проверить две вещи:

  1. Версия VIM должна быть выше 7.3.
  2. + python должен появиться в списке функций, чтобы вы знали, что Python поддерживается.

Если обе проверки пройдены, переходите к VIM Extensions.Если нет, то пора установить / обновить.

macOS / OS X

Возьмите Homebrew, если у вас его еще нет, и запустите:

  $ brew обновить
$ brew установить vim
  

* NIX / Linux

Для Debian или Ubuntu вы можете попробовать:

  $ sudo apt-get remove vim-tiny
$ sudo apt-get update
$ sudo apt-get install vim
  

Для других версий Linux проверьте документацию в диспетчере пакетов. Вот ссылка для начала: Установите Vim.

Окна

Есть много разных способов установить VIM в Windows. Начните с официальной документации.

Проверка установки VIM

Убедитесь, что вы установили VIM> 7.3 с поддержкой Python. Снова запустите vim --version , чтобы убедиться в этом. Если вы хотите проверить конкретную версию Python, используемую в VIM, запустите : python import sys; print (sys.version) из VIM:

  2.7.6 (по умолчанию, 9 сентября 2014 г., 15:04:36)
[GCC 4.2.1 Совместимый Apple LLVM 6.0 (clang-600.0.39)]
  

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

После установки VIM давайте посмотрим, как настроить VIM для разработки на Python.

Расширения VIM

VIM может делать многое из того, что нужно разработчикам, прямо из коробки. Однако он также является широко расширяемым, и есть несколько довольно убийственных расширений, которые делают его более похожим на «современную» IDE.Самое первое, что вам понадобится, - это хороший менеджер расширений.

Примечание. Расширения в VIM часто называют пакетами или плагинами.

Vundle

VIM имеет несколько менеджеров расширений, но я настоятельно рекомендую Vundle. Думайте об этом как о пипе для VIM. Это упрощает установку и обновление пакетов.

Давайте установим Vundle:

  $ git clone https://github.com/gmarik/Vundle.vim.git ~ / .vim / bundle / Vundle.vim
  

Эта команда загружает диспетчер подключаемых модулей Vundle и помещает его в каталог пакетов VIM.Теперь вы можете управлять всеми своими расширениями из файла конфигурации .vimrc .

Добавьте файл в домашний каталог пользователя:

Теперь настройте Vundle в вашем .vimrc , добавив следующее в начало файла:

  набор несовместимый "требуется
filetype off "требуется

"установить путь выполнения, чтобы включить Vundle и инициализировать
установить rtp + = ~ / . vim / bundle / Vundle.vim
вызовите vundle # begin ()

"в качестве альтернативы укажите путь, по которому Vundle должен устанавливать плагины
"вызвать vundle # begin ('~ / some / path / here')

"пусть Vundle управляет Vundle, требуется
Плагин gmarik / Vundle.vim '

"добавьте сюда все свои плагины (обратите внимание на более старые версии Vundle
"использовал Bundle вместо Plugin)

"...

"Все ваши плагины должны быть добавлены перед следующей строкой
call vundle # end () "требуется
отступ плагина типа файла на "требуется
  

Вот и все. Теперь вы настроены на использование Vundle. После этого вы можете добавить плагины, которые хотите установить, затем запустить VIM и запустить:

Эта команда заставляет Vundle творить чудеса - загружать все плагины и устанавливать / обновлять их за вас.

Давайте сделаем IDE

Невозможно перечислить все функции VIM, но давайте взглянем на краткий список некоторых мощных готовых функций, идеально подходящих для разработки на Python.

Откажитесь от мыши

Вероятно, наиболее важной особенностью VIM является то, что для него не требуется мышь (за исключением графических вариантов VIM). Поначалу это может показаться ужасной идеей, но после того, как вы потратите время - а это действительно займет время - на изучение комбинаций клавиш, вы ускорите общий рабочий процесс!

Раздельные макеты

Если вы открываете файл с : sp , вы разделяете макет по вертикали (открывая новый файл под текущим файлом).Если вы перевернете ключи на : vs , вы получите горизонтальное разделение (открытие нового файла справа от текущего файла).

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

Профессиональный совет № 1: Обязательно используйте завершение табуляцией для поиска файлов после ввода : sp .

Pro Совет № 2: Вы также можете указать различные области экрана, где должны происходить разделения, добавив следующие строки в .vimrc файл:

  комплект нижний разрез
установить splitright
  

Совет от профессионала № 3: Хотите перемещаться между разделами без использования мыши? Если вы просто добавите следующий код к .vimrc , вы сможете переключаться между разделами с помощью всего одной комбинации клавиш:

  "разделенная навигация
nnoremap   
nnoremap   
nnoremap   
nnoremap   
  

Комбинации клавиш:

  • Ctrl + J перейти к разделению ниже
  • Ctrl + K перейти к разделению выше
  • Ctrl + L переместить к разделению вправо
  • Ctrl + H перейти к разделению влево

Другими словами, нажмите Ctrl плюс стандартную клавишу перемещения VIM, чтобы перейти к определенной панели.

Но подождите - что это за штука nnoremap ? Вкратце, nnoremap переназначает одну комбинацию клавиш на другую. Часть без означает переназначение клавиши в обычном режиме, а не в визуальном. По сути, nnoremap говорит, что в нормальном режиме, когда я нажимаю , вместо этого выполните . Более подробную информацию можно найти здесь.

Буферы

В то время как VIM может делать вкладки, многие пользователи предпочитают буферы и разделения.Вы можете думать о буфере как о недавно открытом файле. VIM обеспечивает легкий доступ к недавним буферам. Просто введите : b <имя или номер буфера> , чтобы переключиться на открытый буфер. (Здесь также работает автозаполнение.) Вы также можете использовать : ls для вывода списка всех буферов.

Pro Tip # 4: В конце вывода : ls VIM предложит Hit enter, чтобы продолжить . Вместо этого вы можете ввести : b <номер буфера> и сразу же выбрать буфер, пока у вас еще отображается список.Это сэкономит вам время на нажатие клавиши, и вам не придется запоминать номер буфера.

Код складной

Большинство «современных» IDE предоставляют способ свертывания (или сворачивания) методов и классов, показывая вам только строки определения класса / метода вместо всего кода.

Вы можете включить это в .vimrc с помощью следующих строк:

  "Включить складывание
установить foldmethod = indent
установить foldlevel = 99
  

Это работает нормально, но вам нужно набрать za , чтобы сложить (и развернуть).Клавиша пробела была бы намного лучше. Так что добавьте эту строку в свой файл .vimrc :

  "Включить складывание с помощью пробела
nnoremap <пробел> za
  

Теперь вы можете легко скрыть части вашего кода, над которыми вы в данный момент не работаете.

Начальная команда set foldmethod = indent создает складки на основе отступов строк. Однако при этом часто получается больше складок, чем вы действительно хотите. Но не бойтесь! Есть несколько расширений, которые пытаются это исправить.Мы рекомендуем SimpylFold. Установите его с помощью Vundle, добавив следующую строку в .vimrc :

  Плагин tmhedberg / SimpylFold
  

Примечание: Не забудьте установить плагин - : PluginInstall .

Совет от профессионалов № 5: Попробуйте это, если вы хотите увидеть строки документации для свернутого кода:

  пусть g: SimpylFold_docstring_preview = 1
  

Отступ Python

Конечно, чтобы сворачивание кода работало на основе отступов, вы хотите, чтобы они были правильными.Опять же, VIM немного отстает, потому что он не поддерживает автоматический отступ после определения функции. С отступом можно сделать две вещи:

  1. Сделайте отступ в соответствии со стандартами PEP 8.
  2. Лучше обрабатывать автоматические отступы.

PEP 8

Чтобы добавить правильный отступ PEP 8, добавьте следующее в свой .vimrc :

  au BufNewFile, BufRead * .py
    \ set tabstop = 4
    \ set softtabstop = 4
    \ установить shiftwidth = 4
    \ set textwidth = 79
    \ set expandtab
    \ установить автоотступ
    \ установить формат файла = unix
  

Это даст вам стандартные четыре пробела, когда вы нажмете вкладку, убедитесь, что длина вашей строки не превышает 80 символов, и сохраните файл в формате Unix, чтобы у вас не возникло множество проблем с преобразованием при проверке в GitHub и / или поделиться с другими пользователями.

Для разработки полного стека вы можете использовать другую команду au для каждого типа файла:

  au BufNewFile, BufRead * .js, * .html, * .css
    \ set tabstop = 2
    \ set softtabstop = 2
    \ установить shiftwidth = 2
  

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

Авто-отступ

autoindent поможет, но в некоторых случаях (например, когда подпись функции занимает несколько строк) не всегда делает то, что вы хотите, особенно когда дело касается соответствия стандартам PEP 8.Чтобы исправить это, вы можете использовать расширение indentpython.vim:

  Плагин 'vim-scripts / indentpython.vim'
  

Отметка ненужных пробелов

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

  au BufRead, BufNewFile * .py, *. Pyw, *. C, *. H соответствуют BadWhitespace / \ s \ + $ /
  

Это пометит лишние пробелы как плохие и, возможно, закрасит их в красный цвет.

Поддержка UTF-8

По большей части вы должны использовать UTF-8 при работе с Python, особенно если вы работаете с Python 3. Убедитесь, что VIM знает это с помощью следующей строки:

Автозаполнение

Лучший плагин для автозаполнения Python - YouCompleteMe. Снова используйте Vundle для установки:

  Набор "Валлорик / YouCompleteMe"
  

Под капотом YouCompleteMe используется несколько различных автозаполнителей (включая Jedi для Python), и для его правильной работы необходимо установить несколько библиотек C. В документации есть очень хорошие инструкции по установке, поэтому я не буду повторять их здесь, но обязательно следуйте им.

Он работает "из коробки" довольно хорошо, но давайте добавим несколько настроек:

  пусть g: ycm_autoclose_preview_window_after_completion = 1
map  g: YcmCompleter GoToDefinitionElseDeclaration 
  

Первая строка гарантирует, что окно автозаполнения закрывается, когда вы закончите с ним, а вторая определяет ярлык для определения goto.

Примечание: Моя главная клавиша сопоставлена ​​с пробелом, поэтому space-g будет определять то, что я сейчас использую. Это полезно, когда я изучаю новый код.

Поддержка Virtualenv

Одна проблема с определением goto, приведенным выше, заключается в том, что VIM по умолчанию ничего не знает о virtualenv, поэтому вам нужно сообщить VIM и YouCompleteMe о вашем virtualenv, добавив следующие строки кода в .vimrc :

  "Python с поддержкой virtualenv
py << EOF
импорт ОС
import sys
если 'VIRTUAL_ENV' в os.environ:
  project_base_dir = os.environ ['VIRTUAL_ENV']
  activate_this = os.path.join (каталог_базы_проекта, 'bin / activate_this.py')
  execfile (activate_this, dict (__ file __ = activate_this))
EOF
  

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

Проверка / выделение синтаксиса

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

  Плагин vim-syntastic / syntastic
  

Также добавьте проверку PEP 8 с помощью этого изящного маленького плагина:

Наконец, сделайте ваш код красивым:

  пусть python_highlight_all = 1
синтаксис на
  

Цветовые схемы

Цветовые схемы работают вместе с основной цветовой схемой, которую вы используете. Проверьте Solarized для режима GUI и Zenburn для режима терминала:

  Плагин jnurmine / Zenburn
Плагин altercation / vim-colors-solarized
  

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

  если есть ('gui_running')
  установить background = dark
  Цвета соляризованный
еще
  цветсхема zenburn
endif
  

Solarized также поставляется с темной и светлой темой. Чтобы переключаться между ними было очень легко (нажав F5 ), добавьте:

  call togglebg # map ("")
  

Просмотр файлов

Если вам нужно правильное дерево файлов, то NERDTree - это то, что вам нужно:

  Плагин scrooloose / nerdtree
  

Если вы хотите использовать вкладки, используйте vim-nerdtree-tabs:

  Плагин jistr / vim-nerdtree-tabs
  

Хочу спрятать .pyc файлов? Затем добавьте следующую строку:

  let NERDTreeIgnore = ['\.  Pyc $', '\ ~ $'] "игнорировать файлы в NERDTree
  

Супер поиск

Хотите искать в VIM что угодно? Проверить ctrlP:

Как и следовало ожидать, нажатие Ctrl + P включит поиск, так что вы можете просто начать печатать. Если при поиске будет найдено что-либо, близкое к искомому файлу, он будет найден. Да, и это не только файлы: он также найдет теги! Чтобы узнать больше, посмотрите это видео на YouTube.

Нумерация строк

Включите номера строк сбоку экрана с помощью:

Интеграция с Git

Хотите выполнять базовые команды git, не выходя из VIM? Тогда vim-fugitive - лучший вариант:

  Плагин tpope / vim-fugitive
  

Посмотрите это в действии на VIMcast.

Линия электропередачи

Powerline - это строка состояния, в которой отображаются такие вещи, как текущий virtualenv, ветка git, редактируемые файлы и многое другое.

Он написан на Python и поддерживает ряд других сред, таких как zsh, bash, tmux и IPython:

  Плагин 'Lokaltog / powerline', {'rtp': 'powerline / bindings / vim /'}
  

Взгляните на официальную документацию по всем параметрам конфигурации.

Системный буфер обмена

Vim обычно имеет собственный буфер обмена и игнорирует системные клавиатуры, но иногда вам может потребоваться вырезать, скопировать и / или вставить в / из других приложений за пределами VIM.В OS X вы можете получить доступ к системному буферу обмена с помощью этой строки:

VIM в оболочке

Наконец, освоив VIM и его сочетания клавиш, вы часто будете раздражаться из-за отсутствия таких же сочетаний клавиш в оболочке. Не бойтесь: большинство оболочек имеют режим VI. Чтобы включить его для вашей оболочки, добавьте следующую строку в ~ / .inputrc :

Теперь вы сможете использовать комбинации клавиш VIM не только в оболочке, но и в интерпретаторе Python и любом другом инструменте, который использует GNU Readline (большинство оболочек баз данных).Теперь VIM есть везде!

Заключение

Вот и все (по крайней мере, для разработки на Python). Есть множество других расширений, которые вы можете использовать, а также альтернативы всему, что описано в этом посте. Какие расширения вам нравятся больше всего? Как вы настроили VIM, чтобы он соответствовал вашей личности?

Вот ссылка на мою текущую конфигурацию VIM. Есть свой собственный? Поделись, пожалуйста!

Спасибо за чтение!

Использование листа бумаги в качестве терминала

2020-10-05 - Роберт Элдер

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

Несмотря на то, что он появился в конце 1960-х, редактор 'ed' по-прежнему установлен по умолчанию в большинстве современных дистрибутивов Linux. Несмотря на то, что сегодня существует несколько практических примеров использования этого редактора, все же имеет смысл изучить, как работает 'ed', поскольку другие инструменты Unix, такие как vim, grep или sed, имеют функции, на которые значительно влияет 'ed'.

Если вы попытаетесь запустить команду ed с аргументом файла или без него, вы увидите что-то вроде этого:

Если вы ждете, что что-то произойдет, вы будете ждать долго.Это потому, что 'ed' ждет, что вы что-то сделаете! Программа ed не работает как другие текстовые редакторы командной строки, такие как vim или nano. «Ed» очень серьезно относится к роскоши возможности распечатать содержимое текущего файла на терминале. Вот почему вам нужно явно дать команду 'ed' сделать это!

Например, если вы хотите распечатать отдельную строку в файле, вы можете просто ввести номер строки и нажать Enter. Если вы хотите добавить текст, используйте однобуквенную команду «a» в отдельной строке, чтобы войти в режим «добавления».Когда вы закончите добавлять текст, напишите "." в отдельной строке и нажмите клавишу ВВОД, чтобы прекратить добавление текста в файл. Чтобы просмотреть все строки в файле, вы можете использовать команду '1, $ p'. Наконец, как только вы закончите редактировать файл, вы можете использовать 'wq' для выхода:

 1
Привет мир. 
а
Вот еще текст.
.
1, $ p
Привет мир.
Вот еще текст.
wq
 

Чтобы понять, почему этим редактором так сложно пользоваться, имеет смысл подумать о том, как люди взаимодействовали с компьютерами на заре компьютерных технологий.Примерно в то время, когда был создан «ed», компьютеры все еще могли печатать свою продукцию на бумаге вместо электронных экранов! Эти ранние устройства вывода назывались «телетайпами», часто сокращенно TTY. Термин TTY все еще используется в большинстве систем * nix по сей день, и если вы запустите эту команду, вы, вероятно, сможете увидеть некоторые виртуальные устройства TTY в своей системе:

 LS / DEV / TTY *
 

Эта древняя модель отправки бесконечного потока символов (посылаемых поочередно) на «терминал» или «телетайп», которое «печатает» или «отображает» их, все еще используется сегодня.Он даже используется более современными терминальными программами, такими как vim или nano! Вы можете не поверить, что vim работает таким образом, потому что он отображает всевозможную информацию вверху и внизу терминала. Vim также позволяет вам прокручивать вверх и вниз или открывать разделение экрана и т. Д. Вы не можете отправить вывод vim на принтер, верно? Да, вы можете, и это именно то, что мы собираемся попробовать.

Команда 'script' позволяет вам захватить весь вывод во время сеанса терминала и сохранить его в файл.Это отличный способ регистрировать вывод, когда вы выполняете последовательности команд, которые вам нужно отслеживать, но вы также можете использовать его для захвата всего, что выводится на терминал во время сеанса vim:

 сценарий
 

После выполнения команды 'script' попробуйте открыть сеанс vim. Сделав несколько действий в vim, выйдите и запустите команду exit в оболочке, чтобы выйти из сеанса сценария и завершить ведение журнала:

 выход
 

Весь вывод сеанса терминала теперь сохраняется в файле под названием «typescript».Вот изображение того, как выглядит часть вывода в скрипте:

Многие из этих, казалось бы, бессмысленных символов на самом деле являются escape-кодами ANSI. Это секрет того, как vim (и все другие терминальные приложения) могут использовать последовательный вывод для печати всевозможных интересных пользовательских интерфейсов. Что наиболее важно, некоторые из этих управляющих последовательностей позволяют перемещать курсор печати в произвольные позиции. Вот как vim может удерживать текст в нижней или верхней части терминала, создавая иллюзию прокрутки файла «вверх» или «вниз».Некоторые escape-коды также управляют цветом переднего плана и фона.

Раньше эти escape-коды фактически не обрабатывались ЦП. Вместо этого они интерпретировались самим устройством мониторинга «терминала». Другими словами, самые старые «терминалы» можно рассматривать как физически отдельные устройства, которые получали последовательный поток текста, инструкции перемещения курсора и инструкции изменения цвета. На «современном» компьютере каждое открываемое вами «терминальное» окно представляет собой программную эмуляцию древнего физического устройства, которое, как вы можете представить, выглядит как маленький и громоздкий ЭЛТ-монитор. Сегодня эти escape-коды обрабатываются процессором вашего ноутбука или настольного компьютера внутри этих программно эмулируемых терминалов в графической среде рабочего стола.

Итак, что мешает нам попытаться отобразить вывод vim на листе бумаги, чтобы представить, что мы живем в 1969 году? Ничего! Вот как выглядит вывод vim, когда я пытаюсь визуализировать его с помощью лазерного принтера:

Причина, по которой этот вывод не выглядит очень полезным, заключается в том, что мой принтер не предназначен для использования в качестве терминала отображения для vim.Он не знает, что делать со всеми escape-последовательностями ANSI, и в итоге мы получаем этот странный беспорядок. Вы видите часть «? 2004h» в начале вывода? Вы можете найти это и увидеть, что это escape-последовательность ANSI, чтобы «Включить режим вставки в скобках». Это упражнение, предоставляемое читателю для поиска остальных управляющих последовательностей ANSI, показанных на странице выше.

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

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

А вот как выглядело бы использование ed, если бы вы могли визуализировать его вывод только на листе бумаги:

Поскольку 'ed' не печатает управляющие последовательности ANSI, мой принтер печатает это без проблем!

Основываясь на двух описанных выше опытах, какой редактор, по вашему мнению, вы бы предпочли, если бы вам приходилось печатать весь вывод на бумаге?

Если вы решите попробовать изучить 'ed', вы обнаружите, что справочные страницы и флаг '-h' не очень полезны.Вместо этого вам следует проверить информационные страницы, так как там вы узнаете все подробности о различных режимах редактора и однобуквенных командах:

 инфо
 

После того, как вы немного поиграете с 'ed', вы поймете, что он сам по себе действует почти как оболочка командной строки. Единственное отличие состоит в том, что среда, в которой вы работаете, представляет собой файл, а не пространство пользователя вашей операционной системы. Каждая небольшая операция ввода-вывода в файле реализуется как команда, которая требует как можно меньше информации.В этом есть смысл, когда нужно все распечатать на бумаге!

Представьте, что вы работаете с файлом в современном Vim, где ваши выходные данные всегда идут на принтер. Теперь вы решаете открыть файл журнала, чтобы проверить, что находится в последней строке, и сразу же ваш принтер начинает перемешивать полную страницу материала. К сожалению, вы открыли не тот файл. Попробуйте другой файл, и снова ой! Опять неправильный файл! Это много потраченной впустую бумаги. Что это за миллениалы и их модные текстовые редакторы, которые просто автоматически печатают каждую строку! Я помню старые добрые времена, когда пользователи контролировали свои системы, и программы не могли просто делать то, что они хотят, не спрашивая!

В заключение, причина того, почему команда ed работает так, как она работает, была связана с более высокими ограничениями ресурсов, которые существовали в то время. Такие функции, как электронные дисплейные терминалы и escape-последовательности ANSI, не были достаточно распространены в то время, когда был создан ed, поэтому не было причин рассматривать их использование. Вместо этого интерфейс командной строки, подобный оболочке, для редактирования файлов имел больше смысла.

Vimways ~ Фильтры Vim, внешние команды и оболочка

Не люби меня, флако. Любите свою маму. Я просто играю в футбол.

- Хуан Роман Рикельме

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

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

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

  $ кот плод. Txt
апельсины 5
яблоки 7
черника 15
бананы 4
ананас 6
  

Когда дело доходит до списков фруктов, есть бесконечные возможности. Например, вы можете отформатировать их в виде таблицы:

  $ cat fruit.txt | столбец -t
апельсины 5
яблоки 7
черника 15
бананы 4
ананас 6
  

отсортировать по количеству:

  $ кошачьи фрукты.txt | столбец -t | sort -nrk 2
черника 15
яблоки 7
ананас 6
апельсины 5
бананы 4
  

или выведите, сколько всего фруктов:

  $ cat fruit. txt | awk '{сумма + = $ 2} END {вывод суммы}'
37
  

Вы можете фильтровать и преобразовывать текст практически любым способом, используя командную строку, вы можете удалять повторяющиеся строки с абсолютной поэзией команды awk '! Visit [$ 0] ++' (для любопытных), измените фигурные скобки на заключен в скобки с tr '{}' '()' , или удалите первые три символа в каждой строке с помощью cut -c3- .

Дело в том, что обработка текста в командной строке - мощных . Трудно описать красоту выполнения цепочки команд и наблюдения за тем, как трубка за трубкой трансформирует ваш текст как идеальную симфонию потоков; волшебство выполнения такой большой работы с помощью небольшого количества нажатий клавиш. Однако тот факт, что вы являетесь пользователем Vim, заставляет меня думать, что вы очень хорошо знаете это чувство.

Если говорить о Vim, разве не было бы замечательно, если бы вы могли использовать расширенные инструменты обработки текста, такие как awk , tr , jq , bc , при редактировании буфера Vim? Возможно, для вас не станет сюрпризом, когда я скажу вам, что на самом деле вы можете.

Большой взрыв

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

В Vim символ взрыва (! ) используется для взаимодействия с внешними командами.

Выполнение внешних программ из Vim

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

 :! {Cmd}
  

Это покажет стандартный вывод cmd в командной строке в нижней части окна Vim (: h!: Cmd ).

Но мальчик, мы только начинаем. Вы можете использовать bang вместе с командами : read и : write для чтения и записи при выполнении программ внешней оболочки.

Чтение вывода команды в буфер

Например, используя

 : прочтите! {Cmd}
  

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

 : 3read! Curl --silent ifconfig.меня
  

Вставит ваш публичный IP-адрес в строку 3 (: h прочитано! ).

Использование буфера в качестве входных данных для команды

Другой способ тоже работает, вы можете выполнить программу с содержимым вашего буфера в качестве ввода:

 : [диапазон] запись! {Cmd}
  

будет использовать строки, указанные в диапазоне (или весь буфер, если он не указан), в качестве стандартного ввода для cmd и отобразит свой стандартный вывод под окном Vim.: h w_c

Например, если вы хотите выполнить выбранные строки с помощью интерпретатора Python, вы можете сделать:

 : '<,'> написать! Python
  

Использование взрыва с чтение и запись удобно, но что, если вы хотите сделать и то, и другое: использовать диапазон в качестве входных данных для команды, а заменить его на стандартный вывод команды? Это тоже работает! Это называется фильтром и составляет основу обработки текста в командной строке: введите текст, преобразуйте его (форматируйте, сортируйте и т. Д.)) и выведите преобразованную версию.

Фильтры имеют следующий стандартный вид:

 : {диапазон}! {Фильтр}
  

Приведенный выше вызов возьмет строки, указанные в диапазоне , и заменит их выводом filter (: h:! ).

При редактировании нашего инвентаря фруктов мы могли сделать следующее прямо из командной строки Vim:

  апельсины 5
яблоки 7
черника 15
бананы 4
ананас 6

:%! sort -nrk 2 | столбец -t
  

Это заменяет весь буфер отсортированной и отформатированной версией:

  черника 15
яблоки 7
ананас 6
апельсины 5
бананы 4
  

Привязки нормального режима

Фильтры Vim настолько полезны, что есть привязка в обычном режиме для фильтрации строк через внешние программы, как вы уже догадались, бах!

 ! {Motion}
  

Набираем ! в нормальном режиме, за которым следует движение (например, ! 4j ), заполнит командную строку Vim диапазоном, соответствующим данному движению: (: ч! )

 :. ,. +4! {Filter}
  

Следуя общей схеме команд Vim, !! отфильтрует текущую строку:

 :.! {фильтр}
  

Затем вы можете ввести команду фильтрации, например cowsay , которая отфильтрует указанный диапазон и заменит его на:

  ________________________________________
/ Я просто хотел бы вмешаться \
| момент. То, что вы называете |
| Linux, по сути, GNU / Linux, или как |
| Недавно я стал называть это GNU |
| плюс Linux.\ (оо) \ _______
            (__) \) \ / \
                || ---- w |
                || ||
  

или создайте причудливое изображение ascii с figlet

  ____ _______ __ ___ _ _
 | __) _ _ \ \ / / | _ _ | _ _ ___ ___ / \ _ __ ___ | | __
 | _ \ | | \ \ / \ / / | | | | | / __ | / _ \ / _ \ | '__ / __ | '_ \
 | | _) || | \ V V / | | | | _ | \ __ \ __ / / ___ \ | | | (__ | | | |
 | ____ / | _ | \ _ / \ _ / | ___ | \ __, _ | ___ / \ ___ | / _ / \ _ \ _ | \ ___ | _ | | _ |
                                                                        
                                                
  

Это все люди

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa