Why?
I wrote a lot. And in my writings I use timestamps, dates, times, time-ranges.
I use following datetime formats
- 2020-11-01
- 15-18
- 14:58
For them I used custom bash scripts which were copying to clipboard the date formats I wanted. These scripts were manually added to Linux's custom shortcuts.
Example of bash script:
#!/bin/sh
alias setclip='xclip -selection c'
alias getclip='xclip -selection clipboard -o'
printf $(date +"%Y-%m-%d") | setclip
Initially, I was really happy but after some time number of custom scripts increased. I had difficulties with remembering them.
How?
I stumbled to Ulauncher and it is downed on me that I could create extension for these timedate scripts.
For people who don't know, Ulauncher is application launcher to which many developers write many extensions.
Some examples:
- emoji extension
- process murderer
- google translate
- spotify player
Here is the tutorial link for extension development.
About my extension
Ulauncher requires that extension must have manifest.json file to operate.
Example of manifest.json
{
  "required_api_version": "^2.0.0",
  "name": "Timestamp macros",
  "description": "Copy to clipboard the most used timedate formats",
  "developer_name": "Nurgazy Nazhimidinov",
  "icon": "images/icon.png",
  "options": {
    "query_debounce": 0.05
  },
  "preferences": [
    {
      "id": "time_kw",
      "type": "keyword",
      "name": "Timemacros",
      "default_value": "tm"
    }
  ]
}
It says that if you write keyword Timemacros, extension will be on launcher(WARNING not clicked).
if you write Timemacros and click
or
write tm and SPACE, then KeywordQueryEventListener(EventListener) will invoked.
Here is the code:
class DemoExtension(Extension):
    def __init__(self):
        super(DemoExtension, self).__init__()
        self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
class KeywordQueryEventListener(EventListener):
    def on_event(self, event, extension):
        items = []
        logger.info('preferences %s' % json.dumps(extension.preferences))
        logger.info(event.get_keyword()) # gives the keyword 'tm'
        items.append(ExtensionResultItem(icon='images/icon.png',
                                         name='YYYY-MM-DD',
                                         description='{0:%Y-%m-%d}'.format(datetime.datetime.now()),
                                         on_enter=CopyToClipboardAction('{0:%Y-%m-%d}'.format(datetime.datetime.now()))))
        items.append(ExtensionResultItem(icon='images/icon.png',
                                         name='HH:mm',
                                         description='{0:%H:%M}'.format(datetime.datetime.now()),
                                         on_enter=CopyToClipboardAction(
                                             '{0:%H:%M}'.format(datetime.datetime.now()))))
        items.append(ExtensionResultItem(icon='images/icon.png',
                                         name='YYYY-MM-DD HH:mm',
                                         description='{0:%Y-%m-%d %H:%M}'.format(datetime.datetime.now()),
                                         on_enter=CopyToClipboardAction(
                                             '{0:%Y-%m-%d %H:%M}'.format(datetime.datetime.now()))))
        return RenderResultListAction(items)
if __name__ == '__main__':
    DemoExtension().run()
As you can see KeywordQueryEventListener(EventListener) and on_event is run and RenderResultListAction(items) is returned and presented to user.
Our items would be
- YYYY-MM-DD
- HH:mm
- YYYY-MM-DD HH:mm
Here is the screenshot of items:
Code for item:
items.append(ExtensionResultItem(icon='images/icon.png',
                                         name='YYYY-MM-DD',
                                         description='{0:%Y-%m-%d}'.format(datetime.datetime.now()),
                                         on_enter=CopyToClipboardAction('{0:%Y-%m-%d}'.format(datetime.datetime.now()))))
Explanation for ExtensionResultItem: 
name - title shown to user, look at screenshot above
description - subtext which is also shown to user, look at screenshot above
on_enter - most important part, says what to do if user clicks on this items. In my case, it is CopyToClipboardAction action which copies data to clipboard.
Summary
At the end, I developed extension with enabled me to discard my custom bash scripts and forget about keyboard shortcuts for them.
Deprecated bash scripts 😄
From personal blog: https://www.nurgasemetey.com/2020/extension-ulauncher/
 





 
    
Top comments (0)