Редактор Mathematica: Удаление правильного совпадения ']' автоматически при удалении левой '['?

В редакторе Mathematica (например, ноутбук) одна из самых сложных вещей, которые я всегда обнаружил, - это когда я хочу отредактировать какое-то длинное выражение, а затем удаляю левый конец "[" некоторого выражения, прежде чем я получу возможность удалить правой "]", код в ячейке будет запутан, поскольку он уже не сбалансирован, что делает его действительно трудным, чтобы преследовать, теперь висящий, правый конец "]", поскольку он больше не находится в исходном месте

Вот простой пример, предположим, что мы имеем это

Text[Row[{PaddedForm[currentTime, {6, 3}, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}]}]]

теперь скажу, что я хочу удалить внешний вызов Text []. Поэтому я удаляю "Текст [", и прежде чем я получу шанс удалить другую сторону "], ноутбук теперь будет жонглировать вещами повсюду, что затрудняет поиск правильного" ] ". Для длинных ячеек (что характерно для работы с демонстрациями) код может сдвигаться на большое количество, а правый "]" также может исчезнуть из-под контроля, должен прокручиваться вниз и искать его.

Есть ли способ установить его с помощью опции или такой, так что, когда я удалю левый "[", Mathematica автоматически удалит соответствующее право "]"? Это относится и к "(" и ")".

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

спасибо --Nasser

Ответы

Ответ 1

Далее будет добавлена ​​комбинация клавиш Shift + Backspace для удаления ближайших закрывающих скобок текущей позиции курсора. Он также добавляет пункт меню в меню редактирования.

Эта функция принимает текущее содержимое буфера обмена и удаляет первое и последнее слово.

cutClipboardBrackets:=Module[{nb},
 nb=CreateDocument[{},Visible->False,WindowSelected->False];
 NotebookWrite[nb,[email protected][]]
 SelectionMove[nb,All,CellContents];
 FrontEndExecute[FrontEndToken[nb,"MoveCellBeginning"]]          
 SelectionMove[nb,All,Word,1];
 NotebookDelete[nb];
 FrontEndExecute[FrontEndToken[nb,"MoveCellEnd"]];
 SelectionMove[nb,All,Word,1];
 NotebookDelete[nb];
 SelectionMove[nb,All,CellContents];
 FrontEndExecute[FrontEndToken[nb,"Copy"]];
];

Это можно использовать для удаления скобок, поскольку они являются первым и последним словом при копировании FrontEndExecute[FrontEndToken[nb,"Balance"]]. Функция, которая выбирает, режет, удаляет дополнительные скобки и пасты:

RemoveBrackets[nb_]:= ( 
 FrontEndExecute[FrontEndToken[nb,"Balance"]];
 FrontEndExecute[FrontEndToken[nb,"Cut"]];
 cutClipboardBrackets;
 FrontEndExecute[FrontEndToken[nb,"Paste"]];
);

Наконец, мы можем защитить функции и добавить комбинацию клавиш (как здесь):

 Protect[cutClipboardBrackets,ClipboardBrackets];

 FrontEndExecute[
  FrontEnd`AddMenuCommands[
   "SelectAll",{Delimiter,MenuItem["Delete Outer Brackets",
     FrontEnd`KernelExecute[nb=CreateDocument[Null,Visible->False,WindowSelected->True];
  NotebookWrite[nb,Cell[BoxData[RowBox[{"RemoveBrackets[SelectedNotebook[]]"}]],"Input"]];
  SelectionMove[nb,Previous,Cell];
  SelectionEvaluate[nb];
  NotebookClose[nb]],
  MenuKey["Backspace",Modifiers->{"Shift"}],System`MenuEvaluator->Automatic]}]]

Ответ 2

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

  • поместите курсор на первый токен внутри функции, которую вы хотите удалить (в этом случае строка)

  • нажмите Ctrl + ., пока не будет выбрано все внутри (в данном случае два раза)

  • Копировать

  • нажмите Ctrl + . один раз, чтобы включить функцию для удаления в выборе

  • Вставить

Это действительно довольно быстро, как только вы это сделаете несколько раз.


Эндрю Мойлан предлагает эту вариацию мыши:

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

  • Тройной щелчок "Строка", Ctrl + C, Тройной щелчок "Текст", Ctrl + V, выполненный

Ответ 3

Я только что зарегистрировался здесь, и теперь у меня нет MMA, так что это всего лишь схема предлагаемого решения. Это мой первый ответ здесь, так что медведь со мной, пожалуйста. Кстати... приятно видеть здесь многих математиков.: -)

Вопрос/проблема Насера ​​очень распространена. Я лично использую тот же метод, описанный Эндрю. Это не сложно, однако решить эту проблему более элегантно с помощью кнопки.

Создайте небольшую палитру кнопок с кнопкой действия. Он будет работать следующим образом:

  • вы дважды щелкните самый внешний функции (той, которую вы хотите Удалить). Поскольку вы дважды щелкните по нему вы выберете все до самый правый].
  • вы нажимаете кнопку действия. код в кнопке будет просто получить выбор и извлечение аргумент внутри пары [], тогда вставьте аргумент на выбор в записной книжке. Без оценивая, конечно, аргумент.

Что это. Пара строк кода.

Так как вы на нем, вы можете добавить еще несколько кнопок в палитру. Например:

  • кнопка для комментариев/ Выбор
  • кнопку для переноса {} или() на Выбор
  • кнопку, чтобы обернуть удовольствие [] выбор (забава может быть выбрана поэтому его можно позже перезаписать соответствующая функция)

Итак, вы создаете собственную палитру программирования.

Ответ 4

Если вы удаляете функцию только с одним аргументом, вы можете

  • удалить имя функции
  • используйте (Ctrl +., Ctrl +.) внутреннюю функцию, чтобы выбрать ее экстенты
  • перейдите к концу этой области и удалите]

На этом веб-сайте также есть дополнительная информация о балансировочных скобках в Mathematica: http://reference.wolfram.com/mathematica/howto/BalanceBracketsAndBraces.html

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

Ответ 5

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

Разбить код на несколько строк, чтобы каждый функциональный блок открывался и закрывался отдельной строкой (вроде C, С++). Например, ваш предыдущий код будет выглядеть как

Text[
 Row[{
   PaddedForm[
    currentTime, {6, 3},
    NumberSigns -> {"", ""},
    NumberPadding -> {"0", "0"}
    ]
   }]
 ]

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

Ответ 6

Я отвечаю на свой вопрос здесь. Использование CODE в качестве типа ячейки вместо INPUT разрешило эту проблему для меня. закрытие.