1

Используя MacVim, я бы хотел, чтобы Command -f не отображал диалог поиска и замены OS X, а вместо этого начал обычный поиск в Vim, то есть отправку / из обычного режима.

Т.е. Я бы хотел, чтобы MacVim использовал внутренний поиск Vim вместо OS X 'Find /Replace.

(Я надеюсь, что есть специфичная для MacVim настройка, которую я могу просто добавить в .vimrc)

2 ответа2

8

Уберите ⌘F и переназначьте его

Вы можете «отменить привязку» ⌘F (Command+F ; записывается как <D-f> в Vim) из пункта меню « Правка» > « Найти» > « Найти ...» с помощью команды MacVim 's :macmenu а затем сопоставить его с помощью команды normal :map .

if has('gui_macvim')
  macmenu Edit.Find.Find\.\.\. key=<nop>
  map <D-f> /
endif

Эта команда :macmenu эффективна только в том случае, если вы поместите ее в ~/.gvimrc , поэтому приведенные выше строки должны быть размещены там.

Диалоговое окно поиска Mac OS X по-прежнему будет отображаться, если вы вызовете сам пункт меню (щелкнув по нему или используя :emenu).

Переопределить пункт меню

Альтернативный подход заключается в переопределении самих пунктов меню. Это было бы неуместно, если вы хотите связать ⌘F с какой-либо другой функцией (поскольку пункт меню « Правка» > « Найти» > « Найти ...» будет делать что-то иное, чем поиск!), Но это может быть приемлемо, поскольку вы просто хотите начать другой стиль поиска.

Вы можете использовать варианты команды :menu чтобы переопределить пункт меню, чтобы он был (более или менее) эквивалентен вводу /:

if has("gui_macvim")
  nmenu Edit.Find.Find\.\.\. /
  vmenu Edit.Find.Find\.\.\. <C-C>/
  imenu Edit.Find.Find\.\.\. <C-\><C-O>/
  cmenu Edit.Find.Find\.\.\. <C-C>/
  omenu Edit.Find.Find\.\.\. <C-C>/
endif

Лучшее место для этих команд - ваш ~/.gvimrc (хотя по несколько иным причинам, чем для команды :macmenu выше).

Эти команды охватывают обычный режим, режимы просмотра и выбора, режим вставки, режим команд и режим ожидания оператора.

Этот подход означает, что как нажатие клавиши ⌘F, так и выбор пункта меню запустят поиск на основе / (т. Е. Режим, указанный курсором сразу после / в области командной строки вместо использования GUI-based :promptfind).


Размещение команд

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

Наибольшее влияние на эффективность команд меню оказывает их расположение по отношению к источнику $VIMRUNTIME/menu.vim . Этот файл содержит команды, которые создают меню. Он автоматически поступает между ~/.vimrc и ~/.gvimrc , но также может быть источником вручную (например, см :help console-menus). Большинство команд в этом файле защищены оператором if, поэтому они выполняются только один раз. Это означает, что вы можете получить его вручную, а затем переопределить некоторые пункты меню в вашем .vimrc чтобы вы могли использовать измененные пункты меню как в режиме консоли, так и в графическом режиме.

Размещение nmenu ,…

Команды из решения «Переопределить пункт меню» могут быть эффективными в вашем ~/.vimrc если вы поставите перед ними source $VIMRUNTIME/menu.vim . Если вы сначала не используете исходный код menu.vim , то ваши определения будут перезаписаны, если / когда он будет получен позднее (т.е. позже в ~/.vimrc ; автоматически, при включении подсветки синтаксиса; автоматически, перед ~./gvimrc для GUI- основанные экземпляры Vim, или вручную, при : приглашение).

Большинство экземпляров Vim с графическим интерфейсом используют Edit.Find\.\.\. для пункта меню, но MacVim вставляет подменю Find в иерархию, чтобы соответствовать обычному расположению Mac OS X, поэтому команды должны быть защищены с помощью has('gui_macvim') (чтобы они не вызывали ошибок, если вы когда-либо используете свой запуск файл со сборкой Vim, не относящейся к MacVim ).

Размещение macmenu

Команда macmenu действует только во время запуска. Вы можете ввести его в приглашении : но на самом деле он не меняет никаких настроек, если вы используете его таким образом. Это упомянуто в :help :macmenu , но я пропустил его несколько раз и просмотрел документацию:

Эта команда должна использоваться в файле запуска, например в "~/.gvimrc". В противном случае это никак не влияет.

В menu.vim после создания пунктов меню некоторые команды macmenu используются для установки сочетаний клавиш по умолчанию для пунктов меню и запускаемых ими действий «GUI» в графическом интерфейсе. Однако, в отличие от команд определения меню в том же файле, команды macmenu которые устанавливают эти привязки, не защищены от многократного запуска. Это означает, что вы можете использовать команды macmenu в ~/.vimrc для установки привязок / действий для элементов меню, которые не имеют привязок / действий по умолчанию, но вы должны использовать ~/.gvimrc для изменения привязок / действий, установленных в menu.vim . Это похоже на небольшую ошибку в MacVim- версии menu.vim .

Таким образом, единственное (в настоящее время) допустимое место для команды macmenu находится в ~/.gvimrc , после последнего выбора времени запуска menu.vim . И снова, некоторые из иерархий меню специфичны для MacVim , поэтому команды должны быть защищены с помощью has('gui_macvim') .

Размещение map <D-f>

Нотация ключа <D-…> выглядит так, как будто она действительна в большинстве сборок Vim (хотя, вероятно, ее можно использовать только в сборках «Mac»). Таким образом, вы должны иметь возможность безопасно отображать клавиши Command в вашем ~/.vimrc не беспокоясь о том, что вы можете вызвать ошибки для других сборок Vim. Конечно, в MacVim, если вы отображаете клавишу, которая обычно является ярлыком пункта меню, вам также придется отсоединить его от пункта меню (что означает сопровождающую команду macmenu в ~/.gvimrc).

1

Вы можете отменить привязку Command+F, используя macmenu. Пример кода для вас .gvimrc ниже:

if has("gui_macvim")
  macmenu &Edit.Find.Find\.\.\. key=<nop>
  map <D-f> /
endif

Как указано в вопросе ниже, это должно быть в вас .gvimrc, а не в вашем .vimrc

MacVim: переназначить комбинации клавиш, например <df>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .