113 lines
3.7 KiB
Lua
113 lines
3.7 KiB
Lua
function wrapSelectedText(wrapCharacters)
|
|
-- Preserve the current contents of the system clipboard
|
|
local originalClipboardContents = hs.pasteboard.getContents()
|
|
|
|
-- Copy the currently-selected text to the system clipboard
|
|
keyUpDown('cmd', 'c')
|
|
|
|
-- Allow some time for the command+c keystroke to fire asynchronously before
|
|
-- we try to read from the clipboard
|
|
hs.timer.doAfter(0.2, function()
|
|
-- Construct the formatted output and paste it over top of the
|
|
-- currently-selected text
|
|
local selectedText = hs.pasteboard.getContents()
|
|
local wrappedText = wrapCharacters .. selectedText .. wrapCharacters
|
|
hs.pasteboard.setContents(wrappedText)
|
|
keyUpDown('cmd', 'v')
|
|
|
|
-- Allow some time for the command+v keystroke to fire asynchronously before
|
|
-- we restore the original clipboard
|
|
hs.timer.doAfter(0.2, function()
|
|
hs.pasteboard.setContents(originalClipboardContents)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
function inlineLink()
|
|
-- Fetch URL from the system clipboard
|
|
local linkUrl = hs.pasteboard.getContents()
|
|
|
|
-- Copy the currently-selected text to use as the link text
|
|
keyUpDown('cmd', 'c')
|
|
|
|
-- Allow some time for the command+c keystroke to fire asynchronously before
|
|
-- we try to read from the clipboard
|
|
hs.timer.doAfter(0.2, function()
|
|
-- Construct the formatted output and paste it over top of the
|
|
-- currently-selected text
|
|
local linkText = hs.pasteboard.getContents()
|
|
local markdown = '[' .. linkText .. '](' .. linkUrl .. ')'
|
|
hs.pasteboard.setContents(markdown)
|
|
keyUpDown('cmd', 'v')
|
|
|
|
-- Allow some time for the command+v keystroke to fire asynchronously before
|
|
-- we restore the original clipboard
|
|
hs.timer.doAfter(0.2, function()
|
|
hs.pasteboard.setContents(linkUrl)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Define Markdown Mode
|
|
--
|
|
-- Markdown Mode allows you to perform common Markdown-formatting tasks anywhere
|
|
-- that you're editing text. Use Control+m to turn on Markdown mode. Then, use
|
|
-- any shortcut below to perform a formatting action. For example, to format the
|
|
-- selected text as bold in Markdown, hit Control+m, and then b.
|
|
--
|
|
-- b => wrap the selected text in double asterisks ("b" for "bold")
|
|
-- c => wrap the selected text in backticks ("c" for "code")
|
|
-- i => wrap the selected text in single asterisks ("i" for "italic")
|
|
-- s => wrap the selected text in double tildes ("s" for "strikethrough")
|
|
-- l => convert the currently-selected text to an inline link, using a URL
|
|
-- from the clipboard ("l" for "link")
|
|
--------------------------------------------------------------------------------
|
|
|
|
markdownMode = hs.hotkey.modal.new({}, 'F20')
|
|
|
|
local message = require('keyboard.status-message')
|
|
markdownMode.statusMessage = message.new('Markdown Mode (control-m)')
|
|
markdownMode.entered = function()
|
|
markdownMode.statusMessage:show()
|
|
end
|
|
markdownMode.exited = function()
|
|
markdownMode.statusMessage:hide()
|
|
end
|
|
|
|
-- Bind the given key to call the given function and exit Markdown mode
|
|
function markdownMode.bindWithAutomaticExit(mode, key, fn)
|
|
mode:bind({}, key, function()
|
|
mode:exit()
|
|
fn()
|
|
end)
|
|
end
|
|
|
|
markdownMode:bindWithAutomaticExit('b', function()
|
|
wrapSelectedText('**')
|
|
end)
|
|
|
|
markdownMode:bindWithAutomaticExit('i', function()
|
|
wrapSelectedText('*')
|
|
end)
|
|
|
|
markdownMode:bindWithAutomaticExit('s', function()
|
|
wrapSelectedText('~~')
|
|
end)
|
|
|
|
markdownMode:bindWithAutomaticExit('l', function()
|
|
inlineLink()
|
|
end)
|
|
|
|
markdownMode:bindWithAutomaticExit('c', function()
|
|
wrapSelectedText('`')
|
|
end)
|
|
|
|
-- Use Control+m to toggle Markdown Mode
|
|
hs.hotkey.bind({'ctrl'}, 'm', function()
|
|
markdownMode:enter()
|
|
end)
|
|
markdownMode:bind({'ctrl'}, 'm', function()
|
|
markdownMode:exit()
|
|
end)
|