Как сделать символ " ^ " в MATLAB?
^
является экспоненциальным оператором в MATLAB. Проблема в том, что его нет на многих неанглийских раскладках клавиатуры, и если вы используете его много в своей работе, переключение между HR и EN становится хлопотным.
есть ли способ добавить его на панель инструментов MATLAB (например, в Excel, чтобы вы могли использовать его с помощью мыши или тачпада) или определить пользовательский ключ (например, F12) в MATLAB для его замены?
Я надеюсь на не АХК решение, и как.
6 ответов
создайте ярлык панели инструментов, дайте ему имя и поместите следующее в обратный вызов:
clipboard('copy','^')
запуск этого разместит символ экспоненты ^
в буфер обмена. Как только вы нажмете его, сделайте Ctrl+V вставить.
вы можете применить эту идею для создания библиотеки клипов фрагментов, доступных из меню "Пуск" MATLAB.
В Windows (с Num Lock on), удерживайте нажатой Alt, тип 94 на цифровой клавиатуре, и освободить Alt. The ^
будет вставлен в позицию курсора.
это общий метод вставки произвольных символов Юникода в Windows, независимо от того, находятся ли они на клавиатуре.
на ^
символ U+5E
, которая составляет 94
в десятичное.
Я бы предложил загрузить представление EditorMacro С Яир Альтман на Обмен Файлами MathWorks. Если вы запустили следующий код в окне команды MATLAB (в то время как редактор MATLAB был открыт):
EditorMacro('Alt 6','^');
он создаст макрос в контексте редактора MATLAB и командного окна, который вставит строку ^
в положении каретки, когда вы нажмете комбинацию клавиш Alt+6 (который не должен быть привязан к любому другому макро/операции, насколько я знаю).
так как вы упомянули переключение между Хорватии и английский язык раскладка клавиатуры, вероятно, раздражает необходимость запоминать различные комбинации клавиш для одних и тех же символов. Используя EditorMacro
, вы можете создать набор макросов в окне редактора и команды MATLAB, который позволит вам использовать тот же набор нажатий клавиш для каждого символа независимо от типа клавиатуры, которую вы использовали.
так как макросы сделаны с EditorMacro
удаляются каждый раз, когда MATLAB закрыт, вы можете создать (который будет автоматически запускаться при каждом открытии MATLAB), чтобы создать макросы для вас. Файл может выглядеть примерно так:
edit; %# Open the Editor so EditorMacro works properly
EditorMacro('Alt 5','%'); %# Create "%" macro
EditorMacro('Alt 6','^'); %# Create "^" macro
EditorMacro('Alt 7','&'); %# Create "&" macro
...
в этом примере, я в основном воспроизводящие поведение Shift плюс число на английской клавиатуре используя Alt вместо.
и если все остальное терпит неудачу...
вы всегда можете использовать функциональные формы арифметических операторов в крайнем случае:
-
power(A,B)
вместо элементарной операции питанияA.^B
-
mpower(A,B)
вместо работы матричного питанияA^B
это не будет красиво, но это сработает.
какая клавиатура у вас есть, что она не включена?
http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx
мы сделали быструю проверку после просмотра этого вопроса и не смогли найти клавиатуру без символа.
поговорил с нашей командой MATLAB I18N об этом и поставил запрос на улучшение.
- ладно... Вот хак, который позволяет переназначать произвольные нажатия клавиш в окне команды и Редакторе Matlab. Это неподдерживаемый hack, который включает в себя недокументированные внутренности IDE. Но это "магия", как ты и надеялся. Работает в R2008b и R2009b для меня.
во-первых, определите класс Java, который может обрабатывать события, заменяя их другими нажатиями клавиш. Скомпилируйте это в JAR и получите его на javaclasspath вашего Matlab.
package test;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;
/**
* An action that responds to an event with another keystroke.
*/
public class KeyReplacementAction extends TextAction {
private final char replacement;
/**
* @param name Name of this action (ignored in practice)
* @param replacement char to replace the event with
*/
public KeyReplacementAction(String name, char replacement) {
super(name);
this.replacement = replacement;
}
public void actionPerformed(ActionEvent e) {
if (!(e.getSource() instanceof JTextComponent)) {
return;
}
JTextComponent src = (JTextComponent) e.getSource();
KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED,
java.lang.System.currentTimeMillis(), 0,
KeyEvent.VK_UNDEFINED, replacement);
src.dispatchEvent(replacementEvent);
}
}
Теперь, используйте код Matlab, чтобы копаться в виджетах Swing IDE, находить карты клавиш для окна редактора и команды и добавлять обработчики для их переназначения.
function remap_keys_in_text_areas()
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas
%
% Must be called after the editor is open, otherwise it won't find the
% editor keymap.
% { from, to; ... }
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font
map = {
'$' '^'
'#' char(181) % might be useful for text formatting
};
make_sure_editor_is_open(); % otherwise we won't find its keymap
keymaps = find_ide_keymaps();
for i = 1:size(map,1)
[from,to] = map{i,:};
disp(sprintf('Re-binding %s to %s in text areas', from, to));
for j = 1:numel(keymaps)
bind_keystroke_for(keymaps{j}, from, to);
end
end
function make_sure_editor_is_open()
s = find_editor_widgets();
if isempty(s.editors)
edit;
end
function bind_keystroke_for(keymap, from, to)
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component
import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import test.KeyReplacementAction;
key = javax.swing.KeyStroke.getKeyStroke(from);
action = KeyReplacementAction(['remap ' from ' to ' to], to);
keymap.addActionForKeyStroke(key, action);
function out = find_ide_keymaps
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets
set = java.util.HashSet();
s = find_editor_widgets();
widgets = [s.cmdwin s.editors];
for i = 1:numel(widgets)
set.add(widgets{i}.getKeymap());
end
set = set.toArray();
out = cell(size(set));
for i = 1:numel(set)
out{i} = set(i);
end
function out = find_editor_widgets
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI
out.cmdwin = [];
out.editors = {};
wins = java.awt.Window.getOwnerlessWindows();
for i = 1:numel(wins)
if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame')
out.cmdwin = get_command_window_from_mainframe(wins(i));
elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame')
out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))];
end
end
function out = get_command_window_from_mainframe(frame)
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView');
function out = get_text_areas_from_editor_frame(frame)
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane');
function out = findobj_swing_widget(widget, klass)
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class
out = {};
if isa(widget, klass)
out{end+1} = widget;
end
for i = 1:widget.getComponentCount()
out = [out findobj_swing_widget(widget.getComponent(i-1), klass)];
end
чтобы активировать переназначения, просто вызовите функцию. Вы можете сделать это из startup.м, чтобы это произошло автоматически.
>> remap_keys_in_text_areas Re-binding $ to ^ in text areas Re-binding # to µ in text areas
вы можете просто использовать следующую математическую идентичность:
a^b ≡ exp(b*ln(a))
Я как раз собирался предложить C-style POWER(A,B)
функция для замены функциональности ^
оператора, но gnovice опереди меня. Я бы предположил, что это то, что POWER(A,B)
и MPOWER(A,B)
функции на основе.
как вы можете видеть из ответов, опубликованных, есть много альтернатив. Это вопрос вкуса, функциональности и повторения.