I recently updated to SmartSVN 14, and all my previously assigned custom keyboard shortcuts failed to work.
The accelerators were assigned in SmartSVN 11.0.4 (or earlier), and they were saved in the "accelerators.xml" file under "%APPDATA%\SmartSVN\11".
According to the SmartSVN 1.12.0-rc1 changelog, the settings files are now stored in YMLL instead of XML. The location of the new "accelerators.yml" file is "%APPDATA%\SmartSVN\14".
Before making any changes to SmartSVN settings, I examined that file and saw all my previous custom shortcuts stored in the "workingCopy" object, however when I began re-assigning those shortcuts, the updates were stored in the "global" object.
Its seems like the v11 -> v14 settings migration process placed all the custom accelerator assignments in "workingCopy" when they should be stored in "global". If that is the case, this appear to be a bug.
What is the purpose of "workingCopy"? I see no way to specify where an accelerator assignment should be stored in the SmartSVN Preferences UI.
Original accelerators.xml:
<?xml version="1.0" encoding="UTF-8"?>
<obj key="Accelerators" type="@AllAccelerators">
<obj key="annotateAccelerators" type="_NULL_"/>
<obj key="changeReportAccelerators" type="@KeyStrokes">
<collection key="id-keystroke-mapping" type="Object"/>
</obj>
<obj key="compareAccelerators" type="_NULL_"/>
<obj key="comparePropertiesAccelerators" type="@KeyStrokes">
<collection key="id-keystroke-mapping" type="Object"/>
</obj>
<obj key="conflictSolverAccelerators" type="_NULL_"/>
<obj key="mainFrameAccelerators" type="@KeyStrokes">
<collection key="id-keystroke-mapping" type="Object">
<obj type="@KeyStroke">
<prop key="id" type="String" value="changeset-move-to-other"/>
<prop key="keystroke" type="String" value="CTRL+M"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="compare"/>
<prop key="keystroke" type="String" value="CTRL+N"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="compare-two-files"/>
<prop key="keystroke" type="String" value="CTRL+SHIFT+N"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="compare-with-head"/>
<prop key="keystroke" type="String" value="CTRL+H"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="compare-with-previous"/>
<prop key="keystroke" type="String" value="CTRL+P"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="compare-with-revision"/>
<prop key="keystroke" type="String" value="CTRL+SHIFT+P"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="findAction"/>
<prop key="keystroke" type="String" value="CTRL+SHIFT+F"/>
</obj>
<obj type="@KeyStroke">
<prop key="id" type="String" value="window-new"/>
<prop key="keystroke" type="String" value="ALT+CTRL+SHIFT+N"/>
</obj>
</collection>
</obj>
<obj key="logAccelerators" type="@KeyStrokes">
<collection key="id-keystroke-mapping" type="Object"/>
</obj>
<obj key="revisionGraphAccelerators" type="_NULL_"/>
<obj key="serverOutputAccelerators" type="_NULL_"/>
<obj key="dryMergeAccelerators" type="_NULL_"/>
<obj key="applyPatchAccelerators" type="_NULL_"/>
<obj key="compareUrlsAccelerator" type="_NULL_"/>
<obj key="repositoryBrowserAccelerators" type="@KeyStrokes">
<collection key="id-keystroke-mapping" type="Object"/>
</obj>
<obj key="transactionFrameAccelerators" type="_NULL_"/>
</obj>
New accelerators.yml (after the accelerators were re-assigned):
changeReportAccelerators:
id-keystroke-mapping: []
comparePropertiesAccelerators:
id-keystroke-mapping: []
logAccelerators:
id-keystroke-mapping: []
repositoryBrowserAccelerators:
id-keystroke-mapping: []
global:
- {action: changeset-move-to-other, keyStroke: CTRL+M}
- {action: compare, keyStroke: CTRL+N}
- {action: compare-two-files, keyStroke: CTRL+SHIFT+N}
- {action: compare-with-head, keyStroke: CTRL+H}
- {action: compare-with-previous, keyStroke: CTRL+P}
- {action: compare-with-revision, keyStroke: CTRL+SHIFT+P}
- {action: findAction, keyStroke: CTRL+SHIFT+F}
- {action: window-new, keyStroke: ALT+CTRL+SHIFT+N}
workingCopy:
- {action: changeset-move-to-other, keyStroke: CTRL+M}
- {action: compare, keyStroke: CTRL+N}
- {action: compare-two-files, keyStroke: CTRL+SHIFT+N}
- {action: compare-with-head, keyStroke: CTRL+H}
- {action: compare-with-previous, keyStroke: CTRL+P}
- {action: compare-with-revision, keyStroke: CTRL+SHIFT+P}
- {action: findAction, keyStroke: CTRL+SHIFT+F}
- {action: window-new, keyStroke: ALT+CTRL+SHIFT+N}