Редактор 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 разрешило эту проблему для меня.
закрытие.